tab-magic v. 0.2
Продолжаем попытки повесить на клавишу Tab в Emacs все действия сразу. Первое нажатие выравнивает строку согласно лексеру, второе- динамическое дополнение (dabbrev, если возможно), или переключение между окнами, если дополнение не было найдено. Также стоит запретить dabbrev искать по остальным открытым буферам - иначе не будет работать правильно.
(defun tab-magic ()
"Разные контекстные действия для Tab"
(interactive)
(let ((len (- (line-end-position) (line-beginning-position))))
(defvar dabbrev-state nil)
(defun dabbrev-point ()
(if (boundp 'dabbrev--last-expansion-location)
(format "%s" dabbrev--last-expansion-location)
nil))
(defun work-w-code ()
(setq dabbrev-state (dabbrev-point))
(indent-for-tab-command)
(if (= (- (line-end-position) (line-beginning-position)) len)
(unwind-protect
(call-interactively 'dabbrev-expand)
(if (string= dabbrev-state (dabbrev-point))
(other-window 1)
(setq dabbrev-state (dabbrev-point))))))
;; Настройки отдельных режимов (пример)
(cond ((minibufferp) (minibuffer-complete))
;; 1
((eq major-mode 'org-mode) (if (org-at-heading-p)
(org-cycle)
(other-window 1)))
;; 2
((eq major-mode 'emacs-lisp-mode) (work-w-code))
;; 3
((eq major-mode 'sh-mode) (work-w-code))
;; 4
(t (other-window 1))
)))
Отправить комментарий