Яка існуюча команда отримує назву файлу буфера поточного файлу, як це?
На жаль, для цього немає готової команди, але ми можемо зробити наступну:
(defun name-of-the-file ()
"Gets the name of the file the current buffer is based on."
(interactive)
(insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))
Магія полягає у функції, обраній мінібуфером-вікном ; він робить все правильно, вибираючи останній буфер до активації minibuffer. В іншому випадку використання лише буфера-імені-файлу не призведе до того, що ім'я файлу перетвориться на мінібуфер. Цікаво, що та сама функція може бути використана в звичайному буфері або мінібуфері для вставки імені файлу. Спеціальне лікування не потрібно.
У чому полягає її прив'язка ключа за замовчуванням?
Немає такого, але ви можете вибрати зручний та призначити його так:
(global-set-key (kbd "C-c f") 'name-of-the-file)
Помістіть наведені вище рядки коду lisp у свій файл init.el.
Це працює у більшості тривіальних випадків, але важко передбачити, які конфлікти у нього можуть виникнути у будь-яких режимах, у яких ви працюєте, коли викликаєте цю функцію.
Що робити, якщо буфер не відвідує дійсне ім'я файлу, наприклад буфер нуля? Потім ця помилка відображається в області відлуння:
name-of-the-file: Wrong type argument: char-or-string-p, nil
Вибір дійсного буфера з правильним іменем файлу перед тим, як викликати ярлик, уникне таких помилок.
Існує декілька інших рішень, як описано вище, але вони в основному відрізняються тим, як вони обробляють винятки або переосмислення будь-яких конфліктів. Наприклад, деякі використовують гачки режимів, щоб зробити цю функцію доступною лише в певних режимах.
M-n
. Він працює не скрізь, але працює у багатьох місцях. Крім того, оскільки ви вітаєтеся, вам можуть сподобатися lgrep і rgrep, які я думаю, трохи інтерактивніші.