Domanda

Nel mio .emac ho la seguente funzione che traspone una linea

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

E associo una chiave in questo modo

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

Tuttavia, voglio associare M-up a move-line (-1) ma non riesco a farlo correttamente:

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

Come definisco quanto sopra usando global-set-key per chiamare move-line -1?

È stato utile?

Soluzione

Non pochi minuti dopo aver posto la domanda, l'ho capito copiando + incollando il codice. Tuttavia non ho idea di come funzioni.

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

Altri suggerimenti

global-set-key accetta solo 2 argomenti: la sequenza di tasti e il comando che si desidera associare ad esso. Quindi

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

funziona bene. Ma se vuoi usare la linea di movimento con un argomento, devi avvolgerlo in una funzione anonima (alias lamba) in modo che si presenti in chiave globale come un unico valore.

Potresti voler dare un'occhiata al " transpose-lines " funzione integrata.

L'ho trovato quando ho avuto lo stesso problema, ma ho finito per risolverlo in un altro modo.

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

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

Sicuramente non è una soluzione perfetta, dal momento che M-<down> potrebbe essere riassegnato e C-u -1 potrebbe non avere senso su di esso, ma poiché è solo il mio file init locale, non dovrebbe essere un problema.

Anche questo ovvio funziona bene solo per i comandi da tastiera che vuoi invertire.

Puoi semplicemente chiedere il numero di righe che desideri e convertire la stringa di input in un numero intero:

(global-set-key (kbd "M-<up>") 
  (lambda () 
    (interactive) 
    (move-line (string-to-int (read-string "Lines: ")))))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top