将当前文件名放入迷你缓冲区


12

如何将活动文件缓冲区的文件名插入命令?

当我调用需要文件名的命令时,通常是从文件缓冲区执行此操作,并且在向迷你缓冲区中键入命令时需要该文件的名称。

我正在寻找一种C-x可以在微型缓冲区中形成命令行的过程中键入的假设。

因此,如果当前缓冲区是一个名为的文件Lorem Ipsum.txt,则输入以下内容:

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

M-xgrepRET呈现小缓冲区提示输入grep命令。作为回应,我输入了正则表达式模式参数('foo')并插入了文件名参数(C-x)。该迷你缓冲区将最终变为:

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

现有的哪个命令可以像这样获取当前文件缓冲区的文件名?它的默认键绑定是什么?


3
我很惊讶没有人提及M-n。它并非在所有地方都可以使用,但是可以在很多地方使用。另外,由于您正在grepping,我想您可能会喜欢lgrep和rgrep,它们更具交互性。
马拉巴巴

Answers:


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

神奇之处在于minibuffer-selected-window功能。它通过激活微型缓冲区之前的最后一个缓冲区来做正确的事情。否则,仅使用buffer-file-name不会使文件名进入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

在调用快捷方式之前选择具有正确文件名的有效缓冲区将避免此类错误。

像上面一样,还有其他几种解决方案,但是它们的主要区别在于处理任何冲突的异常或替代的方式。例如,有些使用模式钩子使此功能仅在某些模式下可用。


为了使这一工作有效,我认为必须这样做enable-recursive-minibuffers
Dieter.Wilhelm 2015年

如果仅在迷你缓冲区中使用该命令,则可以使用以下绑定代替(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的缓冲区名称,该名称将插入当前缓冲区名称。
Dov Grobgeld

2

使用dired-x键盘快捷键时C-x C-j绑定到dired-jump。因此,从文件缓冲区开始,您会到达正确的导航线,并可以使用来复制其文件名w。然后,您可以将其粘贴到迷你缓冲区中。

减轻文件名键入的另一种可能性是标准Emacs迷你缓冲区文件完成。只需输入文件名的第一个字符,然后输入TAB。


1
您只需使用w(command dired-copy-filename-as-kill)就可以在当前Dired行上复制文件名。
画了

-1

该问题要求使用现有的Emacs命令来执行此操作。

如前所述:

不幸的是,对此没有现成的命令

原来是这个问题的答案。


有许多方法可以减轻您的用例,并提供其他建议的定制编码解决方案,所以我认为您的说法不正确。您没有特别要求开箱即用的 Emacs方式!
Dieter.Wilhelm '16

我专门为此目的要求一个现有命令,所以是的,这个答案是正确的。
bignose
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.