Перегрузка связывания клавиш в Emacs - PullRequest
5 голосов
/ 10 сентября 2011

Я просмотрел ряд других вопросов и файлов в поисках чего-то, что я мог бы изменить в соответствии со своими потребностями, но у меня возникли проблемы, поэтому я обратился к экспертам.

В любом случае естьКлавиша ведет себя по-разному в зависимости от того, где в строке находится курсор?

Чтобы быть более точным, я бы хотел отобразить клавишу табуляции, чтобы перейти к концу строки, если я нахожусь в серединестрока, но работает как табуляция, как обычно, если мой курсор расположен в начале строки.

До сих пор у меня есть фигурные скобки и автопары для кавычек и перепозиционирование внутри них для C ++ / Java и т. д.Я хотел бы использовать клавишу табуляции для конца строки, если, например, функция не имеет аргументов.

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011

Поведение по-разному в зависимости от того, где находится точка на линии, является легким битом (см. (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.
1 голос
/ 10 сентября 2011

На этой странице Emacs Wiki перечислено несколько пакетов (smarttab и т. Д.), Которые заставляют TAB делать разные вещи в зависимости от контекста. Вероятно, вы можете изменить один из них, чтобы делать то, что вы хотите.

...