使用 Vim 的 jump list 看代码

完整 Vim 配置见:space-vim


jumplist

Vim 可以记录我们最近访问的位置(location)。每个位置(position)(position 包括了文件名,列号,行号)会被一个 jump list (跳转表)中,每个窗口(window)都有一个单独的 jump list,它可以记录最近 100 个访问的位置。

像搜索(search), 替换(substitue)和标记(mark)的命令都被认为是一个“jump”(跳转),但是在一个文件中进行滚动并不是一个 jump. 详见 :h jump-motions.

之所以了解 jumplist,是因为在看 go 的项目时,经常查看代码的定义(gd,使用 vim-go 插件),这时就可以使用 Ctrl-ICtrl-O 进行跳转。看完定义后,Ctrl-O 就可以很快跳回来。

如何使用

使用 :jumps 来显示当前窗口的 jump list,由于太长,下图并未显示完,使用 Vim 的常见快捷键进行滚动,j,k,G 等等:

jumps

使用 Ctrl-o 跳转到上一个位置,Ctrl-i 跳转到下一个位置。Ctrl-oCtrl-i 前面也可以加上编号,进行精确跳转,这个编号就是上图中 jump 列的数字。跳转以后再查看 jump list, 你会发现有个 > 指示了当前位置,一开始的时候它是在 jump list 的顶部,如果你的 jump list 比较长的话,可能需要拖到底部(快捷键 G)才能看到:

>

上图中可以看出,行号为 0 的上下方都是从 1 开始编号,它们分别代表了比当前位置更旧或新的位置。下方是比当前位置新的位置,使用 Ctrl-I 进行跳转。上方是比当前位置旧的位置,使用 Ctrl-O 进行跳转:

  • Ctrl-I 会跳转到行号为 0 的下方编号为 1 的位置,也就是 1 21 5 type MessageType uint16.
  • Ctrl-O 会跳转到 1 420 24 ~/go/src/github.com/lightningnetwork/lnd/fundingmanager_test.go
  • Ctrl-ICtrl-O 同样可以加上数字跳转到对应位置。比如 4 然后 Ctrl-I 会跳转到 5 14 5 ~/go/src/github.com/lightningnetwork/lnd/lnwire/accept_channel.go.

简化操作

前面说了可以使用位置的编号加上 Ctrl-ICtrl-O 跳转到对应位置,Ctrl-ICtrl-O 这个操作其实可以省略。比如,输入 4 向后跳转到第 4 个位置,输入 +4 向前跳转到第 4 个位置:

function! GotoJump()
  jumps
  let j = input("Please select your jump: ")
  if j != ''
    let pattern = '\v\c^\+'
    if j =~ pattern
      let j = substitute(j, pattern, '', 'g')
      execute "normal " . j . "\<c-i>"
    else
      execute "normal " . j . "\<c-o>"
    endif
  endif
endfunction

你可以选择将这个函数放到你的 .vimrc 中,:call GotoJump() 进行使用。在 space-vim 我将它放在了 util.vim, 可以这样进行调用::call spacevim#util#GotoJump(), 再映射一个快捷键就能比较方便地使用了:

nnoremap <Leader>gj :call spacevim#util#GotoJump()<CR>

GotoJump

其实讲了这么多,只需要学到 C-iC-o 这两个快捷键就行了,一个是跳转到上一个位置,一个是跳转到下一个位置。再多的内容,我也记不住 :).

另外,Vim 的 mark(标记)功能对代码浏览也非常方便,有时间再介绍吧。

参考:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏无原型不设计

【Mockplus教程】页面属性

每个页面都具有独自的属性,通过页面属性对话框可以设置 页面的背景、统一字号以及相应平台的页面尺寸等。 打开需要添加或者查看备注信息的页面,在页面节点上面鼠...

34560
来自专栏smy

prompt() 方法,弹框带输入框

prompt()  有alert的风格,却带着输入框,这是怎么实现的呢? 语法 prompt(text,defaultText) 参数 描述 t...

44050
来自专栏九彩拼盘的叨叨叨

浏览器默认样式

浏览器都拥有一套自己的默认样式。 浏览器之所以有默认样式表,是为了没有样式表的页面也能凑活着看。 不同浏览器;以及版本不同的浏览器的默认样式一般都是不同的。

8720
来自专栏快乐八哥

手动实现jQuery Tools里面tab功能

平时开发中用的Javascript类库都是jQuery,用到插件或者第三方类库能从jQuery Tools里面找到,基本不用其他的。当然有时同事喜欢使用jQue...

27490
来自专栏游戏杂谈

构建第一个Flex的Mobile APP

Flash Builder 4.5已经支持直接创建Flex Mobile Project,写一个最简单的例子

13320
来自专栏王二麻子IT技术交流园地

《跟我学IDEA》五、快捷键(编码利器)

上一篇博文,我们学习了idea的一些模版配置,但是只有模版是不行的,一款编辑器如何能为我们灵活的使用,快捷键的功劳不用多说大家也明白。今天我们就来学习快捷键的配...

34060
来自专栏程序员阿凯

使用Android Studio必须会的快捷键

13340
来自专栏Jerry的SAP技术分享

使用DOM Breakpoints找到修改属性的Javascript代码

使用Chrome开发者工具的DOM断点功能可以让您快速找到修改了某一个DOM元素的Javascript代码。

20690
来自专栏技术墨客

React中的模式对话框 转

在16.x版本之后React提供了Protals功能来解决模式对话框不在Dom根节点导致的一些BUG。除了Protal还有更多的方法去解决这些问题,本文来自Da...

9730
来自专栏james大数据架构

Android中include标签的使用

在Android的开发中,我们知道布局文件可以让我们很方便的对各个UI控件进行位置安排跟属性设置,而在程序中可以直接取得控件并赋予对应操作功能。但是,如果是一个...

22760

扫码关注云+社区

领取腾讯云代金券