2009-06-23 14 views
19

En mis .emacs tengo la siguiente función que transpone una línea.emacs global-set-key y llamar a la función interactiva con el argumento

(defun move-line (n) 
    "Move the current line up or down by N lines." 
    (interactive "p") 
    (let ((col (current-column)) 
     start 
     end) 
    (beginning-of-line) 
    (setq start (point)) 
    (end-of-line) 
    (forward-char) 
    (setq end (point)) 
    (let ((line-text (delete-and-extract-region start end))) 
     (forward-line n) 
     (insert line-text) 
     ;; restore point to original column in moved line 
     (forward-line -1) 
     (forward-char col)))) 

Y vincular una clave para ello como esto

(global-set-key (kbd "M-<down>") 'move-line) 
;; this is the same as M-x global-set-key <return> 

Sin embargo, quiero unir M-arriba para mover la línea (-1) Pero parece que no puede ser capaz de hacerlo correctamente:

;; M-- M-1 M-x global-set-key <return> 

¿Cómo defino lo anterior utilizando global-set-key para llamar a move-line -1?

+5

Just FYI: hay una función transpose-lines integrada en emacs. Pruebe el atajo C-x C-t. – polyglot

Respuesta

31

Minutos después de hacer la pregunta, lo descubrí copiando y pegando el código. Sin embargo, no tengo idea de cómo funciona.

(global-set-key (kbd "M-<up>") (lambda() (interactive) (move-line -1))) 
+6

Crea una función anomynous ('lambda') que es solo un contenedor para su función llamada con el argumento' -1'. Busque en Internet o en emacs la información de 'lambda' si desea obtener más información. – danielpoe

+0

Me gusta este estilo de configuración de enlaces de teclas para funciones de contenedor. Ahorra basura en el espacio de nombres y me parece que se lee mejor. Supongo que también puedes crear una macro útil: '(cmd (move-line -1))'. – d11wtq

+1

También información importante además de lo que dice danielpoe: el '(interactivo)' es necesario en cualquier función de lisp que esté destinada a "interactuar" con el usuario, ya sea mediante combinaciones de teclas u otros métodos. Eso es lo que le permite tener un límite de clave. Si no tiene '(interactivo)' en su función, solo _sólo_ puede ser llamado desde otro código. – buggy3

8

global-set-key solo toma 2 argumentos: la secuencia de teclas y el comando que desea vincular. Entonces

(global-set-key (kbd "M-<down>") 'move-line) 

funciona bien. Pero si desea usar move-line con un argumento, debe envolverlo en una función anónima (aka lamba) para que se presente en global-set-key como un valor.

2

Es posible que desee comprobar la función incorporada "transpose-lines".

0

Encontré esto cuando tuve el mismo problema, pero terminé resolviéndolo de otra manera.

(global-set-key (kbd "M-<down>") 'move-line) 

(global-set-key (kbd "M-<up>") (kbd "C-u -1 M-<down>")) 

Definitivamente no es una solución perfecta, ya que podrían ser reasignados M-<down> y C-u -1 que no tenga sentido en él, pero ya que es sólo mi archivo de inicio local, se debería haber ningún problema.

También esto obvio solo funciona bien para comandos de teclado que desea invertir.

Cuestiones relacionadas