Проблема с сочетанием клавиш 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>
вымирать.