2012-10-27 20 views
6

Emacs有一個名爲open-rectangle的函數,它允許你選擇一個矩形區域(例如Vim的視覺模塊模式),然後點擊一個組合鍵來填充該矩形的空格,現有的內容輸出到右:Vma相當於Emacs的開放矩形

Before After

與文本的垂直對齊的列時,這是非常有用的。我覺得我應該可以在Vim中輕鬆做到這一點,使用視覺塊+搜索&替換。但我似乎無法弄清楚爲什麼我的搜索&替換沒有綁定到我的矩形當我嘗試它。

:'<,'>s/\^/ /

這實際上是縮進整行,而不是打開這個選定的區域。我嘗試過替換:

:'<,'>s/\v(.*)/ \1/ 

但是這也有同樣的效果。我怎樣才能讓我的模式明白,我只想用空格+所選區域來替換所選塊中的每一行?簡單的替換就像改變字母一樣工作,但使用^.*不能按我期望的方式工作。

我意識到能夠擊中「我」並插入一些空間回到正常模式,但是很難判斷當你在很多行上縮進大量數據時。

+0

@hammar似乎沒有做正確的事情。它肯定會使選定的區域填充空格,但它會使文本無用。 – d11wtq

+0

啊,當然。在我回到這裏之前,我其實已經明白了。你可以把它作爲答案嗎? :)完美的作品! – d11wtq

+1

我假定你正在處理一行中的事件,否則'''會更有效率。 –

回答

8

如何:

yPgvr<Space> 

這洋基塊並將其粘貼複製它,然後重新選擇原始塊和用空格替換它。

+0

好男人,謝謝! :) – d11wtq

+0

更高效:用'y'替換'dP'。 –

+0

@ChrisMorgan絕對更有意義,並且可以創建一個不太複雜的撤消序列(如果您決定撤消)。 – d11wtq

6

的另一種方法:

  1. 視覺塊只選擇一列。

  2. 點擊nI<Space><Esc>n是您想要的空白列的數量。

+0

這適用於任意數量的列。在塊選擇模式下,「I」在選擇之前在每一行中插入文本,就像在選擇之後的「A」在每行中追加文本一樣。 –

+0

這是一個更通用的解決方案。我喜歡。但是你碰巧知道它被記錄在哪裏?我找不到任何東西。 (不幸的是,可視化塊模式記錄不完全。) –

+0

「可視化塊只選擇一列」。那麼,如果你願意的話,你可以選擇更多......然後'nI '可以用'I'替代,後面跟着* n *空格(這可能更容易被視覺察覺)。 [Bah,我討厭用於評論的Markdown實現!它比用於格式化問題和答案的更糟糕!] –

2

romainl的答案的變化,我有這樣的:

vnoremap <C-Space> I<Space><Esc>gv 

它允許一次ň空間都插入通過前置的次數,反覆加列通過重複應用該映射。

+0

這是一個非常整潔的技巧,並保持視覺效果,謝謝。 – d11wtq