vim 跳转与回跳

开篇先说明日志布局, 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有其他功能会在以后的文章中介绍.

时间: 2024-10-05 10:55:32

vim 跳转与回跳的相关文章

ASP.Net MVC跳转,分为form的submit提交跳转和ajax跳转

1,用jquery ajax跳转的话,需要在前台用window.location("跳转网址")来跳转,在success后使用 2,用原声的form的submit来跳转,如下图 3,上面一段js+html也可用js来代替,如下 关于跳转的一些方式,大家有哪些意见和建议,可以在下面留言,欢迎讨论 最近在研究node.js,觉得这东西很牛逼,但是不知道对于我现在的小项目来说,能不能用,怎么用,用起来怎么样,还有我在学习xojo,听说这个是高度封装,好处就是少写代码,坏处就是无法更多的自由,

[Java]Get与Post,客户端跳转与服务器端跳转

http://www.thinksaas.cn/group/topic/133101/ 虽然说get 与post 问题很老套了,但是作为web 开发人员来说对于这个的理解确实很有必要,其实说到get 和post,还可以有doGet 与doPost 和客户端跳转与服务端跳转的区别: GET 与POST 的区别: 一.Get 是从服务器上获取 数据,Post 则是向服务器传送 数据: 二.Get 将表单中数据的按照variable=value 的形式,添加到action 所指向的URL 地址的后面 

uitableView 选择跳转后 再跳回来 颜色不变 问题

今天遇见过这个问题  以前都没这方面需求所以没有遇见 今天遇见了 网上查了 没有查到 好吧 只能说自己的问题 但是 还好kai哥到 一句话就解决了 ! 就是在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath中反选回来 如下代码: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(

[转]如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter

转自:http://www.jianshu.com/p/d6a246752ca5 预热 - 我要解决的问题 首先我还是要推荐Gaosboy的这篇文章解耦神器 —— 统跳协议和Rewrite引擎文章中,介绍了天猫app,基于文件配置和uri的页面跳转.这大大增加了app端的灵活性, 而这种实现很类似今天的前端或后端开发中的 静态路由 和 动态路由协议.除了天猫,在很多的客户端架构的文章中,路由解耦的案例并不不少见,如携程移动App架构优化之旅蘑菇街App的组件化之路原生路由协议, 其实两年前就有了

js页面跳转(含框架跳转)整理

js方式的页面跳转1.window.location.href方式    <script language="javascript" type="text/javascript">           window.location.href="target.aspx";     </script> 2.window.navigate方式跳转   <script language="javascript&q

客户端跳转和服务器跳转的区别以及各位困惑的在哪用

客户端跳转与服务器端在哪用forward是服务器请求资源,就是把所有参数都带上.服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址. redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重sendRedirect: 这个只是跳转,但是没有把查询参数带上,如果你想带参数的话,就得自己构造URL,就是那个location. 客户端跳转与服务器端跳转的区别 客户端跳转时用Ht

Apache Rewrite实现URL的跳转和域名跳转

Apache Rewrite实现URL的跳转和域名跳转 Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基 于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式.如果要想用到rewrite模块,必须先安装或加载rewrite模块.方法有两种一种是编译apache的时候就直接 安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块. 基于服务器级的(httpd.co

301 服务器端跳转与客户端跳转

首先我们需要理解什么是服务器端跳转,什么是客户端的跳转. 简单理解所谓服务器端跳转就是指地址栏内容不变(客户端浏览器的地址栏不会显示目标地址的URL),//注:客户端请求到达以后,服务器发现当前资源给不出回应,要在服务器内部请求另一个资源的跳转.所以,1.跳转与否客户端不知道(URL不变),2.属于一次request 而客户端跳转是指地址栏内容发生改变(客户端向服务器发请求偶,然后服务器再给客户端一个响应,然后客户端再根据服务器端给的响应中的URL再向服务器发送请求,所以是两次请求,因此地址栏改

如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter

PS 感谢大家的关注,由于我本想开源4个库,除了router, 另外三个分别是native dispatcher, web dispatcher 和 react dispatcher , 所以router 对native dispatcher 有了库依赖,为了共同学习,我把router单独分离成pod,再次感谢大家的关注,欢迎叫router更完善.best regards. 如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter @author Jou Email Wei