Связывание M- <up>/ M- <down>в Emacs 23.1.1 - PullRequest
22 голосов
/ 04 декабря 2010

Я пытаюсь добавить функцию, которую мне не хватает в 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)

И С-ч с просто возвращает:

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

Ничего из этого не работает, используя ESC или Alt .

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

Редактировать

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

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

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

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

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

Ответы [ 6 ]

20 голосов
/ 05 декабря 2010

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-последовательностях, которые Ваш терминал использует для кодирования этих комбинаций клавиш.

7 голосов
/ 04 декабря 2010

Я всегда использую Ch k (ключ) (то есть 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>") все еще работает для меня.

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

5 голосов
/ 04 декабря 2010
(global-set-key [M-up] 'beginning-of-buffer)
(global-set-key [M-down] 'end-of-buffer)

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

4 голосов
/ 04 декабря 2010

уродливый обходной путь:

Я набрал Cq он выдал ^[[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), поэтому привязки клавиш работают.

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

1 голос
/ 08 июля 2017

Следующие строки работают для меня на 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)
0 голосов
/ 05 декабря 2010

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

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