Проблема с сочетанием клавиш Ctrl Tab в Emacs в gnome-Terminal

Я хочу иметь возможность переворачиваться назад и вперед между двумя буферами в Emacs таким же образом, как я могу переключаться между вкладками в некоторых других редакторах. Следующая привязка клавиш Ctrl + TAB прекрасно работает в XEmacs:

(defun buffer-shimmy ()
  "Back to the previous buffer"
  (interactive)
  (let ((buff (car (buffer-list))))
    (message "Previous buffer: %s" buff)
    (switch-to-buffer (other-buffer buff))
   )
)
(global-set-key (kbd "<C-tab>") 'buffer-shimmy)
;; or (define-key global-map [(control tab)] 'buffer-shimmy) 

Однако это не работает, когда я открываю Emacs с помощью "emacs -nw" (или если я использую Emacs в сеансе SSH).

После нахождения этой ссылки - думаю, что то, что я хочу, не возможно?

По-видимому, в терминале (то есть вне системы Windowing) добавление модификатора управления к символу ASCII для "TAB" не имеет смысла. Принимая во внимание, что, проходя через систему управления окнами, Emacs может видеть, что вы нажимаете Ctrl + TAB как <tab> с модификатором управления, который может быть представлен в .emacs подать как C-<tab> или же <C-tab> или же [(control tab)],

Есть ли обходной путь, который решает эту проблему?

Эталонное программное обеспечение: версия Emacs: 22.2.1 в Ubuntu 9.04 с использованием gnome-терминала с профилем по умолчанию.

1 ответ

К сожалению, не существует единого решения, подходящего для этого решения для клиента emacs, работающего в окне терминала. Проблема возникает потому, что <TAB> символ определяется как CTRL-I, так CTRL-<TAB> будет означать CTRL-CTRL-Iи так не возможно.

Когда emacs работает в оконном режиме, он получает данные непосредственно от нажатия клавиш. Когда он запускается внутри терминала (или если он прояснит, почему он не работает - по ssh-соединению), вход поступает от ввода-вывода терминала. Это терминальная программа, которая считывает события аппаратных клавиш и генерирует входной поток (не очень точный, но освещающий проблему). Emacs читает поток ввода и преобразует в события нажатия клавиш. Поскольку emacs не может получить доступ к событиям аппаратного ключа, это связано с ограничениями среды терминала.

Для некоторых терминальных программ может быть возможно сгенерировать пользовательскую последовательность ввода (например, когда вы нажимаете F1) когда вы нажимаете CTRL-<Tab>что может быть интерпретировано Emacs как CTRL-<Tab>, Пример фрагмента, чтобы сделать это для CTRL-<Home> является:

(when (not window-system)
  ; Fixup missing console keys
  (define-key key-translation-map (kbd "M-[ 4 ^") (kbd "C-<end>"))
  (define-key key-translation-map (kbd "M-[ 1 ^") (kbd "C-<home>")))

В этом примере M-[ 1 ^ последовательность ввода генерируется при нажатии CTRL-<Home> в моем терминале.

Это не очень портативное решение (в основном я использую putty для доступа к своему linux box из окон, и это не позволяет), поэтому ваш пробег может отличаться.

В конце концов, я решил использовать другую привязку клавиш на моем.emacs и позволить мышечной памяти CTRL-<TAB> вымирать.

Другие вопросы по тегам