Я решил промочить пальцы на ногах, так как хочу, чтобы emacs вел себя немного лучше, когда нажимал TAB .Моя команда работает нормально.Он просто выполняет indent-for-tab-command
и, если ничего не происходит, он выполняет tab-to-tab-stop
, исходя из предположения, что вряд ли я нажму TAB , просто чтобы получить точку отказа в бюджете, когда я нахожусь в многострочном режиместрока или что-то подобное.После первого нажатия TAB он продолжает выполнять tab-to-tab-stop
, пока редактирование не возобновится или точка не будет перемещена в другое место.AFAIK, моя логика в порядке, хотя мой код lisp, вероятно, нет!
Первоначально я просто взломал это в своих точечных файлах emacs, выполнив (local-set-key (kbd "TAB") 'tab-dwim)
для основных режимов, где я хотел этого поведения.Это сработало, как и ожидалось.
Затем я решил, что то, что я делал, было в основном второстепенным режимом, поэтому я попытался перевести привязку клавиш в минорный режим.По какой-то причине, даже если включен второстепенный режим (как указано в строке режима и только после его включения и выключения), моя функция tab-dwim
не вызывается, когда я нажимаю TAB ключ.Я все еще могу вызывать его с Mx , как и ожидалось.
Что я делаю не так с моим второстепенным режимом :keymap
?
;;;
;; TAB DWIM
; buffer-local before/after point tracking
(setq point-before-tab nil)
(setq point-after-tab nil)
(make-local-variable 'point-before-tab)
(make-local-variable 'point-after-tab)
(defun tab-dwim ()
"Indents normally once, then switches to tab-to-tab-stop if invoked again.
tab-dwim will always perform tab-to-tab-stop if the first TAB press does not
cause the point to move."
(interactive)
(print "in tab-dwim now") ; THIS LINE IS NEVER INVOKED ON TAB?
(setq point-before-tab (point))
(if (eq point-before-tab point-after-tab) ; pressed TAB again
(tab-to-tab-stop)
(indent-for-tab-command))
(if (eq (point) point-before-tab) ; point didn't move
(tab-to-tab-stop))
(setq point-after-tab (point)))
(define-minor-mode tab-dwim-mode
"Toggle tab-dwim-mode.
With a non-nil argument, turns on tab-dwim-mode. With a nil argument, turns it
off.
When tab-dwim-mode is enabled, pressing the TAB key once will behave as normal,
but pressing it subsequent times, will continue to indent, using
tab-to-tab-stop.
If tab-dwim determines that the first TAB key press resulted in no movement of
the point, it will indent according to tab-to-tab-stop instead."
:init-value nil
:lighter " DWIM"
:keymap
'(([TAB] . tab-dwim)))
(provide 'tab-dwim)
Приветствия,
Chris