请稍侯

vim 配置(二) -- map 类操作

04 April 2016

0. 简介

通过map可以配置vim一些快捷键操作,比如map <C-a> ggVG 来设置Ctrl+a 选择vim正在编辑的文件的所用内容。 在介绍map命令之前,先介绍一下vim的不同模式,在vim不同模式下都有对应的map操作。

1. VIM 模式

  1. Normal Mode: 普通模式,vim打开文件默认就是这种模式,从其他模式通过esc 切换到normal mode
  2. Visual Mode: 可视模式, vim在normal mode下通过按键v 进入可视模式,可视模式下可以选定多个字符,多行,多列等。
  3. Insert Mode: 插入模式,在插入模式下,可以进行文本的编辑,从Normal Mode 通过按键i 进入插入模式, 通过esc键返回Normal Mode
  4. Select Mode: 选择模式, 在选择模式下可以选择多行或者多个字符,此模式下选择某些文本之后,进行的任何键的输入都是直接替换选择的文本, 和windows下面用鼠标选择一部分文本进行替换是一个原理。 从Normal Mode 通过gh切换到选择模式。
  5. Command-Line/EX-Mode: 命令行模式和EX 模式, Normal Mode 下按: 进入命令行模式,可以进行一些命令操作,比如w, q, x, set paste等. Normal Mode 下按Q 进入EX模式,是多行的命令行模式。

如上介绍了vim的几种模式, 下面看下每种模式和map的关系

2. vim 各模式下的map

vim 通过map不同的前缀来表示此快捷键设置生效的模式。如nmap 表示nmap设置的快捷键是在Normal Mode下生效。

不同模式对应的map前缀不一样, 下面给出不同map前缀对应的vim模式

map前缀 生效模式 相关map命令
n 普通模式 nmap, nnoremap, nunmap, nmapclear
v 可视模式 和 选择模式 vmap, vnoremap, vunmap, vmapclear
x 可视模式 xmap,xnoremap, xunmap, xmapclear
s 选择模式 smap, snoremap, sunmap, smapclear
i 插入模式 imap, inoremap, iunmap, imapclear
c 命令行模式 cmap, cnoremap, cunmap, cmapclear
无前缀 普通模式和可视模式 map, noremap, unmap, mapclear

其中unmap是取消某些快捷键绑定, *clear是清除某些模式下的所有快捷键映射, nore是非递归映射.

3. 非递归映射

递归映射, 其实很好理解,也就是如果键a被映射成了b,c又被映射成了a,如果映射是递归的,那么c就被映射成了b. 默认map是递归的映射,通过前缀nore (no recursion)来实现非递归的映射, 如 nnoremap.

4. 特殊键列表

特殊按键|说明 —–|—— <k0> - <k9>| 小键盘 0 到 9 keypad-0 keypad-9 <S-...> | Shift+键 shift <S- <C-...> | Control+键 control ctrl <C- <M-...> | Alt+键 或 meta+键 meta alt <M- <A-...> | 同 *<A-* `` | Command+键 *control* *ctrl* *<C-*

<Esc>代表Escape键;<CR>代表Enter键;<D>代表Cond键。 Alt键可以使用<M-key><A-key>来表示。<C>代表Ctrl. 对于组合键,可以用<C-Esc>代表Ctrl-Esc;使用<S-F1>表示Shift-F1.

5. map特殊参数

特殊参数必须紧跟在映射命令(map, nmap等)的后边,在其他任何参数的前面。 有如下特殊参数

  1. <buffer>
  2. <silent>
  3. <special>
  4. <script>
  5. <expr>
  6. <unique>

后续继续研究特殊参数

6. 举个栗子

 "" Ctrl + a全选文本
map <C-a> ggVG 

 "" Normal Mode F7 打开或者关闭NERDTree插件
nnoremap <silent> <F7> :NERDTreeToggle<cr>

"" Normal Mode F8 打开或者关闭TList插件
nnoremap <silent> <F8> :TlistToggle<CR>

 "" Normal Mode gl 是跳转到上次修改的位置
nnoremap gl `. 

 "" 插入模式下mm进入Normal Mode
inoremap mm    <ESC>

 ""Normal Mode下,",dt" 在当前光标后面添加日期时间
nmap ,dt a<C-R>=strftime('%Y-%m-%d %H:%M:%S')<CR> 

 ""Insert Mode下,",dt" 在当前光标后面添加日期时间
imap ,dt <C-R>=strftime('%Y-%m-%d %H:%M:%S')<CR> 

参考