vim短途跳轉用easymotion那長途呢?

vim內短途跳轉用easymotion很方便

但是如果要尋找千行中的某個位置,用什麼方法?

我一般是使用 / 搜尋 然後用n來找,還有更效率的方法嗎


對於不確定位置的搜索和跳轉,推薦使用 vimgrep 配合 copen ,這樣的好處是:

  1. 得到一個結果項清單,你可以通過這個清單直接進行跳轉,也能直接利用清單中列印出來的行號
  2. 通過目視一次性看到多個結果項,你不需要在正文中頻繁跳轉來查看那些項

用 vimgrep 對當前 buffer 進行查找:

:vimgrep /第d+話/ %

打開 quickfix 窗口:

:copen

然後你就能快速查看所有的結果項和進行跳轉。

詳細了解:

:h vimgrep
:h copen


取決於具體情況。

  • 知道行號:123G 或 123gg (123 為行號)。
  • 知道內容:/keyword 或 /regexp (regexp 為正則表達式)。
  • 知道大概位置:50% (在全文 50% 的位置)。
  • 按頁滾動:CTRL-D/U 向下/上滾半頁,CTRL-F/B 向下/上滾整頁。
  • 回到上次插入文字的地方:`. 。
  • 後退/前進:CTRL-O/I 。

夠用了吧……

-------

@zecy 的答案不是挺好嗎?贊數也多,怎麼那麼下面?


可以用 ctrlp 或 unite 的 line 模式


大文件的話用vimgrep,缺點是多開一個分欄操作,比較麻煩。

不太大的文件(5萬行以內),可以用這個宏:

nnoremap zpr :setlocal foldexpr=(getline(v:lnum)=~@/)?0:(getline(v:lnum-1)=~@/)\|\|(getline(v:lnum+1)=~@/)?1:2 foldmethod=expr foldlevel=0 foldcolumn=2&:set foldmethod=manual&&

用法是,用/號搜索後,按zpr可以把不匹配的部分摺疊起來。然後可以把游標移動到需要的行上,再用zR展開。或者在摺疊部分單獨用zo展開該部分。


如果僅僅是搜索位置,對於vim沒爐火純青的我來說,一般寫個perl小程序模式匹配,列印行數


其他答案已經提及了相對/絕對行數、incremental 搜索以及 marks。我再補充一個:tags。即 ctags 和 CTRL+] 結合。

有一個 script 叫 Taglist 可以給這個方法提供一個很傻瓜的界面。


用m做mark,然後用』做跳轉。

舉例:命令行模式,在某一行輸入mq,在下次需要到某一行的時候輸入『q。可以直接跳到之前mark的行


裝個tagbar

行數

/搜索

mark


* 滑鼠對準一個單詞,然後按 * 搜索,

然後按n

}

{

都可以幫你跳


推薦閱讀:

vim怎麼批量縮進?
vim 怎麼脫離滑鼠?

TAG:Vim | vimrc | Vim插件 | vim腳本 |