常用操作:
1,复制到剪贴板
:reg命令可以查看vim寄存器 “+ 是全局的!
shifft"+y 复制选中的到+寄存器
shifft"+p 粘贴到鼠标所在位置
2,替换命令
set ff=unix/dos可以上文本以响应的格式显示
%s/<^M>/<>/g 替换工具 "CTRL_V CTRL_M"输入^M,而不是字面意思
3,删除buffer
bd 命令
4 ,在非编辑模式下<reg>x剪切
5, 在非编辑模式下shift+3高亮选中的单词
# * 向下搜索所在单词
6, 加标记:m命令marks 列出所有标记 `<a-z>跳转到该标签
vim自动设置的的一些标记
' 跳转前的位置
" 最后编辑的位置
[ 最后修改的位置的开头
] 最后修改的位置的结尾
7,光标控制
选项 作用
H 将光标移动到屏幕的顶行
nH 将光标移动到屏幕顶行下的第 n 行
M 将光标移动到屏幕的中间
L 将光标移动到屏幕的底行
nL 将光标移动到屏幕底行上的第 n 行
^e(ctrl+e) 将屏幕上滚一行
ctrl+y 将屏幕下滚一行
ctrl+u 将屏幕上滚半页
ctrl+d 将屏幕下滚半页
ctrl+b 将屏幕上滚一页
ctrl+f 将屏幕下滚一页
ctrl+l 重绘屏幕
z-return 将当前行置为屏幕的顶行
nz-return 将当前行下的第 n 行置为屏幕的顶行
z. 将当前行置为屏幕的中央
nz. 将当前行上的第 n 行置为屏幕的中央
z- 将当前行置为屏幕的底行
nz- 将当前行上的第 n 行置为屏幕的底行
10,列操作模式
1、注释:ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如"//",再按Esc,就会全部注释了。
2、删除:先按v,进入visual模式,横向选中列的个数(如"//"注释符号,需要选中两列),再按Esc,再按ctrl+v 进入列编辑模式,向下或向上移动光>标,选中注释部分,然后按d, 就会删除注释符号。
3、使用替换命令::%s/^/\/\//g来在全部内容的行首添加//号注释:2,50s/^/\/\//g在2~50行首添加//号注释反过来替换既是删除操作。
9,自定义快捷方案:
F2 | 打开关闭SRCexpl |
F3 | 打开关闭nerd_tree |
F4 | 打开关闭Taglist |
F5 | 打开关闭Trinity |
F6 | SRCexpl PreDefKey |
F7 | SRCexpl_NexDefKey |
F8 | CTage创建当前索引 CTRL+F8 递归创建索引 |
F9 | 编译 |
F10 |
|
F11 |
|
F12 |
|
CTRL+S | 保存 |
CTRL+v | 列模式 |
CTRL+C | 在v模式下复制 “Y |
TAB | 在非编辑模式下向后缩进TAB |
SHIFT+TAB | 在非编辑模式下向前缩进TAB |
CTRL+RETURN | :bnext |
CTRL+SHIFT+RETURN | :Bprevious |
|
|
8 ,在Putty中使用VIM 将下面的代码添加到 .bashrc /.profile文件中
# 关闭 Ctrl+ s 的 XOFF 功能(XON 是 Ctrl + q)
stty ixany
stty ixoff -ixon
stty stop undef
stty start undef
修改.vimrc
map<C-s> :w!<CR>
imap<C-s> <ESC>:w!<CR>
设置终端颜色
:hi normal ctermfg=black
term 黑白终端的属性
cterm 彩色终端的属性
ctermfg 彩色终端的前景色
ctermbg 彩色终端的背景色
gui GUI 版本属性
guifg GUI 版本的前景色
guibg GUI 版本的背景色
例如,要用绿色显示注释:
:highlight Comment ctermfg=green guifg=green
VIM命令大全
光标控制命令
命令 光标移动
h 向左移一个字符
j 向下移一行
k 向上移一行
l 向右移一个字符
G 移到文件的最后一行
w 移到下一个字的开头
W 移到下一个字的开头,忽略标点符号
b 移到前一个字的开头
B 移到前一个字的开头,忽略标点符号
L 移到屏幕的最后一行
M 移到屏幕的中间一行
H 移到屏幕的第一行
e 移到下一个字的结尾
E 移到下一个字的结尾,忽略标点符号
( 移到句子的开头
) 移到句子的结尾
{ 移到段落的开头
} 移到下一个段落的开头
0(数字),| 移到当前行的第一列
^ 移到当前行的第一个非空字符
$ 移到当前行的最后一个字符
+,Enter 移到下一行的第一个字符
- 移到前一行的第一个非空字符
在 vi 中添加文本
命令 插入动作
a 在光标后插入文本
A 在当前行插入文本
i 在光标前插入文本
I 在当前行前插入文本
o 在当前行的下边插入新行
O 在当前行的上边插入新行
s 删除光标所在处字符,并进入插入模式
S 删除光标所在的行,并进入插入模式
:rfile 读入文件 file 内容,并插在当前行后
:nrfile 读入文件 file 内容,并插在第 n 行后
Esc 回到命令模式
^vchar 插入时忽略 char 的指定意义,这是为了插入特殊字符
在 vi 中删除文本
命令 删除操作
x 删除光标处的字符
dw 删至下一个字的开头
dG 删除行,直到文件结束
dd 删除整行
db 删除光标前面的字
:n,md 从第 m 行开始往前删除 n 行
d,d$ 从光标处删除到行尾
^h,backspace 插入时,删除前面的字符
^w 插入时,删除前面的字
修改 vi 文本
每个命令前面的数字表示该命令重复的次数
命令 替换操作
rchar 用 char 替换当前字符
Rtext escape 用 text 替换当前字符直到按下 Esc键
stextescape 用 text 代替当前字符
S 或cctext escape 用 text 代替整行
cwtextescape 将当前字改为 text
Ctextescape 将当前行余下的改为 text
cGescape 修改至文件的末尾
ccursor_cmdtext escape 从当前位置处到光标命令位置处都改为 text
在 vi 中查找与替换
命令 查找与替换操作
/text 在文件中向前查找 text
?text 在文件中向后查找 text
n 在同一方向重复查找
N 在相反方向重复查找
ftext 在当前行向前查找 text
Ftext 在当前行向后查找 text
ttext 在当前行向前查找 text,并将光标定位在 text 的第一个字符
Ttext 在当前行向后查找 text,并将光标定位在 text 的第一个字符
:setic 查找时忽略大小写
:setnoic 查找时对大小写敏感
:ranges/pat1/pat2/g 用 newtext 替换 oldtext
:m,ns/oldtext/newtext 在 m 行通过 n,用 newtext 替换 oldtext
& 重复最后的 :s 命令
:g/text1/s/text2/text3 查找包含 text1 的行,用 text3 替换 text2
:g/text/command 在所有包含 text 的行运行 command 所表示的命令
:v/text/command 在所有不包含 text 的行运行 command 所表示的命令
在 vi 中复制文本
命令 复制操作
yy 将当前行的内容放入临时缓冲区
nyy 将 n 行的内容放入临时缓冲区
p 将临时缓冲区中的文本放入光标后
P 将临时缓冲区中的文本放入光标前
"(a-z)nyy 复制 n 行放入名字为圆括号内的可命名缓冲区,省略 n 表示当前行
"(a-z)ndd 删除 n 行放入名字为圆括号内的可命名缓冲区,省略 n 表示当前行
"(a-z)p 将名字为圆括号的可命名缓冲区的内容放入当前行后
"(a-z)P 将名字为圆括号的可命名缓冲区的内容放入当前行前
在 vi 中撤消与重复
命令 撤消操作
u 撤消最后一次修改
U 撤消当前行的所有修改
. 重复最后一次修改
, 以相反的方向重复前面的f、F、t 或 T 查找命令
; 重复前面的 f、F、t 或 T 查找命令
"np 取回最后第 n 次的删除(缓冲区中存有一定次数的删除内容,一般为9)
n 重复前面的 / 或 ? 查找命令
N 以相反方向重复前面的 / 或 ? 命令
保存文本和退出 vi
命令 保存和/或退出操作
:w 保存文件但不退出 vi
:wfile 将修改保存在 file 中但不退出 vi
:wq或 ZZ 或 :x 保存文件并退出 vi
:q! 不保存文件,退出 vi
:e! 放弃所有修改,从上次保存文件开始再编辑
vi 中的选项
选项 作用
:setall 打印所有选项
:setnooption 关闭 option 选项
:setnu 每行前打印行号
:setshowmode 显示是输入模式还是替换模式
:setautoindent 继承前一行的缩进方式,特别适用于多行注释
:setsmartindent 为C程序提供自动缩进
:set list 显示制表符(^I)和行尾符号
:setts=8 为文本输入设置 tab stops
:setwindow=n 设置文本窗口显示 n 行
:setnumber 显示行数
:setnonumber 取消显示行数
vi 的状态
选项 作用
:.= 打印当前行的行号
:= 打印文件中的行数
ctrl+g 显示文件名、当前的行号、文件的总行数和文件位置的百分比
:l 使用字母"l" 来显示许多的特殊字符,如制表符和换行符
在文本中定位段落和放置标记
选项 作用
{ 在第一列插入 { 来定义一个段落
[[ 回到段落的开头处
]] 向前移到下一个段落的开头处
m(a-z) 用一个字母来标记当前位置,如用 mz 表示标记 z
'(a-z) 将光标移动到指定的标记,如用 'z 表示移动到 z
在 vi 中连接行
选项 作用
J 将下一行连接到当前行的末尾
nJ 连接后面 n 行
光标放置与屏幕调整
选项 作用
H 将光标移动到屏幕的顶行
nH 将光标移动到屏幕顶行下的第 n 行
M 将光标移动到屏幕的中间
L 将光标移动到屏幕的底行
nL 将光标移动到屏幕底行上的第 n 行
^e(ctrl+e) 将屏幕上滚一行
ctrl+y 将屏幕下滚一行
ctrl+u 将屏幕上滚半页
ctrl+d 将屏幕下滚半页
ctrl+b 将屏幕上滚一页
ctrl+f 将屏幕下滚一页
ctrl+l 重绘屏幕
z-return 将当前行置为屏幕的顶行
nz-return 将当前行下的第 n 行置为屏幕的顶行
z. 将当前行置为屏幕的中央
nz. 将当前行上的第 n 行置为屏幕的中央
z- 将当前行置为屏幕的底行
nz- 将当前行上的第 n 行置为屏幕的底行
vi 中的 shell 转义命令
选项 作用
:!command 执行 shell 的 command 命令,如 :!ls
:!! 执行前一个 shell 命令
:r!command 读取 command 命令的输入并插入,如 :r!ls 会先执行 ls,然后读入内容
:w!command 将当前已编辑文件作为 command 命令的标准输入并执行 command 命令,如:w!grep all
:cddirectory 将当前工作目录更改为 directory 所表示的目录
:sh 将启动一个子shell,使用 ^d(ctrl+d) 返回 vi
:sofile 在 shell 程序 file 中读入和执行命令
vi 中的宏与缩写
(避免使用控制键和符号,不要使用字符K、V、g、q、v、*、= 和功能键)
选项 作用
:map key command_seq定义一个键来运行 command_seq,如 :map e ea,无论什么时候都可以 e 移到一个字的末尾来追加文本
:map 在状态行显示所有已定义的宏
:umapkey 删除该键的宏
:abstring1 string2 定义一个缩写,使得当插入 string1 时,用 string2替换 string1。当要插入文本时,键入 string1 然后按 Esc 键,系统就插入了string2
:ab 显示所有缩写
:unastring 取消 string 的缩写
在 vi 中缩进文本
选项 作用
ctrl+i或tab 插入文本时,插入移动的宽度,移动宽度是事先定义好的
:setai 打开自动缩进
:setsw=n 将移动宽度设置为 n 个字符
n> 使 n 行都向右移动一个宽度,例如 3>> 就将接下来的三行每行都向右移动一个移动宽度
功能激活
一切从一个简单的命令开始:
:syntax enable
大多数情况下,这会让你的文件带上颜色。Vim 会自动检测文件的类型,并调用合适的
语法加亮。一下子注释变成蓝色,关键字变成褐色,而字符串变成红色了。这使你可以
很容易浏览整个文档。很快你就会发现,黑白的文本真的会降低你的效率!
如果你希望总能看到语法加亮,把 “syntax enable” 命令加入到 |vimrc| 文件中。
如果你想语法加亮只在支持色彩的终端中生效,你可以在 |vimrc| 文件中这样写:
if &t_Co > 1
syntax enable
endif
如果你只想在 GUI 版本中有效,可以把 “:syntax enable” 放到你的 |gvimrc| 文件中。
——————————————————————————–
*06.2* 颜色显示不出来或者显示出错误的颜色怎么办?
有很多因素会让你看不到颜色:
- 你的终端不支持彩色。
这种情况下,Vim 会用粗体,斜体和下划线区分不同文字,但这不好看。你可能
会希望找一个支持彩色的终端。对于 Unix,我推荐 XFree86项目的 xterm:
|xfree-xterm|。
- 你的终端其实支持颜色,可是Vim 不知道
确保你的 $TERM 设置正确。例如,当你使用一个支持彩色的 xterm 终端:
setenv TERM xterm-color
或者(基于你用的控制台终端)
TERM=xterm-color; export TREM
终端名必须与你使用的终端一致。如果这还是不行,参考一下 |xterm-color|,
那里介绍了一些使 Vim 显示彩色的方法(不仅是 xterm )。
- 文件类型无法识别
Vim 不可能识别所有文件,而且有时很难说一个文件是什么类型的。试一下这个
命令:
:set filetype
.
如果结果是 “filetype=”,那么问题就是出在文件类型上了。你可以手工指定
文件类型:
:set filetype=fortran
要知道那些类型是有效的,查看一下 $VIMRUNTIME/syntax 目录。对于 GUI 版本,
你还可以使用 Syntax 菜单。设置文件类型也可以通过 |modeline|,这样,
在你每次编辑它的时候都执行语法加亮。例如,下面这一行可以用
于 Makefile(把它放在接近文首和文末的地方)
# vim: syntax=make
你可能知道怎么检测自己的文件类型,通常是文件的扩展名(就是点后面的
内容)参见 |new-filetype| 可以知道如何告诉 Vim 如何检查一种文件类型。
- 你的文件类型没有语法高亮定义
你可以找一个相似的文件类型并人工设置为那种类型。如果你觉得不好,你可以
自己写一个,参见 |mysyntaxfile|。
或者颜色是错的:
- 彩色的文字难以辨认
Vim 自动猜测你使用的背景色。如果是黑的(或者其它深色的色彩),它会
用浅色作为前景色。如果是白的(或者其它浅色),它会使用深色作为前景
色。如果 Vim 猜错了,文字就很难认了。要解决这个问题,设置一下
‘background’ 选项。对于深色:
:set background=dark
而对于浅色:
:set background=light
这两个命令必须在 “:syntax enable” 命令前调用,否则不起作用。如果要在
这之后设置背景,可以再调用一下 “:syntax reset”。
- 在自下往上滚屏的过程中颜色显示不对。
Vim 在分析文本的时候不对整个文件进行处理,它只分析你要显示的部分。这
样能省不少时间,但也会因此带来错误。一个简单的修正方法是敲 CTRL-L。
或者往回滚动一下再回来。要彻底解决这个问题,请参见 |:syn-sync|。有些
语法定义文件有办法自己找到前面的内容,这可以参见相应的语法定义文件。
例如,|tex.vim| 中可以查到 Tex 语法定义。
——————————————————————————–
*06.3* 使用不同颜色 *:syn-default-override*
如果你不喜欢默认的颜色方案,你可以选另一个配色方案。在 GUI 版本中可以使用
Edit/Color 菜单。你也可以使用这个命令:
:colorscheme evening
“evening” 是配色方案的名称。还有几种备选方案可以试一下。在 $VIMRUNTIME/colors
中可以找到这些方案。
等你确定了一种喜欢配色方案,可以把 “:colorscheme” 命令加到你的 |vimrc| 文件中。
你可以自己编写配色方案,下方如下法面:
1. 选择一种接近你的理想的配色方案。把这个文件拷贝到你自己的 Vim 目录中。在 Unix
下,可以这样:
!mkdir ~/.vim/colors
!cp $VIMRUNTIME/colors/morning.vim~/.vim/colors/mine.vim
在 Vim 中完成的好处是可以利用 $VIMRUNTIME 变量。
2. 编辑这个配色方案,常用的有下面的这些条目:
term 黑白终端的属性
cterm 彩色终端的属性
ctermfg 彩色终端的前景色
ctermbg 彩色终端的背景色
gui GUI 版本属性
guifg GUI 版本的前景色
guibg GUI 版本的背景色
例如,要用绿色显示注释:
:highlight Comment ctermfg=green guifg=green
属性是 “bold”(粗体)和 “underline” (下划线)可以用于 “cterm” 和 “gui”。
如果你两个都想用,可以用”bond,underline”。要获得详细信息, 请参考
|:highlight| 命令。
VIM键盘映射 (Map)
设置键盘映射
使用:map命令,可以将键盘上的某个按键与Vim的命令绑定起来。例如使用以下命令,可以通过F5键将单词用花括号括起来:
:map<F5> i{e<Esc>a}<Esc>
其中:i{将插入字符{,然后使用Esc退回到命令状态;接着用e移到单词结尾,a}增加字符},最后退至命令状态。在执行以上命令之后,光标定位在一个单词上(例如amount),按下F5键,这时字符就会变成{amount}的形式。
不同模式下的键盘映射
使用下表中不同形式的map命令,可以针对特定的模式设置键盘映射:
Command 命令 | Normal 常规模式 | Visual 可视化模式 | Operator Pending 运算符模式 | Insert Only 插入模式 | Command Line 命令行模式 |
:map | y | y | y |
|
|
:nmap | y |
|
|
|
|
:vmap |
| y |
|
|
|
:omap |
|
| y |
|
|
:map! |
|
|
| y | y |
:imap |
|
|
| y |
|
:cmap |
|
|
|
| y |
键盘映射实例
使用以下命令,可以在Normal Mode和Visual/Select Mode下,利用Tab键和Shift-Tab键来缩进文本:
nmap<tab> V>
nmap<s-tab> V<
vmap<tab> >gv
vmap<s-tab> <gv
使用以下命令,指定F10键来新建标签页:
:map<F10> <Esc>:tabnew<CR>
其中:<Esc>代表Escape键;<CR>代表Enter键;而功能键则用<F10>表示。首先进入命令行模式,然后执行新建标签页的:tabnew命令,最后返回常规模式。
同理:对于组合键,可以用<C-Esc>代表Ctrl-Esc;使用<S-F1>表示Shift-F1。对于Mac用户,可以使用<D>代表Command键。
注意:Alt键可以使用<M-key>或<A-key>来表示。
关于键盘符号的详细说明,请使用:h key-notation命令查看帮助信息。
我们还可以针对函数设置键盘映射。 例如,将以下代码加入.vimrc文件,就可以利用快捷键,来打开或关闭针对搜索结果的高亮显示。
查看键盘映射
使用:map命令,可以列出所有键盘映射。其中第一列标明了映射在哪种模式下工作:
标记 模式
<space> 常规模式,可视化模式,运算符模式
n 常规模式
v 可视化模式
o 运算符模式
! 插入模式,命令行模式
i 插入模式
c 命令模式
使用:map!命令,则只列出插入和命令行模式的映射。而:imap,:vmap,:omap,:nmap命令则只是列出相应模式下的映射
有五种映射存在
-用于普通模式: 输入命令时。
-用于可视模式: 可视区域高亮并输入命令时。
-用于操作符等待模式: 操作符等待中 ("d","y","c" 等等之后)。
见下:|omap-info|。
-用于插入模式: 也用于替换模式。
?用于命令行模式: 输入 ":" 或 "/" 命令时。
下表是map绑定中,对应的模式代号。现在先了解一下,等看完之后再回过头看这个模式代号就会明白了。
字 符 模式 ~
<Space>普通、可视、选择和操作符等待
n普通
v可视和选择
s 选择(在可视模式下Ctrl+G进入)
x可视
o操作符等待
!插入和命令行
i插入
l插入、命令行和 Lang-Arg 模式的 ":lmap" 映射
c命令行
我主要讲解一下“n(普通模式)”下的两个绑定命令,等看完之后就对应的明白别的模式下的命令了。
适用于普通模式的映射命令主要有:
1.:map
[语法]:map {lhs} {rhs} |mapmode-nvo| *:map*
1.1作用模式: n、v、o (普通、可视和选择、操作符等待)
1.2命令格式:
:map{lhs} {rhs}
含义:在:map作用的模式中把键系列 {lhs} 映射为 {rhs},{rhs}可进行映射扫描,也就是可递归映射。
1.3举例:
:maptd :tabnew .<cr>
含义:在其作用模式(普通、可视、操作符)下,输入td等价于输入:tabnew . <cr>。而普通模式下输入:tabnew . <cr>就是打开当前目录
如果再定义绑定:map ts td,就是指在其作用模式下输入ts等价于td,也就是打开当前目录。不过如果没有特殊需要,一般不建议递归映射。
2.:noremap
:moremap和:map命令相对,作用模式和命令格式都相同,只不过不允许再对{rhs}进行映射扫描,也就是{lhs}定义后的映射就是{rhs}的键序列,不会再对{rhs}键序列重新解释扫描。它一般用于重定义一个命令,当然如果:map不需要递归映射的话,建议试用:noremap
比如:
:noremapts td
它的意思是在其作用模式下,输入ts就是输入td,但是和:map不同的是,此时td再不会做进一步扫描解释。虽然之前已经定义了td,但是不会对td再做扫描
3.:unmap
:unmap是对应取消:map绑定的{lhs},作用模式相同,命令格式:unmap {lhs}。
例如:
:unmaptd
就是取消在其作用模式中td的绑定,比如之前td被绑定为:tabnew.<cr>,此时此绑定消失。
4.:mapclear
:mapclear时对应取消所有:map绑定的,慎用!
5.:nmap
:nmap是:map的普通模式板,也就是说其绑定的键只作用于普通模式。
例如:
:nmaptd :tabnew .<cr> 和 :map td :tabnew .<cr> 在普通模式下等效
6.:nnoremap
:nnorempa和:nmap的关系和:noremap和:map的关系一样,只是:nmap的非递归版
7.:nunmap
:nunmap和:nmap的关系和:unmap和:map的关系一样,取消:nmap的绑定。
8.:nmapclear
:nmapclear是对应取消所有:map绑定的,慎用!
看完以上,应该可以发现一个规律,前4个是一组,后4个时一组,后一组比前一组多一个n就是指只作用于普通模式。其中每组内*nore*是其对应的非递归版、*un*是取消绑定某个<lhs>绑定、clear后缀是取消所有绑定。发现了这个规律,再翻到前面的模式代号表,你大体可以猜到vmap、xmap、smap、omap是什么意思了吧,以及相对应的nore版本、un版本、clear版本。
另外:
{rhs}之前可能显示一个特殊字符:
*表示它不可重映射
&表示仅脚本的局部映射可以被重映射
@表示缓冲区的局部映射
到这一步你可以轻松的长吸一口气,因为相关的命令已经都了解了,记不住没关系,可以随时:helpmap一下。不过别急,后面还有map更多的选项等着去攻克。
键表|key-notation|
<k0>- <k9> 小键盘 0 到 9 *keypad-0* *keypad-9*
<S-...>Shift+键 *shift* *<S-*
<C-...>Control+键 *control* *ctrl* *<C-*
<M-...>Alt+键 或 meta+键 *meta* *alt* *<M-*
<A-...>同 <m-...> *<A-*
<t_xx>termcap 里的 "xx" 入口键
特殊参数:
1.<buffer>
2.<silent>
3.<special>
4.<script>
5.<expr>
6.<unique>
它们必须映射命令的后边,在其他任何参数的前面。
<buffer>如果这些映射命令的第一个参数是<buffer>,映射将只局限于当前缓冲区(也就是你此时正编辑的文件)内。比如:
:map<buffer> ,w /a<CR>
它的意思时在当前缓冲区里定义键绑定,“,w”将在当前缓冲区里查找字符a。同样你可以在其他缓冲区里定义:
:map<buffer> ,w /b<CR>
比如我经常打开多个标签(:tabedit),想要在各自标签里定义",w"键绑定,那么你只要在每个标签页里分别定义就可,其作用域也只在各自的标签里。同样要清除这些缓冲区的键绑定也要加上<buffer>参数,比如:
:unmap<buffer> ,w
:mapclear<buffer>
<silent>是指执行键绑定时不在命令行上回显,比如:
:map<silent> ,w /abcd<CR>
你在输入,w查找abcd时,命令行上不会显示/abcd,如果没有<silent>参数就会显示出来
<special>一般用于定义特殊键怕有副作用的场合。比如:
:map<special> <F12> /Header<CR>
<unique>一般用于定义新的键映射或者缩写命令的同时检查是否该键已经被映射,如果该映射或者缩写已经存在,则该命令会失败
<expr>.如果定义新映射的第一个参数是<expr>,那么参数会作为表达式来进行计算,结果使用实际使用的<rhs>,例如:
:inoremap<expr> . InsertDot()
这可以用来检查光标之前的文本并在一定条件下启动全能(omni) 补全。
一个例子:
letcounter = 0
inoremap<expr> <C-L> ListItem()
inoremap<expr> <C-R> ListReset()
funcListItem()
letg:counter += 1
returng:counter . '. '
endfunc
funcListReset()
letg:counter = 0
return''
endfunc
在插入模式下,CTRL-L插入顺序的列表编号,并返回;CTRL-R复位列表编号到0,并返回空。
<Leader>mapleader
mapleader变量对所有map映射命令起效,它的作用是将参数<leader>替换成mapleader变量的值,比如:
:map<Leader>A oanother line<Esc>
如果mapleader变量没有设置,则用默认的反斜杠代替,因此这个映射等效于:
:map\A oanother line<Esc>
意思时输入\A键时,在下一行输入anotherline并返回到普通模式。
如果设置了mapleader变量,比如:
letmapleader = ","
那么就等效于:
:map,A oanother line<Esc>
<LocalLeader>maplocalleader
<LocalLeader>和<Leader>类似,只不过它只作用于缓冲区。
因此在设置mapleader和maplocalleader时最好区分开,不要出现冲突。