Перегрузка связывания клавиш в Emacs
Я просмотрел ряд других вопросов и файлов в поисках чего-то, что я мог бы изменить в соответствии со своими потребностями, но у меня возникли проблемы, поэтому я пришел к экспертам.
Есть ли в любом случае поведение клавиши по-разному в зависимости от того, где в строке находится курсор?
Чтобы быть более точным, я хотел бы сопоставить клавишу табуляции, чтобы перейти к концу строки, если я нахожусь в середине строки, но работать как вкладка обычно, если бы мой курсор был расположен в начале строки.
До сих пор у меня есть фигурные скобки и кавычки для автоматического сопряжения и перемещения курсора внутри них для C++/Java и т. Д. Я хотел бы использовать клавишу табуляции для конца строки, если, например, функция не имеет аргументов,
2 ответа
Поведение по-разному в зависимости от того, где находится точка на линии, является легким битом (см. (if (looking-back "^") ...)
в коде). "[Работать], как обычно, вкладка" - сложнее, так как это контекстуально.
Вот один из подходов, но позже я подумал, что более надежным методом будет определение второстепенного режима со своей собственной привязкой для TAB и предоставление этой функции динамического поиска резервной привязки. Я не был уверен, как это сделать, но есть решение:
Резервная привязка ключей Emacs
(defvar my-major-mode-tab-function-alist nil)
(defmacro make-my-tab-function ()
"Return a major mode-specific function suitable for binding to TAB.
Performs the original TAB behaviour when point is at the beginning of
a line, and moves point to the end of the line otherwise."
;; If we have already defined a custom function for this mode,
;; return that (otherwise that would be our fall-back function).
(or (cdr (assq major-mode my-major-mode-tab-function-alist))
;; Otherwise find the current binding for this mode, and
;; specify it as the fall-back for our custom function.
(let ((original-tab-function (key-binding (kbd "TAB") t)))
`(let ((new-tab-function
(lambda ()
(interactive)
(if (looking-back "^") ;; point is at bol
(,original-tab-function)
(move-end-of-line nil)))))
(add-to-list 'my-major-mode-tab-function-alist
(cons ',major-mode new-tab-function))
new-tab-function))))
(add-hook
'java-mode-hook
(lambda () (local-set-key (kbd "TAB") (make-my-tab-function)))
t) ;; Append, so that we run after the other hooks.
На этой странице Emacs Wiki перечислено несколько пакетов (smarttab и т. Д.), Которые заставляют TAB делать разные вещи в зависимости от контекста. Вы, вероятно, можете изменить один из них, чтобы делать то, что вы хотите.