Поместите текущее имя файла в минибуфер

12

Как я могу вставить имя файла активного файлового буфера в команду?

Когда я вызываю команду, которой нужно имя файла, я часто делаю это из буфера файлов и хочу получить имя этого файла при вводе команды в минибуфер.

Я ищу гипотезу, C-xкоторую я могу набрать при формировании командной строки в минибуфере.

Так что, если текущий буфер является файлом с именем Lorem Ipsum.txt, я наберу это:

M-x grep RET 'foo' SPC C-x … RET

что M-xgrepRETпредставляет Минибуфер побуждая для grepкоманды. В ответ я набрал аргумент шаблона regex ( 'foo') и вставил аргумент имени файла ( C-x). Этот минибуфер получится как:

grep -nH -e 'foo' 'Lorem Ipsum.txt'

Какая существующая команда получает имя файла текущего буфера файла, как это? Какова его связка ключей по умолчанию?

большой нос
источник
3
Я удивлен, что никто не упоминается M-n. Это не работает везде, но работает во многих местах. Кроме того, поскольку вы разбираетесь, вам могут понравиться lgrep и rgrep, которые, я думаю, немного более интерактивны.
Малабарба

Ответы:

18

Какая существующая команда получает имя файла текущего буфера файла, как это?

К сожалению, для этого нет готовой команды, но мы можем сделать ее следующим образом:

(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

Выбор правильного буфера с правильным именем файла перед вызовом ярлыка позволит избежать таких ошибок.

Существует несколько других решений, подобных приведенным выше, но они в основном отличаются тем, как они обрабатывают исключения или переопределения для любых конфликтов. Например, некоторые используют мод-хуки, чтобы сделать эту функцию доступной только в определенных режимах.

Пользователь Emacs
источник
Чтобы это работало, я думаю, нужно enable-recursive-minibuffers.
Дитер. Вильгельм
Если предполагается, что команда используется только в минибуфере, вместо (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function имени C-c bбуфера можно использовать следующую привязку, к которой я привязал, и которая вставляет текущее имя буфера.
Дов Гробгельд
2

При использовании dired-xсочетания клавиш C-x C-jобязательно dired-jump. Таким образом, из вашего файлового буфера вы попадаете в правую строку и можете скопировать имя файла с помощью w. И тогда вы сможете вставить его в мини-буфер.

Другая возможность облегчить ввод имени файла - это стандартное завершение мини-буфера Emacs. Просто введите первые символы вашего имени файла, а затем нажмите клавишу TAB.

Dieter.Wilhelm
источник
1
Вы можете скопировать имя файла в текущей строке Dired, просто используя w(команду dired-copy-filename-as-kill).
Дрю
-1

Вопрос просит существующую команду Emacs сделать это.

Как говорилось ранее:

К сожалению, для этого нет готовой команды

который оказывается ответом на этот вопрос.

большой нос
источник
Существуют способы облегчить ваш сценарий использования, а другие предлагают индивидуальные решения для кодирования, поэтому я думаю, что ваше утверждение неверно. Вы не спрашивали конкретно о способе Emacs "из коробки "!
Дитер. Вильгельм
Я специально спросил для этой цели существующую команду, так что да, это правильный ответ.
bignose