codecamp

Vimscript 锻炼你的手指

这一章我们会讲到怎么更有效地学习Vim,不过在此之前需要先做一些小小的准备。

让我们先创建一个mapping,这个mapping会为你的左手减轻很多负担。执行下面的命令:

:inoremap jk <esc>

ok,现在进入插入模式然后敲击jk。Vim会返回到常用模式,就像你敲击了escape按键一样。

在Vim中有很多默认的方式可以退出插入模式:

  • <esc>
  • <c-c>
  • <c-[>

使用上面的这几种方式,你都需要伸出你的爪子,这会让你感到很不自在。使用jk会很棒,因为这两个按键正好就在你最强健有力的两个手指下面,并且你不用搞得好像在演奏吉他和弦似的移动手指。

有些人可能更喜欢使用jj,但我更钟意jk,有两个原因:

  • 使用两个不同的按键,你可以“滚动”你的手指而不是把同一个按键按两次。
  • 如果你出于习惯在常用模式下按了jk,只会将光标向下移动一下,然后又向上移动一下,最终光标还是停留在原来的位置。但是在常用模式下按了jj的话,只会把光标移动到一个不同的地方。

不过需要注意的是,如果在你所用的语言中jk会经常组合出现(例如德语),你可能就需要选择一个不同的mapping了。

学习Map

ok,现在你已经有了一个新的mapping,你会怎么学习使用它呢?特别是你已经用了这么久的escape按键,使用escape按键都已经刻入了你的脑子中,以至于在编辑的时候你会不假思索的敲击它。

重新学习一个mapping的窍门就是_强制_将之前的按键设置为不可用,_强迫_自己使用新的mapping。执行下面的命令:

:inoremap <esc> <nop>

这个命令会告诉Vim在插入模式下敲击escape按键后执行<nop>(no operation),这样escape按键在插入模式下就无效了。ok,现在你就_不得不_使用jk这个mapping来退出插入模式了。

一开始你可能不太适应,你还是会在插入模式下敲击escape按键,并且以为已经退出到了常用模式,然后开始敲击按键准备在常用模式下做一些事情,从而导致一些不需要的字符出现在你的文本中。这会让你感到有些不爽,但如果你坚持一段时间后,你会惊讶的发现你的思维和手指会多么快的适应 新的mapping。用不到一到两个小时你就不会再在插入模式下敲击escape了。

这个方法适用于所有的用于替代原有操作方式的新mapping,包括在生活中也是如此。当你想改掉一个坏习惯的时候,你最好能够想一些办法使得这个坏习惯很难甚至是不能发生。

如果你想学会自己做饭,不想每天都吃盖浇饭,那么每天下班的时候就不要去成都小吃了。这样你就会在饿了的时候想办法去做点东西吃,当前你先要确保你家里没有泡面。

如果你想戒烟,那你就不要把烟带在身上,把它放到车上。这样当你的烟瘾又犯了的时候,你会觉得走到车里去取烟是一件很蛋疼的事,这样你就不会吸了。

练习

如果还是会在Vim的常用模式中使用方向键移动光标,那么就将它们映射为<nop>

如果你在编辑模式下也会使用方向键,同样的,映射为<nop>吧。

正确使用Vim的关键就是使得自己能够快速的离开插入模式,然后在常用模式下进行移动。

Vimscript 更多的Mappings
Vimscript 本地缓冲区的选项设置和映射
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

vi命令手册

Vimscript编程参考

Vim 其他内容

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }