Какая существующая команда получает имя файла текущего буфера файла, как это?
К сожалению, для этого нет готовой команды, но мы можем сделать ее следующим образом:
(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)))))
Волшебство заключается в функции окна выбранного минибуфера ; он делает правильную вещь, выбирая последний буфер перед активацией минибуфера. В противном случае, используя только имя файла буфера, мы не получим имя файла в минибуфере. Интересно, что эту же функцию можно использовать в обычном буфере или минибуфере для вставки имени файла. Никакого специального лечения не требуется.
Какова его связка ключей по умолчанию?
Нет, но вы можете выбрать удобный и назначить его следующим образом:
(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, которые, я думаю, немного более интерактивны.