2012-06-29 3 views
5

В VIM можно использовать %, чтобы указать текущее имя файла при вызове команды оболочки. Может ли кто-нибудь указать Меня в направлении документации, показывающей, что эквивалент находится в emacs?Emacs эквивалентен VIM `%`?

+2

[buffer-file-name] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Buffer-File-Name.html) – jfs

+1

В Emacs нет эквивалента. 'buffer-file-name' является переменной Elisp и не может использоваться в командной строке оболочки. –

+1

Перекрестная связь с [Передача переменных Emacs в команды оболочки минибуфера] (http://stackoverflow.com/questions/10121944/passing-emacs-variables-to-minibuffer-shell-commands) (что в основном является дубликатом, за исключением того, что два вопроса исходят из существенно разных углов). – phils

ответ

4

Существует не один. Но это Emacs! Так вот:

(defun my-shell-command-on-current-file (command &optional output-buffer error-buffer) 
    "Run a shell command on the current file (or marked dired files). 
In the shell command, the file(s) will be substituted wherever a '%' is." 
    (interactive (list (read-from-minibuffer "Shell command: " 
              nil nil nil 'shell-command-history) 
        current-prefix-arg 
        shell-command-default-error-buffer)) 
    (cond ((buffer-file-name) 
     (setq command (replace-regexp-in-string "%" (buffer-file-name) command nil t))) 
     ((and (equal major-mode 'dired-mode) (save-excursion (dired-move-to-filename))) 
     (setq command (replace-regexp-in-string "%" (mapconcat 'identity (dired-get-marked-files) " ") command nil t)))) 
    (shell-command command output-buffer error-buffer)) 

(global-set-key (kbd "M-!") 'my-shell-command-on-current-file) 
1

Вы можете использовать это, когда минибуфер ожидает, что вы что-то типа (предостережение: не работает с Идо, но, очевидно, вы всегда можете выйти из этого, например, с С-й С-е). Вы также можете использовать его в обычных буферах.

(defun insert-filename-or-buffername (&optional arg) 
    "If the buffer has a file, insert the base name of that file. 
    Otherwise insert the buffer name. With prefix argument, insert the full file name." 
    (interactive "P") 
    (let* ((buffer (window-buffer (minibuffer-selected-window))) 
     (file-path-maybe (buffer-file-name buffer))) 
    (insert (if file-path-maybe 
       (if arg 
        file-path-maybe 
        (file-name-nondirectory file-path-maybe)) 
       (buffer-name buffer))))) 

(define-key minibuffer-local-map (kbd "C-c f") 'insert-filename-or-buffername) 
0

в моем случае, используя Emacs 24 версии с графическим интерфейсом из доморощенного .... Я вижу имя файла в качестве 3-го элемента из нижнего левого угла (минор)-бар-мод, чуть выше мини-буфер.

Чтобы увидеть, где я, используя ido-mode, я просто делаю C-x C-f В этом нет необходимости.

Смежные вопросы