2009-03-07 14 views
10

Con frecuencia me encuentro escribiendo en una línea, cuando me doy cuenta de que necesito (ed) una definición variable (o algo similar) en la línea superior. Lo que me gustaría esComando Emacs para insertar y sangrar línea encima del cursor

  1. presione C-retorno desde cualquier punto de una línea y tienen el cursor se mueva a una línea en blanco insertado anteriormente, con la sangría correcta (o al menos lo mismo que la línea original).
  2. ser capaz de tirar de cualquier texto ...
  3. y Cu C-espacio para volver a la posición original

He conseguido hacer # 1, pero mi emacs-fu no es lo suficientemente fuerte como para hacer el resto.

Respuesta

6

Aquí es mi humilde solución:

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

espero que ayude.

+1

Interesante. IIUC, su solución mantiene el cursor estacionario y "auto-tira" en una línea correctamente sangrada arriba. Creo que podría adaptarse a mi patrón de uso mejor de lo que pedí. Gracias :-) – thebjorn

+1

El código debe usar 'save-excursion', debe evitar el uso de' yank', y debe ser general para manejar cuando el texto no está al final del búfer ('point-max'). – ashawley

+0

@aaronhawley: ¿por qué 'save-excursion'? No cambio la marca que manejo correctamente, y el código anterior difícilmente provocará un aplastamiento del buffer. Puede ser más específico sobre el caso "cuando el texto no está al final del búfer", hace lo mismo cada vez que el punto es en el momento de la invocación – Serge

3

Esto es lo que puede hacer si no es un maestro de Zen emacs.

Emacs tiene una macro de registro, kmacro-start-macro y kmacro-end-macro.

Después de registrar su macro, haga name-last-kbd-macro. luego visita .emacs, e inserta-kbd-macro.

Luego tiene una instrucción fset que define su macro. Puede parecer extraño, y no es tan fácil de mantener como elisp, pero si lo rellena en sus archivos .emacs, esa macro (con ese nombre) estará disponible para cualquiera de sus sesiones de edición. Y también puedes vincularlo a una secuencia de teclas.

3

Probablemente mala forma de responder mi propia pregunta, pero la respuesta de Cheeso me motivó a hacer algo de programación de lisp por segunda vez en diez años (mi versión original era una macro de teclado con nombre, pero pasó por encima del kill/mark- anillos). Esto es lo que ocurrió con

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

probablemente hay muchas mejores maneras de hacer esto, pero dos horas de Lisp-piratería no se puede calificar la pérdida de tiempo :-)

3

acaba de celebrar su pensamiento sobre la variable declaración, termine de escribir su declaración, luego escriba RET (aunque Cj suele ser más DWIM) y escriba su próxima línea para la declaración de la variable, luego presione Cx Ct para transponer las líneas.

+3

Si pudiera mantener mi pensamiento hasta que llegara al final de la línea, esto no sería un problema - lo entenderá cuando sea "mayor" ;-) – thebjorn

Cuestiones relacionadas