[Vim]vim的几种模式和按键映射

Map是Vim强大的一个重要原因,可以自定义各种快捷键,用起来自然得心应手。
vim里最基本的map用法也就是

:map c a

这里把c映射成了a,在map生效的情况下,按下c就等同于按下了a
当然,常用的Ctrl,Shift,Alt自然也是支持的。

  • 令Ctrl+a对应到a
:map  a
令Alt+a对应到a
:map  a
令Ctrl+Alt+a对应到a
:map  a

到此,我们已经可以做很多事情了。
但是map命令远不只这一种,在不同的模式下,同一组按键可以被映射到不同的组合上。
Vim的模式众多,但是一般被提及的也就是这么几种:

  1. Normal Mode

也就是最一般的普通模式,默认进入vim之后,处于这种模式。

Visual Mode

一般译作可视模式,在这种模式下选定一些字符、行、多列。
在普通模式下,可以按v进入。

Insert Mode

插入模式,其实就是指处在编辑输入的状态。普通模式下,可以按i进入。

Select Mode

在gvim下常用的模式,可以叫作选择模式吧。用鼠标拖选区域的时候,就进入了选择模式。
和可视模式不同的是,在这个模式下,选择完了高亮区域后,敲任何按键就直接输入并替换选择的文本了。
和windows下的编辑器选定编辑的效果一致。普通模式下,可以按gh进入。

Command-Line/Ex Mode

就叫命令行模式和Ex模式吧。两者略有不同,普通模式下按冒号(:)进入Command-Line模式,可以输入各种命令,
使用vim的各种强大功能。普通模式下按Q进入Ex模式,其实就是多行的Command-Line模式。

对于Map,有几个基本的概念

  • 命令的组合

同Vim下的其他命令一样,命令的名字往往由好几段组成。前缀作为命令本身的修饰符,微调命令的效果。
对于map而言,可能有这么几种前缀

  1. nore

表示非递归,见下面的介绍

n

表示在普通模式下生效

v

表示在可视模式下生效

i

表示在插入模式下生效

c

表示在命令行模式下生效

Recursive Mapping

递归的映射。其实很好理解,也就是如果键a被映射成了b,c又被映射成了a,如果映射是递归的,那么c就被映射成了b。

:map a b
:map c a

对于c效果等同于

:map c b

默认的map就是递归的。如果遇到[nore]这种前缀,比如:noremap,就表示这种map是非递归的。

unmap

unmap后面跟着一个按键组合,表示删除这个映射。

:unmap c

那么在map生效模式下,c不再被映射到a上。

同样,unmap可以加各种前缀,表示影响到的模式。

mapclear

mapclear直接清除相关模式下的所有映射。
同样,mapclear可以加各种前缀,表示影响到的模式。

这里列出常用的一些map命令,默认map命令影响到普通模式和可视模式。

:map :noremap :unmap :mapclear
:nmap :nnoremap :nunmap :nmapclear
:vmap :vnoremap :vunmap :vmapclear
:imap :inoremap :iunmap :imapclear
:cmap :cnoremap :cunmap :cmapclear

可以试试这些命令

  1. 命令行模式下建一个mapping
     nmap b a 
  2. 现在普通模式下,按b,可以进入插入模式,随便输入一些字符
  3. 命令行模式下建一个mapping
     vmap b d 
  4. 现在普通模式下,按V,进入了可视模式,并且选定了一整行,按下b,可以删除整行
  5. 命令行模式下建一个mapping
     imap b a 
  6. 现在试着给正在编辑的这个文件输入一个字符”b”吧 :p
  7. 命令行模式下建一个mapping
     cmap b c 
  8. 命令行模式下, 按下b,会出来一个a

好了,到此vim的按键已经被你弄得乱七八糟了,试着用unmap和mapclear清除这些mapping吧。:]

noremap是不会递归的映射 (大概是no recursion)
例如
noremap Y y
noremap y Y
不会出现问题

前缀代表生效范围
inoremap就只在插入(insert)模式下生效
vnoremap只在visual模式下生效
nnoremap就在normal模式下(狂按esc后的模式)生效
这样可以减少快捷键所用到的键位组合的个数
一个组合可以有多种用途 就不用费劲心思思考 该映射哪个没被绑定过的键了

在各种模式下快捷键映射的精准定义是非常重要的。

在对vim的各种插件添加和功能自定义期间映射快捷键不可避免,总不能在要实现一个简单的功能的时候都要按<esc>回到normal模式然后敲命令 :call function('a','b','c') 。这样该有多麻烦呀,组合快捷键不但可以省时省力,随着插件的增加命令变得越来越臃肿,在这种情况下快捷键也不至于不够用。

但是在insert模式下的时候,按<F5>键,是想插入'<F5>'这个词组呢,还是想运行normal模式下对应F5映射的命令,如果不定义的话会有歧义。花一点经历映射好符合自己使用习惯的快捷键,那么多map全是为了方便你的使用提高工作效率的。

简略回答一下:

map a b -> 表示按 a 等于按 b。

vmap -> (还有 nmap imap)前首字母表示不同的模式(分别对应虚拟模式,普通模式,插入模式)。

vnoremap c a -> nore表示非递归 。比如我们之前设置按 a 等于按 b, 假设我们设置按 c 等于按 a 。则我们按下 c 相当于按了 b。如果是 nore 的映射,按下 c 只等于按 a。 至于前面的 v,跟第二条一样表示不同的模式。


remap 等于 recursively map 递归映射

:map j gg   // gg被映射微j键
:map Q j  // j又被递归映射微Q键,也就是 gg被映射为Q键
:noremap w j  //j被映射为w键,但是gg没有被映射为w键  因为前面又nore 也就是no-recursively非递归

:help map
:help noremap
:help nnoremap




  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值