LINUX.ORG.RU

[emacs] expand-abbrev in minibuffer


0

0

B настройках (взято из /usr/share/info/tramp.gz, одно сокращение в таблице - в целях краткости):

(define-abbrev-table 'my-dir-abbrev-table
  '(("s" "~/local/share"))
  :case-fixed :regexp "/\\(\\w+\\)")

(add-hook
 'minibuffer-setup-hook
 (lambda ()
   (abbrev-mode 1)
   (setq local-abbrev-table my-dir-abbrev-table)))

(defadvice minibuffer-complete
  (before my-minibuffer-complete activate)
  (expand-abbrev))

но в этом случае дополнение работает не только когда в минибуффере «Find file: {~/.emacs.d/} /s», но и когда «Find file: ~/.emacs.d/s», что нежелательно.

Если в «regexp» дописать в начале '^', то оба варианта не работают.

Существует ли негромоздкий способ заставить работать expansion только для первого случая, заранее спасибо.

★★

Ответ на: комментарий от Zubok

> directory-abbrev-alist

насколько я понял... это недополняемое сокращение, оно не будет реагировать на <Tab> etc. dired-mode не всегда удобнее, особенно если я знаю путь

то есть нужны сокращения для директорий, но которые еще в минибуфере заменялись бы соответсвующим путем

n01r ★★ ()
Ответ на: комментарий от n01r

Честно, я не пробовал. Но есть функция abbreviate-file-name, которую можно выбрать, чтобы она раскрыла путь по TAB.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

abbreviate-file-name

thx... Попробовал наваять замену, хоть `dolist' по `directory-abbrev-alist' не надо писать... вроде работает (не знаю насколько кошерно и какой оверхэд):

(defun my-abbrev-expand ()
 (let* ((beg (line-beginning-position)) (end (point))
	 (abbrev (abbreviate-file-name (buffer-substring beg end))))
   (unless (null abbrev)
     (progn (delete-region beg end) (insert abbrev)))))

(defadvice minibuffer-complete
  (before my-minibuffer-complete activate)
  (my-abbrev-expand))

Еще раз посмотрел доки к `define-abbrev-table', можно было добавить: ":enable-function (lambda() (< (- (point) (line-beginning-position)) 4))"... но как-то костыльно.

n01r ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.