VIM键位映射总结

vim收欢迎的很大一部分原因大概是因为它的高度自由,用户可以根据自己的习惯进行定制,打造一个专属于自己的vim。在这篇博客里谈谈vim中的键位映射。

在vim中快进键的使用很多,在各模式的切换也很多,但默认的快捷键并不是适合每个用户。比如说ESC键,可能大部分人都会认为ESC键离手的正常位置太远,而ESC恰恰是vim使用最为频繁的键之一,所以要想提高编程效率以及使用的舒适度,就不得不想想办法了。而最好的方法就是将ESC键映射到自己习惯舒适的位置。

vim的几种模式

首先要介绍一下vim中提及最多的几种模式:
Normal Mode
一般模式,进入vim的默认模式,一般从其他模式退出后都是到这个模式。
Insert Mode
插入模式,也就是在编辑的时候的模式,对于没有熟练使用vim的快捷键以及切换模式的初学者,很有可能一直处于insert mode。
Visual Mode
可视化模式,可以对代码进行多行,多列,块处理。
Command-line Mode
命令行模式,在normal Mode中按:调出,用于执行命令,启动插件之类的,比如最简单的:help。
Select Mode
和Visual Mode有相似之处,但有所不同,在Select Mode中选择内容后,可直接进行替换。

Map命令

map命令用于vim的键位映射,而在map之前加上前缀,会得到几种不同的命令,分别对不同的模式生效。
nore: 非递归,意思是将a 映射为b,b映射为c,输入a的时候不会被映射为c,而只会映射为b;map默认是递归映射的
n: 在 normal 模式下生效
i:在insert 模式下生效
v:在visual 模式下生效
c:在command-line模式下生效
o:在命令等待时生效,比如输入d之后会等待输入下一个字符,可能是d或者数字。
un: 删除键的映射,试图unmap一个没有被映射的键会被提示不存在这个映射。
mapclear: 清除相关模式下的所有映射,可以加相应的前缀。慎用!
以上的前缀可以组合使用,比如nnoremap,nunmap,vnoremap等。不带前缀的map命令默认对normal 模式和visual 模式生效。

一些实用的键盘映射

一下提到的键盘映射都是我自己使用的映射,也参考了很多网上其他人的映射。这些映射基本上是本着舍弃太远的键,工作时手尽量大体不离开标准位置,也就是十指分别在asdfjkl;这几个键位上。同时还有一些个人的喜好。

ESC

映射:df

原因:CapsLock在vim中没法单独映射,映射为两个键比较好,一个键可能会在真正要使用这个键时发生冲突。在网上搜到很多人映射为jj,我认为这不合理,在normal mode中,需要连续向下移动几行时,连续按j,这时候就冲突了。也有人映射为jk,但这样会造成按j向下移动一行时,光标会有个明显的停顿,因为系统在等是否j后面接着有一个k。那为什么是df呢,首先d、f均为辅音,变量命名中出现连续两个辅音的几率相对较小。事实上快速连续的输入d*(*为除d外的任意字符)都不会有延迟。df应该在所有模式中都映射成ESC。将ESC映射为df后在dd删除一行后,会有个延迟,不过这个对我没有造成很大的困扰。

map  df <Esc>
omap df <Esc>
imap df <Esc>
cmap df <Esc>
在这里我遇到一个问题,映射之后,在normal mode下,按r之后,准备替换一个字符,但此时我想退出来,不想替换了,但按df发现没有退出来,而是那个字符被替换为d。不知道这个应该怎么解决。


带Ctrl的几个映射

本着手不想动的原则,我认为Ctrl键也挺远的,经常按小拇指会很不舒服,所以我希望尽量将带Ctrl的键全都映射到别的地方过去。
<C-f>和<C-b>:这两个键在上下翻页的时候相当重要,而normal mode下ff和bb基本上是没有用的,所以映射成这两个键位可以轻松很多。当然bb可能和向前跳一个词冲突,喜欢使用b向前跳的朋友应该考虑其他键位。
<C-o>:C-o在代码中跳来跳去的时候很重要,当用gd跳到一个变量的定义处,想要再跳回来,那就要用到C-o,oo没有什么用,正好可以做一个很好的映射。

<C-v>: vv, 同上面道理。

在前面的博客中提到过NERDTree的快捷键设置,也是因为涉及到了Ctrl键,把<C-w>j映射成J等。

nmap J <C-w>j
nmap H <C-w>h
nmap K <C-w>k
nmap L <C-w>l
nmap W <C-w>w
nmap ff <C-f>
vmap ff <C-f>
nmap bb <C-b>
vmap bb <C-b>
nmap oo <C-o>
nmap vv <C-v>

括号自动补全

大部分程序员在打括号时应该都是成对打,然后到括号中编辑,如果括号没有自动补全,那么就需要打了括号之后按ESC,l,i,比较麻烦,在vimrc中可以实现括号的自动补全。
inoremap ( ()<Esc>i
inoremap [ []<Esc>i
inoremap { {}<Esc>i
inoremap " ""<Esc>i
这样输入(, [, {, "的时候都会自动补全,并且把光标移到括号的内部。

逗号的映射

有了上面括号补全的映射,那在扩好了编辑完后需要跳出括号,应该输入<Esc>, l, a,但我们可以将这个功能映射为,,来实现,首先在编码时连续的两个逗号不会出现(目前我没有遇到),其次,平时输入逗号时,后面都会有一个紧跟的空格。所以对普通的输入不会造成影响。
imap ,, <Esc>la

接下来的两种映射带有比较重的个人习惯,仅供参考。
平时敲键盘太多了,感觉右手小拇指不舒服,因为右手小拇指的负担太重,backspace,enter,右shift,;,‘,>, /, \, }, {, +, -, 0,这一系列键都要用小拇指按,负担太重。而在vim中shift,enter,backspace平时用的也比较多,所以就考虑将这些键映射到舒适的位置,减轻小拇指的负担。

backspace的映射

backspace的功能是向前删除,而x键是向后删除,在normal模式下z没有什么作用。所以用z键实现backspace的功能是个不错的选择。
nnoremap z i<BS><Esc>l
只需要退出到normal模式然后用z删除就可以实现backspace的功能。

分号映射为右shift

由于个人习惯使用右边shift的频率很高,但右边shift离右手小拇指其实比较远,所以用久了会不舒服,所以想将分号映射为右shift。但不知道如何直接映射,所以只好采取简陋暴力的方法。如下
imap  ;g G
把右shift加左手按的键都如此映射,分号其实也就起到了右shift的作用。



总结

以上的映射是根据个人习惯设置的,萝卜青菜各有所爱,可能和很多朋友的习惯不一样。我的设置原则基本上是手不要做太大幅度的移动,同时又是小拇指的负担能够小一些。如果和您的想法有所不同,欢迎讨论。

Reference

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值