2009-04-18 42 views
7

ReSharper有一個很好的功能,稱爲「擴展選擇」:通過反覆按CTRL+W(我認爲這是默認設置),您可以從當前的脫字符位置選擇越來越多。首先它是一個詞,然後越來越多的單詞,一行,內部然後外部塊的行(例如一個if塊),然後功能等...有沒有辦法在Vim中模擬ReSharper的「擴展選擇」功能?

基本上,通過重複按下組合鍵,你最終可以選擇整個文件。我相信至少你們中的一些人會熟悉它。

我剛剛開始學習vim的所有錯綜複雜,我沒有足夠的經驗來看看如何在Vim中實現這樣的事情(儘管我認爲這是可能的)。所以我的問題是針對Vim的大師:這可以做到,怎麼做?

更新:有點背景故事。我一直在和前任老闆談論Vim的所有好處,他認爲這很好。他唯一的問題是:它有「擴展選擇」嗎?我的問題到目前爲止是沒有。所以,如果有人知道答案,我終於會贏得一場討論:P(也許創建一個新的Vim轉換器

+1

令人驚訝的是,在這裏沒有人回答認識到需要適當的(部分)解析器。 Resharper在代碼的邏輯模型之上實現了這個(很棒的)功能:代碼DOM。這也是使重構能夠處理所做選擇的原因。沒有合適的解析器,你會選擇「事物」,但不是適當的(子)表達式。後者會很有用,但目前Vim不支持_That。除非你指望Lisp支持:`vabababo2k`對lisp_來說是完美的:) – sehe 2011-09-06 13:54:08

+0

@sehe:當然,你是完全正確的。自從我問這個問題以來,我一直在想這個問題(好像很久以前!),並意識到,即使我以某種方式設法創建此功能,它將只適用於特定語言或一族語言。太糟糕了,不是嗎? :) – 2011-09-07 17:52:23

+0

我也一直在琢磨這個。我對90%的解決方案感到滿意(我現在可以手動對Vim進行非常快速的重構)。然而,「可用的」子表達式匹配選擇擴展器真的是我的第一夢想特徵。我確信很有可能提出一個解析器,它將爲C#,Java,C++和C提供DoTheRightThing;我期望的唯一粘性邊緣情況是C#與C++ 0x lambdas。所以我可能會把它們留出一段時間(並確保它是可插拔的)。我仍然在決定使用什麼,因爲我有種惡意的vim腳本。我傾向於python,但厭倦了排除用戶基礎的問題 – sehe 2011-09-07 19:40:12

回答

3

我很快就解決了這個問題。它不工作。隨意編輯並在vim wiki上發佈,或者如果你對它進行了改進,可以作爲一個插件。

機會,你會想使AG:resharp_list每種語言(一個用於paranthesised語言如,等。)

所有這一切需要的是原來的光標位置的標記:他標記和一個超時自動命令重置索引。

"resharp emulator 
"TODO this needs a marker 
"also c-w is bad mapping as it has a lag with all the other- 
"window mappings 
" 
let g:resharp_index = 0 

let g:resharp_select = ['iw', 'is', 'ip', 'ggVG'] 

func! ResharpSelect() 
    if g:resharp_index >= len (g:resharp_select) 
     let g:resharp_index = 0 
    endif 

    exe "norm \<esc>v" . g:resharp_select[g:resharp_index] 
    let g:resharp_index = g:resharp_index + 1 
endfun 

nnoremap <c-w> :call ResharpSelect()<cr> 
vnoremap <c-w> :call ResharpSelect()<cr> 

"Something to reset on timeout. TODO this doesn't work 
au CursorHold :let g:resharp_index = 0<cr> 
3

答案是肯定的。一旦進入可視模式,您可以使用所有常規導航方法以及一些額外的導航方法。

我的一些最愛?先打v當在正常模式下獲得視覺模式然後打:

  1. IW - 選擇內字。非常適合選擇一個詞,同時排除周圍的大括號或引號
  2. w - 多次點擊以繼續選擇每個後續單詞。
  3. b - 選擇字方式backwords
  4. ^ - 選擇所有從當前位置到文本開始在網上
  5. $ - 選擇所有從當前位置到行尾的

我相信這裏的其他人也可以添加到這個列表中。哦,不要忘了Visual Block模式Cv在vim中使用上述命令在二維空間中試用它:-)

+0

我對視覺模式相對比較熟悉,但關鍵的區別是,你必須移動你的手指,並實際上想要選擇下一個(或換句話說,_where_延長您的選擇)。目標是將所有這些按順序合併到單個組合鍵。 [我希望我已經清楚了,我不是母語英語演講者] – 2009-04-18 12:18:32

2

如果你在談論Vim(你應該是:-),你可以開始用v命令標記文本,那麼你有所有的標準光標移動命令(並且,如你所知,它們有一個批號),這將擴展選擇,以及移動光標。

然後,您只需使用所選文字執行任何操作。

查看here爲血淋淋的細節。

2

你需要編寫一個功能來保存當前的選擇,然後嘗試越來越寬的選擇,直到新的選擇超過保存的選擇或選擇所有的文本。一些可能的選擇是:

  • VIW - 選擇字
  • 可見 - 選擇句子
  • 貴賓 - 選擇段落
  • VIB - 最裏面的括號
  • v2iB中選擇文本 - 在未來選擇文本最內圈的支架
  • ggVG - 全選文字
1

我認爲傑里米沃爾的方向是正確的。爲了進一步朝這個方向發展,您可以查看Tim Pope的「surround.vim」腳本。有一個很好的描述on github。或者,如果你願意,從vim.org得到它。它可能會幫助你做一些你想做的事情,儘管它似乎沒有一個特點,只需在標籤中選擇即可。讓我知道如果我錯了。

最終,你真的很喜歡封閉文本對象的層次結構。如果沒有,你應該閱讀文本對象。一個很好的概述是here。請注意,您可以使用計數一次性抓取多個對象,或者反覆執行此操作(嘗試使用來自正常模式的vawasap}}})。

您還可以獲取定義其他文本對象的腳本,如使用縮進定義文本對象的this one。如果你按照通用的標準進行格式化,並且保證使用python,它將適用於很多語言。

一個令人煩惱的事情是,遊標最終會出現在視覺模塊的末尾,例如,您不能輕易選擇some()之間的所有內容,然後獲取它們之前的函數名稱......

...但是,我剛剛在this post中發現,您可以用o更改此行爲。涼!

我懷疑你會發現自己更有效率,可以跳過中間選擇從長遠來看。

無論如何,我會好奇的看看是否有其他人提出了更通用的解決方案!

相關問題