В Emacs, как вставить имя файла в shell-команду?
Я использую shell-команду lots (по умолчанию привязан к M-!), но часто я делаю вещи в буфер, который я сейчас редактирую. Вместо того, чтобы вводить имя буфера (и никакое завершение имени файла не доступно в командной оболочке, увы!), Было бы неплохо иметь комбинацию клавиш, скажем, f3, чтобы вставить это имя для меня всякий раз, когда я нажимаю клавишу.
Проблема в том, что я не хочу привязывать ключ глобально (я использую f3 для других вещей в другом контексте), только в минибуфере, когда запрашивается командная оболочка. Легко написать функцию lisp, чтобы вставить имя текущего буфера, но какую комбинацию клавиш следует изменить для привязки ключа к этой функции?
В качестве альтернативы существует ли какой-либо lisp код/пакет, обеспечивающий завершение имени файла в командной оболочке, аналогично тому, как это делает bash? Я знаю, что обычная оболочка M-x завершает работу, но удобство ввода команды в минибуфере трудно отказаться;)
Edit:
вот что я хотел, взятый из huaiyuan ответить на некоторые исправления, вдохновленные/украденные из http://osdir.com/ml/emacs.sources/2002-04/msg00022.html
(define-key minibuffer-local-map
[f3] (lambda () (interactive)
(insert (buffer-name (current-buffer-not-mini)))))
(defun current-buffer-not-mini ()
"Return current-buffer if current buffer is not the *mini-buffer*
else return buffer before minibuf is activated."
(if (not (window-minibuffer-p)) (current-buffer)
(if (eq (get-lru-window) (next-window))
(window-buffer (previous-window)) (window-buffer (next-window)))))
Ответы
Ответ 1
(define-key minibuffer-local-map
[f3] (lambda () (interactive) (insert (buffer-name))))
Edit:
Как указано в разделе комментариев и в другом месте, приведенный выше фрагмент кода не работает. (Извините, я должен был протестировать его перед публикацией.:) Некоторые исправления были опубликованы; вот еще одно:
(define-key minibuffer-local-map [f3]
(lambda () (interactive)
(insert (buffer-name (window-buffer (minibuffer-selected-window))))))
Что касается завершения имени файла при выпуске shell-command
, возможно, этот kludge будет работать (он работает для меня на Emacs 23.0.60):
(require 'shell)
(define-key minibuffer-local-map (kbd "C-i") 'comint-dynamic-complete)
Ответ 2
Здесь, как исправить решение huaiyuan:
(define-key minibuffer-local-map [f3]
(lambda() (interactive) (insert (buffer-file-name (nth 1 (buffer-list))))))
Вероятно, вы должны добавить некоторую проверку ошибок, если "другой" буфер не имеет имени файла и (имя-буфер-имя) возвращает nil.
Ответ 3
Я отнесусь к huaiyuan о том, что вы просили, но вы также можете проверить Фильтрация текста через оболочку команды в Emacs в качестве возможного альтернативного подхода.