2010-04-13 202 views
33

當我使用VIM或最無模式的編輯器(Eclipse,NetBeans等)時,我經常執行以下操作。如果我有類似的文本塊,我需要將它們全部更改,我將更改它,複製它(或使用未刪除的YANK),選擇我需要的下一個塊,並將更改後的版本粘貼到它上面。如果我在emacs中執行同樣的操作(選擇區域並使用C-y粘貼),它不會替換區域,只會粘貼到光標位置。在emacs中做這件事的方法是什麼?如何用yank緩衝區內容替換emacs中的區域?

+0

有類似的文本塊(在你的代碼?),通常建議你需要一些重構,例如,用包含「相似文本」的函數/方法調用替換相似的文本塊。我的客人,這是我從來沒有真的錯過了Emacs中的「替換區域」功能的原因之一... – slu 2010-04-13 13:08:31

+0

@slu你如何重命名你已經提取的漂亮的功能/方法? – 2016-05-12 22:41:57

回答

55

添加到您的.emacs

(delete-selection-mode 1) 

凡是寫入緩衝區,而該地區是積極將覆蓋它,包括粘貼,而且只需鍵入某事或點擊Backspace

+1

爲什麼不是默認? – 2014-03-09 18:56:18

+2

@mcb可能是該地區直到最近才默認不可見的原因;標準的emacs實踐是(或者可能)在將標記移動到一個位置時將標記保留在一個位置,並且除非使用專門對其進行操作的命令,否則它們之間存在區域的事實是無關緊要的。你不想在每次打字時都要摧毀這個區域,並且有像'exchange-point-and-mark'這樣的命令可以跳轉到你離開商標的地方。這些天我懷疑大多數人不使用這種方式,所以總是顯示該區域並將其視爲「活動」可能是好的 – 2014-03-11 19:47:24

+2

這適用於手動輸入標記區域,但不適用於粘貼文本的情況。 :(Emacs 24/Ubuntu 14.04。 – mcandre 2014-07-23 21:36:56

8

默認方式做這樣的事情是不完全優雅的以下內容:

  1. 讓你想要的替換文本以某種方式進入殺戒(例如,Mw)。
  2. 突出顯示要替換的區域。
  3. 刪除它(C-w)。
  4. 將其替換爲之前複製的區域(C-y,M-y)。這將用剛剛刪除的文本(C-y)替換剛刪除的內容,然後用緩衝區環中下一個最近保存的緩衝區(M-y)重新替換它。

如果你想用同樣的文字做這10次,這將會成爲一個真正的痛苦,因爲每次刪除一個區域時,所需的替換物會被推回到殺戒環中更遠的位置,每次你想要抽取它時,你都必須打電話給M-w

我也剛剛發現M-x delete-region,這要感謝Emacs: how to delete text without kill ring?。正如問題所暗示的那樣,這會刪除違規文本而不會將其放入kill ring中,從而避免將替換文本進一步壓入堆棧的問題。而且,如相關回復所述,您可以將其綁定到您選擇的快捷鍵。

2

如果啓用CUA模式,則此粘貼到選定區域將成爲正常行爲。

13

設置delete-selection-mode,正如邁克爾所說,似乎是最自然的方式來做到這一點。

但是,這不是我所做的:)相反,我把好東西放到一個「註冊」中 - 例如註冊「a」 - 與C-x r x a。然後我殺死另一個副本,並將該寄存器複製到與C-x r g a相同的位置。

這很方便,因爲查殺不會影響寄存器,所以C-x r g a總是插入好東西。

2

我做到這一點的方法是:

  • 去到你想要的新東西
  • 粘貼好東西,現在
  • 光標是新的東西,你想要得到的東西之間擺脫
  • 選擇向前推,直到一切你想擺脫的選擇
  • 刪除

這是一個稍微不同的思考方式。粘貼你想要的東西,然後擺脫你不想要的東西,而不是用你所做的事替換你不想要的東西。