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

Binding M- <up>/M- <down> в Emacs 23.1.1

Я пытаюсь включить функцию, которую я пропустил из Eclipse, где Alt + [Up/Down] переносит линии вверх или вниз, но не может на всю жизнь выяснить, как для правильного назначения этих клавиш. Я использую его в режиме -nw (так просто в окне оболочки) и обычно запускаюсь в сеансе экрана.

Используя глобальное связывание ключей, я могу заставить его работать с комбинациями букв, например (kbd "M-m"), но каждая комбинация, которую я пробовала для клавиш со стрелками, просто дает мне сообщение, которое не имеет смысла, я всегда получаю:

"ESC <up> is undefined"

Что я пробовал:

(global-set-key (kbd "M-<up>") 'transpose-line-up)    
(global-set-key (kbd "<escape>-<up>") 'transpose-line-up)
(global-set-key [M-up] 'transpose-line-up)
(global-set-key [\e \M-O A] 'transpose-line-up)

И C-h c просто возвращает:

ESC <up> (translated from ESC M-O A) is undefined

Ни одна из этих функций не работает, используя ESC или Alt.

Любая идея, как я могу сделать эту работу? Я бы предпочел иметь их как Alt + [Up/Down] только потому, что это то, к чему я привык.

Edit

Из комментариев:

  • C-q Up печатает ^[OA.

  • C-q M-Up выводит ^[ и перемещает курсор вверх по строке.

  • C-h k (Alt + Up) печатает ESC <up> (translated from ESC M-O A) is undefined.

Спасибо за предложения, но все они оказались одинаковыми.

4b9b3361

Ответ 1

Emacs имеет сложный механизм для обработки перипетий кодов функциональных клавиш и модификаторов для различных типов терминалов. Во всех случаях это не работает. На вашем терминале должны работать следующие настройки:

(define-key input-decode-map "\e\eOA" [(meta up)])
(define-key input-decode-map "\e\eOB" [(meta down)])
(global-set-key [(meta up)] 'transpose-line-up)
(global-set-key [(meta down)] 'transpose-line-down)

Вы можете использовать (kbd "<M-up>") и (kbd "<M-down>") вместо [(meta up)] и [(meta down)], если вы сделали шаг с сообщением Emacs (через input-decode-map) об escape-последовательностях, которые ваш терминал использует для кодирования этих комбинаций клавиш.

Ответ 2

Я всегда использую C-h k (key) (т.е. describe-key), чтобы узнать, как Emacs ссылается на (ключ), а затем используйте (kbd) с той же самой строкой, чтобы использовать его.

В этом случае describe-key возвращает <M-up>, поэтому я бы использовал (global-set-key (kbd "<M-up>") 'transpose-line-up) (точно так же, как это сделал Дж. Ф. Себастьян).

Edit:

Запуск emacs -nw (но не через экран), отчеты описания-ключа ESC <up> (translated from ESC M-[ A) и (kbd "ESC <up>") успешны для его привязки.

Запуск screen emacs -nw, описание-ключевые отчеты ESC <up> (translated from ESC M-O A), которые, похоже, соответствуют тому, что вы видите, и привязка для (kbd "ESC <up>") все еще работает для меня.

(n.b. Протестировано под Cygwin с экраном 4.00.03 и Emacs 23.2.1.)

Ответ 3

(global-set-key [M-up] 'beginning-of-buffer)
(global-set-key [M-down] 'end-of-buffer)

В моем OSX у меня есть это определение, чтобы выполнить Alt-up/down, чтобы перейти в верхнюю/нижнюю часть буфера.

Ответ 4

уродливое обходное решение:

Я набрал C-q <M-up>, он произвел ^[[1;3A на терминале внутри screen внутри emacs.

(global-set-key (kbd "<M-up>") 'transpose-line-up)
(global-set-key (kbd "^[[1;3A") 'transpose-line-up)

У меня есть Lisp error: (void-function transpose-line-up), поэтому привязки клавиш работают.

Примечание: C-q запускает команду quoted-insert.

Ответ 5

Предполагая, что у вас уже определены функции transpose-line-up и transpose-line-down (как представляется, из кода примера в исходном вопросе):

(global-set-key [(meta up)] 'transpose-line-up)
(global-set-key [(meta down)] 'transpose-line-down)

Ответ 6

Следующие строки работают для меня на macOS 10.11.6 и GNU Emacs 25.2.1:

(global-set-key (kbd "ESC <down>") 'end-of-buffer)
(global-set-key (kbd "ESC <up>") 'beginning-of-buffer)