2009-03-07 3 views
10

Mi trovo spesso a digitare su una riga, quando mi rendo conto di aver bisogno (ed) di una definizione di variabile (o qualcosa di simile) nella riga sopra. Quello che vorrei è quelloComando Emacs per inserire e rientro linea sopra il cursore

  1. premere C-ritorno da qualsiasi punto su una linea e avere il passaggio del cursore di una riga vuota appena inserito sopra, con corretto rientro (o almeno uguale alla linea originale).
  2. essere in grado di tirare qualsiasi testo ...
  3. e Cu C-spazio per tornare alla posizione originale

sono riuscito a fare # 1, ma il mio emacs-fu non è abbastanza forte da fare il resto

risposta

6

Ecco la mia soluzione umile:

 
(defun insert-before-line() 
    (interactive) 
    (let ((pos (point)) 
     (cur-max (point-max))) 
    (beginning-of-line) 
    ; I've changed the order of (yank) and (indent-according-to-mode) 
    ; in order to handle the case when yanked line comes with its own indent 
    (yank)(indent-according-to-mode) 
    ; could be as well changed to simple (newline) it's metter of taste 
    ; and of usage 
    (newline-and-indent) 
    (goto-char (+ pos (- (point-max) cur-max))))) 

Speranza che aiuta.

+1

Interessante. IIUC, la tua soluzione mantiene il cursore fermo e "auto-yanks" in una riga correttamente rientrata sopra. Penso che potrebbe adattarsi al mio schema di utilizzo meglio di quello che ho chiesto. Grazie :-) – thebjorn

+1

Il codice dovrebbe usare 'save-excursion', dovrebbe evitare di usare' yank', e dovrebbe essere generale da gestire quando il testo non si trova alla fine del buffer ('point-max'). – ashawley

+0

@aaronhawley - perché "salva-escursione"? Non cambio contrassegno che gestisco correttamente il punto, e il codice di cui sopra difficilmente provocherà una cotta del buffer. Puoi essere più specifico riguardo al caso "quando il testo non è alla fine del buffer", fa la stessa cosa ogni volta che il punto è al momento della chiamata – Serge

3

Ecco cosa puoi fare se non sei un ragazzo emacs.

Emacs ha una cosa record-macro, kmacro-start-macro e kmacro-end-macro.

Dopo aver registrato la macro, fare name-last-kbd-macro. quindi visita .emacs e inserisci insert-kbd-macro.

Si ha quindi un'istruzione fset che definisce la macro. Può sembrare divertente, e non è così mantenibile come elisp, ma se lo inserisci nel tuo .emacs, quella macro (con quel nome) sarà disponibile per qualsiasi sessione di editing. E puoi legarlo anche a una sequenza di tasti.

3

Probabilmente una cattiva forma per rispondere alla mia stessa domanda, ma la risposta di Cheeso mi ha motivato a fare un po 'di programmazione lisp per la seconda volta in dieci anni (la mia versione originale era una macro tastiera denominata, ma ha fatto un passo su tutto il kill/mark- anelli). Ecco quello che mi è venuta

(defun insert-and-indent-line-above() 
    (interactive) 
    (push-mark) 
    (let* 
    ((ipt (progn (back-to-indentation) (point))) 
    (bol (progn (move-beginning-of-line 1) (point))) 
    (indent (buffer-substring bol ipt))) 
    (newline) 
    (previous-line) 
    (insert indent))) 

(global-set-key [ (control return) ] 'insert-and-indent-line-above) 

ci sono probabilmente molti modi migliori di fare questo, ma due ore di Lisp-hacking difficilmente può essere definito il tempo sprecato :-)

3

Basta tenere il vostro pensiero sulla variabile dichiarazione, finisci di digitare la tua dichiarazione, quindi digita RET (anche se Cj di solito è più DWIM) e digita la tua prossima riga per la dichiarazione della variabile, quindi premi Cx Ct per trasporre le righe.

+3

Se potessi tenere il mio pensiero fino a quando non avessi raggiunto la fine della linea, questo non sarebbe un problema - capirai quando diventerai "più vecchio" ;-) – thebjorn