2013-08-03 71 views
4

交換Vim中兩個字符的成語是xp以原子方式交換兩個字符,以便可以用「。」重複。

請參閱:h 04.5最後一段和Vim: how do I swap two characters?的幫助。

但偶爾我需要連續做兩個或多個交換操作。我經常感到驚訝的是,對我來說感覺像是一次單獨的操作,實際上是對Vim的兩個操作。這使得用.重複xp是不可能的。 (或用u原子撤銷。)

有沒有辦法在單個操作中交換兩個字符,我可以用.快速重複?

+5

我可以理解能夠用'.'重複的願望。我經常會遇到類似的寵物小偷,但是'xp'並沒有比''慢得多,當你找出一個解決方案時,它會是你vimrc中一個非常難看的功能,你只需要刪除你會學到一些東西,但浪費了淨工作時間 - 至少這是我在這些事情上的個人經驗。 – Conner

+0

'nnoremap! xp' – romainl

回答

0

Vimcasts.org已發佈an episode,解決了這個問題。

由於@Jeremy猜測解決方案是使用repeat.vim插件。然後只需將以下<Plug>映射和鍵映射添加到您的vimrc。

nnoremap <silent> <Plug>Transpose xp:call repeat#set("\<Plug>Transpose")<CR> 
nmap cp <Plug>Transpose 

此處顯示的映射使用cpcp是新的xp,可用.重複,但其他方面完全相同。

現在剩下的就是習慣它了。

2

這並不理想,但如果您將xp存儲爲宏,則在您執行宏之後它將是可重複的。所以,而不是XP,你正在使用,說@s(交換)。然後@@將重複它。不如。,但它確實有效。

編輯:你知道,我敢肯定有一種方法可以用一些vimscript和tpope的repeat.vim來完成。可悲的是,我的腳印沒有達到鼻菸。我得到了這麼遠 - 也許有人可以糾正我要去哪裏錯了?

fun! DoSwap() 
    :normal xp 
    silent! call repeat#set("\<Plug>Swap",1) 
endfun 
nnoremap <silent> <Plug>Swap :call DoSwap()<CR> 
nmap <Leader>s <Plug>Swap 

這樣做的問題是,一旦你進入\s,它確實交換你的角色,它並重復,當你打.,但它跳轉到行的開頭第一,這不是你想要的。但我確實認爲這可以完成,但我並不完全一樣。

+0

。將只重複上一次操作(p),而不是整個宏(@s) – Bolo

+0

順便說一句,我認爲註冊一個宏確實是可以在這裏完成的最好的事情。只需從您的答案中刪除「然後再重複一遍」,我會很樂意收到它。 – Bolo

+1

@Bolo你絕對正確。我不知道我的想法在哪裏。重複了一個宏。如果宏指令的工作方式是重複按鍵,它甚至沒有意義。更正建議使用@@來代替重複。 – Jeremy

0

這是一個想法。假設光標位於單詞「oyxgen」的「y」上。

在正常模式下,類型

2sxy<Esc> 

查閱字讀取 「氧」。找到下一個錯字(fy)並重復更改(.)。

太糟糕了,這隻適用於特定交換「yx」到「xy」,所以這不是最終的解決方案。

+0

我覺得爲什麼不使用':s/yx/xy/gc' – FDinoff

相關問題