Я хочу иметь возможность переключаться между двумя буферами в 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>
вымирать.