开篇先说明日志布局, vim学习记录连载中所有博客名以vim之开头, 后面是当前博客主题, 博客的时间布局以我当前vimrc中的配置布局顺序为主.每篇博客笔记中罗列和主题相关的配置清单并说明设计思路以及注意事项.
下面是本人当前vimrc和.vim文件夹备份路径:
网址 http://115.com/lb/5lbbmpxie05#
文件名: my_vim_2013_1111_7.0.tar.gz
115网盘礼包码:5lbbmpxie05
本章主题vim的光标快速定位, 在编码上的高效性首先就得益于vim对光标超强的控制能里,使用vim的人都知道vim的标准操作本身就可以实现各种各样的文件定位需求. 这里介绍自己总结的两套定位方案, 可以任选其一作为自己的定位模式, 也可以二者共用并选择一个作为主要的定位方式.
一. vim标准操作带来的定位模式
主要技巧:
->普通模式负责所有光标定位能力.插入模式随时使用<esc>键回到普通模式并且尽量保持普通模式为主要的工作状态.
-> hjkl四键负责光标的低速移动,如果还在使用方向键控制光标, 请尽量改正到使用hjkl,否则vimer们会鄙视你的.
-> gg 实现跳转到文件首行, G实现跳转到文件末行
-> o实现向下新开行, O实现向上新开行
-> 0和_实现跳转到行首, $实现跳转到行尾
-> A实现直接到行尾插入, I实现直接在行首插入
-> 数字+gg实现多行之间的快速定位
-> f+字母实现单行内的快速前向定位,t+字母实现单行内的向快速反向定位.
-> w实现按单词前向定位, b实现按单词反向定位
-> ctrl+f,ctrl+y,ctrl+d,ctrl+b实现按页和半页跳转
以上是注意的定位体系,具体快捷键功能,请参考vim和help文档或自行百度学习,记忆和使用
其他的特殊技巧不怎么常用,这里没有一一列出,必要时请自行总结记忆和使用.
二. 个人定制的vim定位模式
需求: vim光标定位的标准操作在很大程度上是为编程设计的, 作者是一个从来不中文的程序员,这样样的基础导致了vim的标准操作对中文不友好, 如果你用vim来编辑中文, 你将发现频繁的模式切换的同时还要照顾输入法的切换是一件多么痛苦的事情.
思路: 为了让vim更加有效的支持中文编辑,同时找到一种更加简洁高效的光标定位方式,我们需要让光标的定位和普通的输入分开,为了区分普通输入和光标定位我们需要引入功能辅助键, 这里我使用的是ctrl键. 这种是思想其实就emacs的快捷键模式, 你可以说这种设计其实是抄袭了emacs的模式, 也可以说我不是一个真正的vimer. 不过没关系,我关注的定位是否真的变得更加高效和便捷, 至于vim和emacs之间的文化分歧本人并不是太多关注.
实现方法:在vimrc中添加映射配置,通过map映射将vim的标准定位修改成另一套完全不同的模式.下面是我的vimrc的相关配置:
imap ` <esc><left><right>
vmap ` <esc><left><right>
nmap j gj
nmap k gk
imap kj <left>
imap jk <right>
imap jj <down>
imap kk <up>
imap <c-g><c-g> <esc>Gi<c-u>
imap <c-j> <esc>gja
imap <c-k> <esc>gka
imap <c-h> <left>
imap <c-l> <right>
nmap <c-j> gji
nmap <c-k> gki
nmap <c-h> <left>i
nmap <c-l> <right>i
vmap <c-j> gj
vmap <c-k> gk
vmap <c-h> <left>
vmap <c-l> <right>
imap <c-r> <left><left><left><left><left><left>
imap <c-f> <right><right><right><right><right><right>
imap <c-e> <up><up><up><up><up><up>
imap <c-d> <down><down><down><down><down><down>
nmap <c-b> <pageup>i
imap <c-b> <pageup>i
imap <c-y> <pagedown>i
nmap <c-y> <pagedown>i
vmap <c-i> <esc><left><right>a
imap <c-o> <esc><left><right>
vmap <c-o> <esc><left><right>
imap <c-u> <esc>A
imap <c-w> <esc><left><right>==i
nmap <pageup> <pageup>M
imap <pageup> <pageup><esc><left><right>M
nmap <pagedown> <pagedown>M
imap <pagedown> <pagedown><esc><left><right>M
imap o <esc><left><right>o
imap <a-o> <esc><left><right>o
nmap o o
nmap <a-o> o
配置注解:
->光标的所有定位实现直接集成到插入模式.
->ctrl+h,j,k,l 负责光标的低速定位, ctrl+r,f,e,d 实现光标的速度定位(上下左右6连跳)
->左ctrl键在大多键盘的左下角, 我们可以直接直接通过手掌的右下侧来控制ctrl键(第六个手指^_^),h,j,k,l和r,f,e,d 分布在左右手上并且都是最容易按下的键位.我们可以在同一时间随意的控制光标的高速度和低速移动.这种操作方式的一些前提要求是:你需要改变原来的操作模式, 并且买一个ctrl比较大比较好控制的键盘(所以,如果你直接使用的是笔记本的键盘, 那么我还是建还是直接使用标准方式,他绝对是你最好的选择),最后你的手最好是和我一样比较大的那种^_^
->选择r,f,e,d 键是因为vim中有不少ctrl的组合键在插入模式下有默认的功能并且不能被重新映射, 幸运的是r,f,e,d四个键都可以重新映射,并且没有重要ctrl组合键功能.
->由于输入法一般不会捕获ctrl+和alt的组合键,所有ctrl和alt的组合功能可以在中文输入的情况下顺利的被vim处理.同时由于使用的map映射,即便在中文输入法下面组合键发送的映射功能依然是英文, 因此这样可以很幸运的绕过输入法的切换,并且理论上支持所有语言.
->ctrl+r,f,e,d 的映射都使用了发送6个方向键的方式,这样看似笨拙其实是经过了优化.理由如下:
如过使用<esc>6ja(我最初的映射方式)这样的映射方式首先是移动的时候会看到左下角的状态标识不停的闪烁(因为他需要切换模式),其实次是<esc>在vim下面和alt键被设计成了相同的键位,<esc>6 等价于alt+6(<a-6>) 因为这样映射会出现和alt+6组合键的冲突.6个方向键在vim的后台处理的很快,使用时看到的效果是流畅的跳转体验.
->ctrl+j,k 两个低速上下移动键被映射成<esc>gja和<esc>gka , 理由如下:
vim正常使用时开启长行的自动回转显示是很方便的,这会带来一个问题,文件的单行在vim会被显示成多行,j,k跳转是按行跳转的, 即便屏幕中多行显示的是很长的单行,j,k依然会一次性跳过去
这样的行跳转很不直观也不方便, 为了实现按照屏幕显示行的形式跳转需要使用gj和gk.ctrl+j,k映射成gj和gk可以实现更加直观方便的定位方式.
可是,这样会带来一个问题, 当gj和gk遇到折叠了的代码行时会自动将其展开. 这里的ctrl+j,k 也是如此, 不过我并没修改他, 因为我们可以通过一个很巧妙的方式来解决这个小小的不便:
由于ctrl+e,d是使用<left>,<right>键映射的, 因此他们不会出现自动展开折叠的问题. 当我们偶尔真遇到了需要跳到折叠的对面去时候使用ctrl+r,f就可以了, 这看起来很像这样一种情形,折叠行就像是一个鸿沟, 当我们遇到鸿沟普通按步前进的方式是过不去的, 于是我们很自然的向后倒退了几步,然后一个超级大跳就跳过去啦...^_^!
->ctrl+h,j,k,l实现了在插入模式(imap),普通模式(nmap),可视模式(vmap)下的所有映射, 也就是说几乎在所有的情况下他们都是可以自动进入插入模式并实现单步移动.可是ctrl+r,f,e,d四个高速跳转只做了插入模式下的映射, 原因在于普通模式下这四个组合键有各自标准的功能
为了避免冲突就只在插入模式下做了映射. 可是这样高速跳转只能在插入模式下使用会不会不方便的同时又容易误操作呢(比如直接在普通模式下使用就是一种悟操作),没关系,我们又可以通过一个很巧妙的方式避开这个不便和误操作:
养成在移动的时候第一次按下的一定是低速移动的ctrl+h,j,k,l中的一个.
这样任何时候移动都会自进入插入模式, 即不会感到不便, 也不会出现误操作.
->vim中为了充分利用alt键带来的一大堆便捷的组合键, 我们需要注意如下几个问题:
1.为了避免<esc>键和alt键的冲突所有映射中用到<esc>键的地方采用<esc><left><right>来取代
2.由于一旦引入一个alt功能键的映射, 就会带来一个问题, <esc>返回到普通模式下速度明显变慢,这是由于<alt>键和<esc>在vim其实是同一个键而我们又对<alt>做了组合键的映射, 这样一来当我们按下<esc>键的时候vim无法确定使用者是想只按下<esc>键还是后面想再按下一个功能组合键, 为解决这个问题vim引入了输入等待模式, 当输入一个具有组合功能的部分按键的时候vim将等待半秒左右的时间来等待用户输入下一可能的键位,如果半秒之后用户没有按下任何键,那么vim将确认用户希望按下的是单一的当前键位.这就是为什么引入alt组合键之后<esc>反应变得迟钝的原因.
<esc>键变得的迟钝无论是对需要经常使用普通模式功能的标准用户还是像我这种偶尔需要原始操作才能解决问题的vim重度定制化的人来说都是一个致命的问题.简单想法是对<esc>键重映射到<esc><left><right>,不幸的是这样做没有效果, 没有办法解决了吗? vim最动人最销魂最让人兴奋不已的地方就通过对在标准的元操作不断的组合,我们总是可以找到一写解决问题的办法, 这种办法又在很多时候是那么的幸运!
我们知道现在的键盘大多数<esc>键都在左上角,这个位置还是比较远的,vim的作者之所选择<esc>键作为模式切换键是因为在他设计vim的时候使用的键盘的<esc>键就在Q键的旁边!我们现在用的键盘在不幸将esc键扯远的的同时还在esc键的下方引入了一个我们几乎不会用到的 "`" 键.既然用不到位置又比<esc>便捷,将其取代<esc>何乐不为呢.于是下面两句映射应运而生:
imap ` <esc><left><right>
vmap ` <esc><left><right>
由于在插入模式下"`"键被映射掉了,这会导致vim中永远都无法输入"`"这个符号了, 一个简单的解决办法是,需要输入的时候在其他地方写下 "`"再复制到vim中来.好在这个键几乎用不到, 真的是几乎用不到, 要不是现在写这篇文章的需要, 我想我在几个月内不会再复制粘贴这符号一次了吧
->jj,jk,kj,kk这四个键的映射是为了在写代码的时候提升流畅度而设定的,如果你需要编程,可以试试这个四个映射, 在括号的跳转的时候可是相当方便的哦, 当然我是一个苦逼的程序员, 为了最大限度的用vim来编程, 我会最大限度的将vim设计的适合编程. 这在以后的介绍中将会明显感觉到这一点.行云流水的编码感觉是vim带给我们最大的礼物.
->ctrl+u 实现跳转到行尾并插入, ctrl+w实现跳转到行首并插入, 注意:
.这里两个功能也是只能在插入模式下才有效.
.ctrl+w的映射比较特殊,普通模式下"=="实现当前行的排版功能, 并且会自动跳转到行首, 因此这里利用了这个特性将跳转到行首和当前行排版的功能都集成在了ctrl+w键位上,这两个功能在时间上大多是没有冲突的, 实践表示两个功能用同一个功能键还是想当方便的
.ctrl+u和ctrl+w在键盘布局上比较容易记忆.
->alt+o实现在任何时候向下开新行并进入插入模式
-> alt+i实现可视模式向插入模式的直接切换
->ctrl+o功能和<esc>相同,有时候会比"`" 方便一些.注意:普通模式下ctrl+o会跳转到上一次编辑的位置, ctrl+i则是向前跳转编辑位置, 这两个功能还是比较有用的,因为这里并没有在普通模式下对carl+i和ctrl+o进行映射设置.
->ctrl+y插入模式下向下翻页, ctrl+b 插入模式下向下翻页,这里的翻页功能在键盘布局上和功能反过来了, 主要原因是下翻比上翻要常用而ctrl+y又比ctrl+b更加容易按下
->翻页键实现在翻页时自动定位到屏幕中间行位置.这样无论是向下定位还是向上定位都会比较方便.
->按两次carl+g键直接跳转到文件末尾追加.由于在文件末尾追加的功能不叫常用, 就做这个映射.ctrl+g有其他功能会在以后的文章中介绍.