目的:在ubuntu上用vim编写html,并且在vim中可以用快捷键在浏览器firefox中打开.html文件直接观察效果。
实现这个功能其实非常简单 但涉及到的知识每一块都可以展开很大篇幅 官方文档对每部分都给出详细的解释 利用这些知识可以实现远远大于本篇文章目的的功能
这些知识十分有趣 而且闲暇时间利用这些知识自己写vim插件、搭建vim编程环境、将一个友好的编程工具打造成效率武器、感受一个如同IDE般强大自带编程语言的编辑器,都是一件非常有趣、培养学习能力的事情。
本文章会根据后续需求(比如想自己做插件等等)继续补充。
本篇文章的本质目的是只是为了让作者看懂(用于记笔记),故存在部分内容省略、简写的情况。如果里面有你感兴趣的内容,欢迎讨论。
1. 打开.vimrc
2. 写入下述代码
noremap <F9>: call DisplayHTML()<CR>
"vim键盘映射+vimscript函数调用
function DisplayHTML()"vimscript函数定义
if &filetype == 'html'"vimscript条件判断
execute 'w'"vimscript执行表达式
execute '!firefox % &'
endif
endfunction
3. 上述代码详解都可以在下面的内容中找到
:edit $MYVIMRC
:编辑.vimrc文件~/.vimrc
下述非代表最后一行模式的指令的前导冒号都省略 将下述指令写到.vimrc文件中
:map ...
:定义普通模式映射 将按键x映射为…
操作符等待模式是当你键入一个操作符 (比如 “d” 或 “y”) 之后,Vim 期待你键入一个
动作命令或者文本对象时的状态。比如,当你键入命令 “dw”, 那个 “w” 就是在操作符 等待模式下键入的。
:map i{ea}
摁下F5
映射为 i
插入{
,退出插入模式,e
移到单词尾,a
追加插入}
,退出插入模式:map \p i(ea)
,先敲入\
再敲入p
,即可组成一个指令:map
:不带参数 查看当前映射表
n
:normal mode,v
:insert mode.
自动命令大多数都产生在最后一行模式下
:autocmd BufReadPost *.gsm set filetype=asm
BufReadPost
,表示该自动命令在一个文件被掉入缓冲区读写后被触发。而这样的文件只有.gsm文件才有效。成功触发后将执行set filetype=asm
Don’t give a shit on
modelines
autocmd! FileWritePre *
:批量删除由FileWritePre
事件trigger,且对所有文件都有效的命令:autocmd
:显示当前所有autocmd[group]
:可选项,分组,便于批量管理命令[nested]
execute
:执行最后一行模式下的指令,一般用在执行在normal模式下的指令难点1:vimscript中的regex匹配
let i = 3 "let不能少 否则无法赋值
while {
conditions}
...
endwhile
while i < 5
echo i
let i+=1
endwhile
for i in range(1,4)
...
endfor
"range({
start}, {
end}, [step])
for line in getline(1,20)"获取缓冲区内的1~20行
{
command}
endfor
if {
condition}
...
elseif {
condition}
...
else
...
endif
let i = 3
echo "Test" i
"显示 Test 3
echo 0x17
"显示 23
echon a
"不输出换行符
变量名都是全局变量 和其它vim脚本文件公用
:let 显示当前所有文件的全局变量
let s:variable_name = x
"定义一个仅当前文件可用的局部变量
:unlet variable_name 删除一个变量
a:variable_name 函数参数
vim将文件从磁盘内提取到缓冲区中,在缓冲区对文件进行读写,可以打开多个窗口,一个窗口可以是一个或多个缓冲区,多个窗口也可以是一个或多个缓冲区。读写完成后进行保存,将缓冲区内容写入文件
0x 0X 十六进制
0b 0B 二进制
0 八进制
let i="test"
" i=test
let i='"test"'
" i="test"
单引号使所有单引号内部的内容(包括 \t \n 等特殊字符)保持原样
$name:环境变量
$name:选项
@r:寄存器
选项?
a=~b "b是正则表达式 一般用单引号扩住 否则会被regex常见的单斜杠影响 若a包含与b匹配的串则返回1 否则返回0
a=!~b "与上述相反 即不匹配
exec(or execute) "command" "执行冒号模式下的指令
exec "normal command" "执行普通模式下的指令
let i="command"
exec i
function Min(a, b)
return a:a < a:b ?a:a :a:b
endfunction
"自定义函数名最好首字母大写 避免和预定义函数名混淆
"a:variable_name 表示该variable是个函数参数
function! Min(a,b)
"表示对函数重写
function Min(a,...) "可变参数 总计最多20个参数
echo a:000 "可变实参列表
echo a:0 "可变实参个数
echo a:i "第i个可变参数
call func()
let a=func()"获取返回值
:function "查看所有函数
:function func_name "查看func_name定义内容
:delfunction func_name "删除函数func_name
let lista=['a','b','c']
let listb=[]"empty list
call add(listb, 'd')"listb=['d']
call extend(listb, ['a', 'b'])"listb=['d', 'a', 'b']
"注意 这里add和extend的效果不同 如果上述extend语句换成add 会将扩展的新list
"看作原列表的一个新的元素
call add(listb, ['a', 'b'])"listb=['d', ['a', 'b']]
let list=lista+listb"列表连接
echo list[0]"列表第0个元素
for n in list"列表迭代
echo n
endfor
echo sort(list)
let dicta={
'1':'one', '2':'two'}
let dictb={
}
let dicta[3]='three'"增添与更改
"dicta={
'1':'one', '2':'two', 3:'three'}
echo dict['1']
"目的:在vim中运行vimscript检验成果
"source:运行一个文件
"前提:chmod 744 {
filename} 给予文件可执行的权限
map <F5> call ComplieRun()<CR>
" 将摁键<F5>映射到call一个函数然后敲击回车
func! ComplieRun()
if &filetype == 'vim' "判断当前的filetype
exec 'w| source %' "在最后一行中执行串行指令 先从buffer写入file再运行该文件
endif
:回车符
:空格
:ctrl-x%
:当前文件\
:可用于分割较长的命令(用在.vimrc中,不可用在command line中)!{command}
:调用外部应用程序执行相关操作chmod xxx test.vim
给脚本文件赋予执行权限,一般xxx = 744if "true"
'a'.'b'
:输出ab
,.是字符串链接运算符eval("variable_name")
获取变量或表达式variable_name
的值