得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

vim map 介绍

vim 的模式,细分之下有 6 种分别为:

  1. Normal Mode(普通模式):默认进入 vim 之后处于这种模式
  2. Visual Mode(可视模式):在这种模式下选定一些字符、行、多列;普通模式下可以按 v 进入
  3. Insert Mode(插入模式):处在编辑输入的状态;普通模式下可以按 i 进入
  4. Select Mode(选择模式):用鼠标拖选区域的时候,就进入了选择模式,和可视模式不同的是,在这个模式下,选择完了高亮区域后,敲任何按键就直接输入并替换选择的文本了;普通模式下可以按 gh 进入
  5. Command-Line Mode(命令行模式):可以输入各种命令;普通模式下按冒号进入 Command-Line 模式
  6. Ex Mode(Ex 模式):普通模式下按 Q 进入 Ex 模式,就是多行的 Command-Line 模式

map 命令简介

map 是一个映射命令,将常用的很长的命令映射到一个新的功能键上,是 vim 强大的一个重要原因

vim 中有五种映射存在:

  1. 用于普通模式:输入命令时
  2. 用于可视模式:可视区域高亮并输入命令时
  3. 用于操作符等待模式:操作符等待中 (“d”,”y”,”c” 等等之后)
  4. 用于插入模式:也用于替换模式
  5. 用于命令行模式:输入 “:” 或 “/” 命令时

map 命令的组合

同 vim 下的其他命令一样,命令的名字往往由好几段组成;前缀作为命令本身的修饰符,微调命令的效果

对于 map 而言,可能有这么几种前缀:

  1. nore,表示非递归;递归的映射其实很好理解,例:如果键 a 被映射成了 b,c 又被映射成了 a,如果映射是递归的,那么 c 就被映射成了 b
  2. n,表示在普通模式下生效
  3. v,表示在可视模式下生效
  4. i,表示在插入模式下生效
  5. c,表示在命令行模式下生效

普通模式下使用 map 映射命令(与前缀叠加可以定义映射在不同模式下生效):

  1. map,命令格式::map {lhs} {rhs},其含义是,在 :map 作用的模式中把键系列 {lhs} 映射为 {rhs},{rhs} 可进行映射扫描,即可递归映射

    例如::map td :tabnew .<cr>,表示在其作用模式(普通、可视、操作符)下,输入 td 等价于输入 :tabnew .<cr>,而普通模式下输入 :tabnew . <cr> 是打开当前目录,如果再定义绑定 :map ts td,就是指在其作用模式下输入 ts 等价于 td,也就是打开当前目录

    如果没有特殊需要,一般不建议递归映射

  2. unmap,命令格式::unmap {lhs},unmap 是对应取消 map 绑定的{lhs},作用模式相同

    例如::unmap td 就是取消在其作用模式中 td 的绑定,比如之前 td 被绑定为 :tabnew .<cr>,此时此绑定消失

  3. mapclear,:mapclear 时对应取消所有 :map 绑定的

⚠️:{rhs} 之前可能显示一个特殊字符:* 表示它不可重映射;& 表示仅脚本的局部映射可以被重映射;@ 表示缓冲区的局部映射

键盘按键的表示:

  1. <k0> - <k9> 小键盘 0 到 9
  2. <S-…> Shift+键
  3. <C-…> Control+键
  4. <M-…> Alt+键 或 meta+键
  5. <A-…> 同 <M-…>
  6. <Esc> Escape 键
  7. <Up> 光标上移键
  8. <Space> 插入空格
  9. <Tab> 插入 Tab
  10. <CR> 等于 <Enter>

特殊参数

有些特殊参数必须映射命令的后边,在其他任何参数的前面

<buffer>

<buffer> 如果这些映射命令的第一个参数是 <buffer>,映射将只局限于当前缓冲区(也就是你此时正编辑的文件)内

比如::map <buffer> ,w /a<CR>,它的意思时在当前缓冲区里定义键绑定,“,w”将在当前缓冲区里查找字符 a,同样可以在其他缓冲区里定义,:map <buffer> ,w /b<CR>,同样要清除这些缓冲区的键绑定也要加上 <buffer> 参数,比如,:unmap <buffer> ,w :mapclear <buffer>

<silent>

<silent> 是指执行键绑定时不在命令行上回显

比如::map ,w /abcd,你在输入 ,w 查找 abcd 时,命令行上不会显示 /abcd,如果没有 <silent> 参数就会显示出来

<special>

<special> 一般用于定义特殊键怕有副作用的场合

比如::map <special> <F12> /Header<CR>

<expr>

如果定义新映射的第一个参数是 <expr>,那么参数会作为表达式来进行计算,结果使用实际使用的

例如::inoremap <expr> . InsertDot(),这可以用来检查光标之前的文本并在一定条件下启动全能 (omni) 补全

<unique>

<unique> 一般用于定义新的键映射或者缩写命令的同时检查是否该键已经被映射,如果该映射或者缩写已经存在,则该命令会失败

<leader> 和 mapleader 变量

mapleader 变量对所有 map 映射命令起效,它的作用是将参数 <leader> 替换成 mapleader 变量的值

比如::map <leader>A oanother line<esc>,如果 mapleader 变量没有设置,则用默认的反斜杠代替,因此这个映射等效于,:map \A oanother line,意思时输入 \A 键时,在下一行输入 another line 并返回到普通模式;如果设置了 mapleader 变量,比如,let mapleader = “,”,那么就等效于,:map ,A oanother line<esc>。

<localLeader> 和 maplocalleader 变量

<localLeader> 和 <leader> 类似,只不过它只作用于缓冲区,因此在设置 mapleader 和 maplocalleader 时最好区分开,不要出现冲突

be slow to promise and quick to perform.