Назад | Перейти на главную страницу

Проблема с привязкой клавиш 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).

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

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

Есть ли способ решить эту проблему?

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

К сожалению, для клиента 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> в моем терминале.

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

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