Subversive 提供了兩種新的操作員動作,讓執行快速替換變得非常容易。它不包含預設映射,並且在您向其中添加自己的映射之前不會產生任何影響。
如果您喜歡觀看此外掛程式的影片說明而不是下面的文字,請參閱此處。
設定範例:
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
請注意,在這種情況下,您將隱藏更改字元鍵s
因此您必須使用更長的形式cl
新增這些映射後,您可以執行s<motion>
將運動提供的文字物件替換為預設暫存器(或顯式暫存器,如果提供)的內容。例如,您可以執行siw
將遊標下的當前單字替換為目前的 yank,或執行sip
替換段落等。
subversive 提供的另一個有趣的運算子允許使用多個連續動作指定要替換的文字以及要套用變更的行範圍。
設定範例:
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
新增此地圖後,如果執行<leader>s<motion1><motion2>
然後在狀態欄中的提示中輸入一些文本,則motion1
給出的文本應替換為我們在每行提示中輸入的文本由motion2
提供。或者,我們也可以在視覺模式下選擇motion1
,然後點擊<leader>s<motion2>
以獲得相同的效果。
這可能非常強大。例如,您可以執行<leader>siwip
來取代遊標所在段落中存在的當前單字的所有實例。或<leader>sl_
取代目前行遊標下字元的所有實例。
<leader>ss
映射用作替換遊標下當前單字的捷徑。例如,這允許您執行<leader>ssip
來取代目前段落中遊標下的單字。請注意,這匹配完整的單詞,因此與<leader>siwip
不同(它不要求每次匹配都有單詞邊界)
讓我們看看它的實際效果:
在此 gif 中,我們首先透過執行<leader>ssom
然後在提示符號中輸入bar
來重命名本地foo
參數(請注意, om
是代表「外部 c# 方法」的自訂動作,該插件不提供)。另請注意,因為我們使用的是<leader>ss
,所以文字_foos
不受影響,因為它與完整的單字不符。在這種情況下它很有用,因為我們只想重命名函數內的參數。
之後我們切換到可視模式並選擇foo
部分_foos
然後執行<leader>sie
並再次在提示符中輸入bar
。 ie
又是代表entire buffer
的自訂運動(有關詳細信息,請參閱下一節)
之後,我們轉到AddFoo
的Foo
部分並執行<leader>seie
並再次輸入Bar
。最後對完全大寫的FOOS
執行相同的操作。
請注意,如果您使用 neovim,則可以啟用inccommand
選項,以便在輸入時即時預覽替換內容(相當於將g:subversivePromptWithActualCommand
設為1
)
另請注意,此動作是可重複的。如果您在一個段落中執行<leader>siwip
,然後轉到另一個段落,然後點擊.
那麼相同的替換將應用於遊標下的新段落。
請注意,要真正利用這些映射,除了當前段落 ( ip
)、當前句子 ( is
) 或當前行 ( _
) 等內建物件之外,添加自訂文字物件會很有幫助。自訂文字物件(例如當前縮排等級、目前方法、目前類別、整個緩衝區、目前滾動頁等)都可以在這裡提供很大幫助。
例如,幾個非常簡單但對顛覆有用的動作是:
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
還有其他插件提供了大量自訂文字對象,我建議您查看一下。
對於許多替換,您可以依靠突出顯示預覽來了解正在替換的內容。但如果您要對整個文件進行較大的替換,您可能需要確認每一個。您可以使用以下地圖來做到這一點:
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
它們的工作方式與上面的<leader>s
地圖相同,只是將逐一逐步執行每個替換。
如果您為上述任何替代動議提供明確寄存器,它將不會提示,而是使用給定寄存器的內容。例如, "a<leader>siwip
將立即以目前段落中存在的暫存器a
的內容取代遊標下目前單字的所有實例。
如果這還不夠,您還可以使用以下插頭:
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
其工作方式與先前的插件相同,只是不提示它將使用預設暫存器。
您可以透過將黑洞暫存器傳遞給替代超範圍命令之一來完成此操作。例如: "_<leader>siwip
或"_<leader>csiwip
如果您想確認每個刪除)。
不幸的是,您不能只在提示中輸入空值,因為沒有辦法區分此輸入與透過轉義取消的輸入(除非您將g:subversivePromptWithActualCommand
設為1
在這種情況下可以正常工作)
g:subversivePromptWithCurrent
- 當設定為1
時,提示將包含要替換的文字。如果您只想對其進行編輯,這可能很有用。預設值: 0
g:subversiveCurrentTextRegister
- 設定後,給定的暫存器將填入要替換的文字。這可以作為g:subversivePromptWithCurrent
的替代品,這樣當您想要編輯它時,您可以在提示中點擊<cr>r
(假設您將其設為'r'
),否則只需在您想要執行的操作時直接鍵入即可完全替換。g:subversivePromptWithActualCommand
- 當設定為1
時,它將使用本機 vim 替換命令進行提示,而不是僅提示輸入替換文字。經驗豐富的 vim 用戶可能更喜歡這個,這樣他們就可以自己調整各種替換標誌。預設值: 0
g:subversivePreserveCursorPosition
- 設定為1
時,套用替換時間標將不會移動。預設值為0
以匹配正常的 vim 行為。 如果您也安裝了 vim-abolish,那麼您也可以考慮添加類似於以下映射的內容:
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
這與<leader>s
行為相同,只是它將執行廢除「顛覆」而不是使用 vim 的內建替代命令。這將應用替換並保留原始單字的大小寫。例如:
在這種情況下,我們將遊標移到foo
上方,然後執行<leader><leader>seie
然後輸入bar
,這會取代foo
的所有實例,無論大小寫。
這是執行快速重命名的一種非常方便的方法。
正如您所期望的, <leader><leader>ss
映射的工作原理類似,只是僅匹配包含單字邊界的完整單字。
如果您願意的話,還有一些替代插件將使用預設註冊而不是提示:
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
請注意,如果您將 vim-yoink 與 vim-subversive 一起安裝,則貼上後 yoink 交換功能也會自動與 subversive(單動)替換一起使用。換句話說,假設使用預設映射,您可以執行siw
然後點擊<cn>
/ <cp>
在 yoink 歷史記錄中的不同 yanks 之間進行交換。
Subversive 還提供了一個插件來替換視覺模式粘貼,以提供粘貼後交換:
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
現在,如果您在視覺模式下按p
您可以在猛拉之間切換,就像在正常模式下貼上時一樣。