2010-01-31 3 views
25

Attualmente sto giocando con emacs e sono contento della maggior parte dei concetti. Ma ho davvero adorato la comodità dei tre comandi di vim: dd, o, O Spero che mi può dire come a rispecchiare loro in emacs :)Emacs equivalenti di Vim's dd, o, O

gg - cancella tutta la linea, tra cui ritorno a capo, non importa dove si trova il cursore.

ho trovato qualcosa di simile a fare il trucco:

Ca Ck Ck

Mentre C-a sposta il cursore all'inizio della riga, il primo C-k uccide il testo, il il secondo uccide il ritorno a capo. L'unico problema è che questo non funziona su linee vuote in cui ho solo bisogno di digitare C-k che è abbastanza scomodo in quanto devo utilizzare diversi comandi per lo stesso compito: uccidere una linea.

o/O - crea una nuova riga sotto/sopra cursore e sposta il cursore alla nuova linea, rientrati correttamente

Ebbene, C-a C-o è quasi come O, solo l'idention manca . C-e C-o crea una riga vuota sotto la corrente ma non sposta il cursore.

Esistono soluzioni migliori ai miei problemi o devo imparare Lisp e definire nuovi comandi per soddisfare le mie esigenze?

+0

Penso che il miglior metodo per la nuova linea sia questo http://superuser.com/a/331661 (C-e C-j) –

risposta

26

Per o e O, qui ci sono alcune funzioni che ho scritto molti anni fa:

(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))) 

È possibile associare vi-open-line, per esempio, M-inserire come segue:

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

Per dd, se si desidera che la linea uccisa venga aggiunta al kill ring, è possibile utilizzare questa funzione che include lo kill-line:

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

Per completezza, accetta un argomento prefisso e lo applica a kill-line, in modo che possa uccidere molto di più della linea "corrente".

Si potrebbe anche guardare alla fonte per viper-mode per vedere come si implementa le equivalenti dd, o e O comandi.

+0

Wow fantastico, grazie. Funziona come un incantesimo :) Solo il 'vi-open-line-above' non rientra. Qualche idea? – ericteubert

+1

Ho aggiunto '(indent-according-to-mode)' in 'vi-open-line-above' sotto' (forward-line -1) '. Questo fa il trucco :) – ericteubert

+0

Divertente, ero nel mezzo di modificarlo di nuovo quando hai notato che hai trovato la soluzione. Come puoi vedere, questo è un vecchio codice che non uso spesso. L'ho scritto quando ho iniziato a imparare Emacs Lisp. Questa domanda mi ha dato una scusa per rinfrescarlo. – seh

1

Ecco come ho affrontato il problema della mancanza di un comando vi-tipo "O" di Emacs:

(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)) 

Con questo in luogo, non ho mai sentito il bisogno di una versione corrispondente del VI del " o "comando". C-n C-o fa il trucco.

Come per il comando "dd", che all'inizio mi ha un po 'offeso, ma alla fine sono arrivato al modo di fare le cose di Emacs. Ad ogni modo, quando voglio cancellare più righe contemporaneamente, come spesso succede, lo faccio semplicemente usando la regione (C-a C-SPC, vai all'altra estremità del testo che voglio cancellare, C-w). O se posso eyeball il numero di linee che voglio cancellare, farò per esempio. M-9 C-k per cancellare nove linee contemporaneamente.

1

Basta usare Viper-mode, Vimpulse o Vim Mode, le combinazioni di tasti Emacs non sono solo ergonomiche.

+4

Mi sembra strano. Se voglio usare vim, allora uso vim non emacs. – ericteubert

+1

Le combinazioni di tasti di Emacs potrebbero (!) Non essere ergonomiche, ma per me almeno, le grinfie modali di vi sul mio cervello. –

+1

@eteubert non è affatto imbarazzante. basti pensare a emacs come alla terza (o quarta) modalità. in realtà sembra naturale una volta che hai acquisito emacs e tutto risiede in emacs. – mt3

22

Per dd, utilizzare "kill-whole-line", che è associato a "C-S-backspace" per impostazione predefinita nelle versioni recenti di Emacs.

Devo aggiungere che io stesso uso whole-line-or-region.el più spesso, dal momento che C-w è più facile da digitare rispetto a C-S-backspace.

+0

Questo davvero aiutato. – CantGetANick

23
C+e C+j 

Secondo the emacs manual docs. Questo ti dà una nuova linea e indentazione.

+0

Ho letto semplicemente il vecchio 'C-j'. Funziona sulla mia macchina (Emacs 24). – Droogans

+1

se sei nel mezzo di una frase o linea, e 'c + j' metterà il resto della linea sulla nuova riga. è come colpire 'return' nel mezzo della linea. vogliamo aggiungere una riga vuota sotto la posizione corrente del cursore. – pjammer

1

Lo so, questa risposta non è diretta al punto, tuttavia, come un utente Vim, ho trovato che Spacemacs è lo starter pack emacs più funzionale per spostarsi da vim a emacs. Puoi configurarlo come vim like, emacs like o hybrid.

http://spacemacs.org/

fare un tentativo.