Как получить имя текущего буфера в Emacs?

19

Одна из основных функций, которые я пропускаю в Vim, заключается в том, что он всегда сохраняет имя файла текущего файла в %буфере ( дополнительная информация ). Это позволяет легко запускать команды, такие как:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

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

Примеры того, что я хочу сделать

Здесь я опишу некоторые основные случаи использования, чтобы лучше объяснить, когда я чувствую необходимость в таком ярлыке

  1. Компиляция: Когда я вхожу, M-x compileemacs запрашивает команду компиляции. Я хотел бы войти gcc (current-buffer)легко.

  2. Load-file: Когда я редактирую свой файл .emacs, я хотел бы загрузить его прямо сейчас, чтобы проверить изменения. То, как я делаю это, M-x load-fileи тогда я всегда пишу имя . e m a c s. Я хотел бы иметь ярлык.

  3. Запуск внешних процессов: я привел du -shв качестве примера только для иллюстрации того, что я хочу, чтобы ярлык был также доступен при выполнении команд оболочки сM-!

Что я нашел до сих пор

  • Этот вопрос здесь на U & L. Приведенные ответы в основном показывают, где найти имя буфера, чтобы можно было добавить его в список уничтожений. Это не совсем то, что я ищу, я не хочу вручную убивать имя файла, прежде чем я хочу его использовать. (Кроме того, решения, описанные в обоих ответах, в моих emacs не работают так же гладко и требуют дополнительных нажатий клавиш, что делает их немного болезненными).

РЕДАКТИРОВАТЬ : немного не связано, я узнал, почему эти решения не работают. У меня включен IDO, к лучшему или к худшему.

  • (current-buffer)Функция описана в руководстве действительно возвращает имя файла в текущем буфере, но нигде в примерах , которые я дал выше, я оценка Elisp кода. Есть ли способ вставить результат оценки этой функции в (мини) буфер и связать этот путь с ярлыком?

Я ошибаюсь, если я так думаю?

В настоящее время я учусь использовать emacs (на самом деле это было несколько месяцев) после многих лет использования Vim. Я хочу избежать предсказуемой ловушки -emacs-in-a-Vim-way . Если вы чувствуете, что то, о чем я прошу, не очень изощренно , и должен быть лучший (более чистый?) Способ сделать это, пожалуйста, укажите это в своих ответах.

rahmu
источник
О имени файла, в .emacs, укажите, (global-set-key (kbd "C-i") buffer-file-name)хотите ли вы, чтобы оно было Ctrl + I. О .emacs, M-x load-file RETделает то , что вы хотите; Вам не нужно ничего писать.
Эмануэль Берг
2
Этот рабочий процесс не очень хорошо сочетается с Emacs, потому что все запросы в нижней строке окна находятся в буфере в Emacs (он называется минибуфером). Так что, если вы бежите, (buffer-file-name)пока печатаете в минибуфере, вы получите nil, потому что (current-buffer)это минибуфер. Вы также можете переключать буферы, находясь в минибуфере, поэтому трудно отследить, какой буфер является тем, что вы думаете о текущем буфере, к тому времени, когда текущий буфер, как видит его Emacs, является минибуфером.
Жиль "ТАК ... перестать быть злым"

Ответы:

11

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

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Также см. Этот вопрос , похоже, похоже.

easyb
источник
4

Небольшой вариант ответа @ easyb - скопировать путь к вашему кольцу уничтожения вместо того, чтобы поместить его в буфер (полезно для файлов только для чтения):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
user338519
источник