В Emacs, как вставить имя файла в shell-команду? - PullRequest
18 голосов
/ 18 января 2009

Я часто пользуюсь командой shell (по умолчанию она связана с M-!), Но часто я делаю что-то с буфером, который я сейчас редактирую. Вместо того, чтобы вводить имя буфера (и завершение имени файла в команде shell недоступно, увы!), Было бы хорошо иметь горячую клавишу, скажем, f3, чтобы вставить это имя для меня всякий раз, когда я нажимаю клавишу. *

Проблема в том, что я не хочу связывать ключ глобально (я использую f3 для других вещей в другом контексте), только в минибуфере, когда команда оболочки запрашивает. Легко написать функцию lisp, чтобы вставить текущее имя буфера, но какой режим клавиатуры мне следует изменить, чтобы привязать ключ к этой функции?

В качестве альтернативы, есть ли какой-нибудь код / ​​пакет lisp, который обеспечивает завершение имени файла в команде shell, подобно тому, как это делает 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)))))

Ответы [ 3 ]

10 голосов
/ 18 января 2009
(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)
7 голосов
/ 18 января 2009

Вот как исправить решение huaiyuan:

(define-key minibuffer-local-map [f3]
  (lambda() (interactive) (insert (buffer-file-name (nth 1 (buffer-list))))))

Вы, вероятно, должны добавить какую-то проверку ошибок, если в буфере "other" не задано имя файла и (buffer-file-name) возвращает nil.

2 голосов
/ 18 января 2009

Я отложу до huaiyuan именно то, что вы просили, но вы также можете проверить Фильтрация текста через команду оболочки в Emacs в качестве возможного альтернативного подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...