2010-01-31 39 views
25

我目前正在使用emacs,並且對大多數概念很滿意。但我真的崇拜三個VIM命令的方便:DD,O,O- 希望你能告訴我如何反映他們在Emacs :)Emacs等效於Vim的dd,o,O

DD - 刪除整條生產線,包括換行,不管光標在哪裏。

我發現了類似這樣的伎倆東西:

鈣CK CK

雖然C-a將光標移動到行的開頭,第一C-k殺死文本中,第二個殺死換行符。唯一的問題是,這不適用於空行,我只需要鍵入C-k這是非常不方便的,因爲我必須使用不同的命令來完成相同的任務:殺死一條線。

Ø/ O - 創建上方光標下方一個新的空行/和將光標移動到新行,縮進正確

好,C-a C-o幾乎是一樣O,只是idention丟失。 C-e C-o在當前下方創建一個空行但不移動光標。

有沒有更好的解決方案來解決我的問題,還是需要學習Lisp並定義新的命令來滿足我的需求?

+0

我認爲最好的新方法是http://superuser.com/a/331661(C-e C-j) – 2014-01-09 07:08:48

回答

26

對於oO,這裏有我很多年前寫了幾個功能:

(defun vi-open-line-above() 
    "Insert a newline above the current line and put point at beginning." 
    (interactive) 
    (unless (bolp) 
    (beginning-of-line)) 
    (newline) 
    (forward-line -1) 
    (indent-according-to-mode)) 

(defun vi-open-line-below() 
    "Insert a newline below the current line and put point at beginning." 
    (interactive) 
    (unless (eolp) 
    (end-of-line)) 
    (newline-and-indent)) 

(defun vi-open-line (&optional abovep) 
    "Insert a newline below the current line and put point at beginning. 
With a prefix argument, insert a newline above the current line." 
    (interactive "P") 
    (if abovep 
     (vi-open-line-above) 
    (vi-open-line-below))) 

可以綁定vi-open-line,比方說,M-插入如下:

(define-key global-map [(meta insert)] 'vi-open-line) 

對於dd,如果您想讓殺死的線路進入殺手環,您可以使用此功能來包裝kill-line

(defun kill-current-line (&optional n) 
    (interactive "p") 
    (save-excursion 
    (beginning-of-line) 
    (let ((kill-whole-line t)) 
     (kill-line n)))) 

爲了完整性,它接受一個前綴參數並將其應用於kill-line,這樣它可以殺死比「當前」行更多的內容。

您也可以查看viper-mode的來源,瞭解它如何實現等效的dd,oO命令。

+0

太好了,謝謝。工程就像一個魅力:)只是'vi-open-line-above'不縮進。有任何想法嗎? – ericteubert 2010-01-31 21:59:41

+1

我在'(前行-1)'下面的'vi-open-line-above'中添加了'(indent-to-mode-mode)'。這是訣竅:) – ericteubert 2010-01-31 22:11:42

+0

有趣的是,當你注意到你找到了解決方案時,我正在編輯它。你可以知道,這是我不經常使用的舊代碼。當我第一次學習Emacs Lisp時,我寫了它。這個問題給了我一個弄清楚的藉口。 – seh 2010-01-31 22:14:02

1

下面是如何解決的Emacs中缺少一個類似vi的「O」命令的問題:

(defadvice open-line (around vi-style-open-line activate) 
    "Make open-line behave more like vi." 
    (beginning-of-line) 
    ad-do-it 
    (indent-according-to-mode)) 

有了這個地方,我從來沒有真正感到六世的相應版本的需要「 o「命令。 C-n C-o可以做到這一點。

至於「dd」命令,開始時稍微磨合了一些,但我最終轉向了Emacs的做事方式。無論如何,當我想要一次刪除多行時,通常情況下,我只是使用區域(C-C-SPC,轉到要刪除的文本的另一端,C-w)來執行此操作。或者,如果我能看到我想要刪除的行數,我會做例如。 M-9 C-k一次刪除九行。

1

只要使用Viper-mode,VimpulseVim Mode,Emacs的按鍵綁定只是不符合人體工程學。

+4

這聽起來很尷尬。如果我想使用vim,那麼我使用vim而不是emacs。 – ericteubert 2010-01-31 22:01:20

+1

Emacs的鍵盤綁定可能()不符合人體工程學,但至少對我來說,vi的模態****在我的腦中閃爍着。 – 2010-03-06 08:55:28

+1

@eteubert根本不尷尬。只要將emacs看作第三(或第四)模式即可。一旦你選擇了emacs,並且所有東西都駐留在emacs中,它實際上感覺很自然。 – mt3 2010-10-25 15:47:44

22

對於dd,使用「kill-whole-line」,在最新版本的Emacs中默認綁定到「C-S-backspace」。

我應該補充一點,我自己更常使用whole-line-or-region.el,因爲C-wC-S-backspace更容易輸入。

+0

這確實有幫助。 – CantGetANick 2012-03-30 09:13:45

23
C+e C+j 

根據the emacs manual docs。這讓你有了新的路線和縮進。

+0

我只讀了舊的'C-j'。在我的機器上運行(Emacs 24)。 – Droogans 2013-08-29 02:02:28

+1

如果你在句子或行的中間,並且'c + j'它會將行的其餘部分放在新行中。這就像在線路中間的「返回」。我們希望在當前光標位置下方添加一個空行。 – pjammer 2013-08-29 13:16:52

1

我知道,這個迴應並不是直截了當,但是和vim用戶一樣,我發現Spacemacs是從vim移動到emacs的功能最強大的emacs入門套件。你可以將它配置爲vim,像emacs或混合。

http://spacemacs.org/

試試看。