使用 Vim 的 jump list 看代碼

完整 Vim 配置見:space-vimgit


jumplist

Vim 能夠記錄咱們最近訪問的位置(location)。每一個位置(position)(position 包括了文件名,列號,行號)會被一個 jump list (跳轉表)中,每一個窗口(window)都有一個單獨的 jump list,它能夠記錄最近 100 個訪問的位置。github

像搜索(search), 替換(substitue)和標記(mark)的命令都被認爲是一個「jump」(跳轉),可是在一個文件中進行滾動並非一個 jump. 詳見 :h jump-motions.vim

之因此瞭解 jumplist,是由於在看 go 的項目時,常常查看代碼的定義(gd,使用 vim-go 插件),這時就可使用 Ctrl-ICtrl-O 進行跳轉。看完定義後,Ctrl-O 就能夠很快跳回來。函數

如何使用

使用 :jumps 來顯示當前窗口的 jump list,因爲太長,下圖並未顯示完,使用 Vim 的常見快捷鍵進行滾動,j,k,G 等等:ui

jumps

使用 Ctrl-o 跳轉到上一個位置,Ctrl-i 跳轉到下一個位置。Ctrl-oCtrl-i 前面也能夠加上編號,進行精確跳轉,這個編號就是上圖中 jump 列的數字。跳轉之後再查看 jump list, 你會發現有個 > 指示了當前位置,一開始的時候它是在 jump list 的頂部,若是你的 jump list 比較長的話,可能須要拖到底部(快捷鍵 G)才能看到:spa

>

上圖中能夠看出,行號爲 0 的上下方都是從 1 開始編號,它們分別表明了比當前位置更舊或新的位置。下方是比當前位置新的位置,使用 Ctrl-I 進行跳轉。上方是比當前位置舊的位置,使用 Ctrl-O 進行跳轉:插件

  • Ctrl-I 會跳轉到行號爲 0 的下方編號爲 1 的位置,也就是 1 21 5 type MessageType uint16.code

  • Ctrl-O 會跳轉到 1 420 24 ~/go/src/github.com/lightningnetwork/lnd/fundingmanager_test.goorm

  • Ctrl-ICtrl-O 一樣能夠加上數字跳轉到對應位置。好比 4 而後 Ctrl-I 會跳轉到 5 14 5 ~/go/src/github.com/lightningnetwork/lnd/lnwire/accept_channel.go.blog

簡化操做

前面說了可使用位置的編號加上 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(標記)功能對代碼瀏覽也很是方便,有時間再介紹吧。

參考:

相關文章
相關標籤/搜索