Подтвердить что ты не робот

.emacs global-set-key и вызов интерактивной функции с аргументом

В моих .emacs у меня есть следующая функция, которая переносит строку

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

И я привязываю к нему ключ вроде этого

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

Однако я хочу привязать M-up к move-line (-1). Но я не могу сделать это правильно:

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

Как определить выше, используя глобальный набор-ключ, для вызова строки перемещения -1?

4b9b3361

Ответ 1

Через несколько минут после того, как задал вопрос, я понял это путем копирования + вставки кода. Однако я не знаю, как это работает.

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

Ответ 2

global-set-key принимает только 2 аргумента: последовательность клавиш и команду, которую вы хотите привязать к ней. Итак,

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

работает отлично. Но если вы хотите использовать перемещение с аргументом, вам нужно обернуть его в анонимную функцию (aka lamba), чтобы она представляла собой глобальный набор-ключ как одно значение.

Ответ 3

Возможно, вы захотите проверить встроенную функцию "transpose-lines".

Ответ 4

Я нашел это, когда у меня была такая же проблема, но я решил это другим способом.

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

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

Определенно не идеальное решение, так как M-<down> можно переназначить, а C-u -1 может не иметь смысла на нем, но поскольку это только мой локальный файл инициализации, это не должно быть проблемой.

Также это очевидное только хорошо работает для команд клавиатуры, которые вы хотите изменить.

Ответ 5

Вы можете просто запросить желаемое количество строк и преобразовать входную строку в целое число:

(global-set-key (kbd "M-<up>") 
  (lambda () 
    (interactive) 
    (move-line (string-to-int (read-string "Lines: ")))))