Як отримати ім'я файлу поточного буфера в 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. Надані відповіді в основному показують, де знайти ім'я файлу буфера, щоб можна було додати його до файлу "kill-ring". Це не саме те, що я шукаю, я не хочу вручну вбивати ім'я файлу, перш ніж я захочу його використовувати. (Також рішення, описані в обох відповідях, начебто не працюють настільки гладко в моїх програмах emacs і вимагають додаткових натискань на клавіші, що створюють їм біль.

EDIT : Трохи не пов'язаний між собою, я з’ясував, чому ці рішення не працюють. У мене ввімкнено IDO, на краще або на гірше.

  • (current-buffer)Функція описана в керівництві дійсно повертає ім'я файлу в поточному буфері, але ніде в прикладах , які я дав вище, я оцінка Elisp коду. Чи є спосіб вставити результат оцінки цієї функції в (міні) буфер і зв’язати таким чином ярлик?

Чи помиляюся я так думаю?

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


Про ім'я файлу в .emacs поставте, (global-set-key (kbd "C-i") buffer-file-name)якщо ви хочете, щоб це було Ctrl + I. Про .emacs, M-x load-file RETробить те, що ви хочете; вам не потрібно нічого писати.
Емануель Берг

2
Цей робочий процес не дуже добре поєднується з Emacs, оскільки всі підказки в нижній рядку вікна знаходяться в буфері в Emacs (називається minibuffer). Отже, якщо ви біжите, (buffer-file-name)поки набираєте мінібуфер, ви отримуєте nil, бо (current-buffer)це minibuffer. Ви також можете перемикати буфери, перебуваючи в minibuffer, тому важко відслідковувати, який буфер - це те, що ви думаєте про поточний буфер, до моменту, коли поточний буфер, як це бачить Emacs, є minibuffer.
Жил "ТАК - перестань бути злим"

Відповіді:


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)))))

Дивіться також це питання , схоже, схоже.


4

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

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.