Ответ 1
Через несколько минут после того, как задал вопрос, я понял это путем копирования + вставки кода. Однако я не знаю, как это работает.
(global-set-key (kbd "M-<up>") (lambda () (interactive) (move-line -1)))
В моих .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?
Через несколько минут после того, как задал вопрос, я понял это путем копирования + вставки кода. Однако я не знаю, как это работает.
(global-set-key (kbd "M-<up>") (lambda () (interactive) (move-line -1)))
global-set-key принимает только 2 аргумента: последовательность клавиш и команду, которую вы хотите привязать к ней. Итак,
(global-set-key (kbd "M-<down>") 'move-line)
работает отлично. Но если вы хотите использовать перемещение с аргументом, вам нужно обернуть его в анонимную функцию (aka lamba), чтобы она представляла собой глобальный набор-ключ как одно значение.
Возможно, вы захотите проверить встроенную функцию "transpose-lines".
Я нашел это, когда у меня была такая же проблема, но я решил это другим способом.
(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
может не иметь смысла на нем, но поскольку это только мой локальный файл инициализации, это не должно быть проблемой.
Также это очевидное только хорошо работает для команд клавиатуры, которые вы хотите изменить.
Вы можете просто запросить желаемое количество строк и преобразовать входную строку в целое число:
(global-set-key (kbd "M-<up>")
(lambda ()
(interactive)
(move-line (string-to-int (read-string "Lines: ")))))