如何在 emacs 中获取当前缓冲区的文件名?

rah*_*hmu 22 emacs function

我想念 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...
Run Code Online (Sandbox Code Playgroud)

我想在下面有类似的功能 emacs(版本 24,如果有任何区别),即有一种简单的方法来插入在当前缓冲区中打开的文件的名称。

我想做的事的例子

在这里,我描述了一些基本用例,以便在我觉得需要这样的快捷方式时更好地解释

  1. 编译:当我输入M-x compileemacs 时,要求我输入编译命令。我想gcc (current-buffer)轻松进入。

  2. 加载文件:当我编辑 .emacs 文件时,我想立即加载它以测试更改。我这样做的方式是M-x load-file然后我总是拼出名字. e m a c s。我想要一条捷径。

  3. 启动外部进程:我举du -sh个例子,只是为了说明我希望快捷方式在我执行shell命令时也可用M-!

到目前为止我发现了什么

  • 这个问题在 U&L 上。给出的答案基本上显示了在哪里可以找到缓冲区的文件名,以便可以将其添加到终止环中。这不是我正在寻找的,我不想在使用它之前手动终止文件名。(两个答案中描述的解决方案在我的 emacs 中似乎也没有那么顺利,并且需要额外的击键使它们有点痛苦)。

编辑:有点不相关,我发现了为什么这些解决方案不起作用。无论好坏,我都启用了 IDO。

  • 手册描述(current-buffer)函数确实返回当前缓冲区中文件的名称,但在我上面给出的示例中没有任何地方,我正在评估elisp代码。有没有办法将这个函数的评估结果插入(迷你)缓冲区中并将这种方式绑定到快捷方式?

我这样想有错吗?

在使用 Vim 多年后,我目前正在学习使用 emacs(实际上已经几个月了)。我想避免一个可预测的using-emacs-in-a-Vim-way陷阱。如果您觉得我要求的不是很emacs-y,并且应该有更好(更干净?)的方法来做到这一点,请在您的答案中提及它。

Ezr*_*ler 12

您可以将如下所示的函数放入您的 .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)))))
Run Code Online (Sandbox Code Playgroud)

也看到这个问题,它似乎是相似的。


小智 6

@easyb 的答案有一个细微的变化,那就是将路径复制到 Kill Ring,而不是将其放入缓冲区(对于只读文件很有用):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
Run Code Online (Sandbox Code Playgroud)