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


19

我想念的有关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...

我想在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。给出的答案基本上显示了在哪里可以找到缓冲区的文件名,以便可以将其添加到kill-ring。这并不是我要找的东西,我不想在使用文件名之前先手动杀死它。(这两个答案中描述的解决方案在我的emacs中似乎都无法正常工作,并且需要额外的击键操作,这使它们有些痛苦)。

编辑:一点无关,由我发现为什么这些解决方案不起作用。无论启用还是禁用,我都启用了IDO。

  • 手册描述(current-buffer)函数的确会返回当前缓冲区中文件的名称,但是在上面的示例中,我没有评估elisp代码。有没有一种方法可以将该函数的求值结果插入(微型)缓冲区中,并以这种方式绑定到快捷方式?

我这样想是不是错了?

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


关于文件名,(global-set-key (kbd "C-i") buffer-file-name)如果您希望使用Ctrl + I ,则在.emacs中放入。关于.emacs,M-x load-file RET您想要做什么?您不需要写任何东西。
伊曼纽尔·伯格

2
此工作流程与Emacs的衔接不是很好,因为窗口底部的所有提示都在Emacs的缓冲区(称为迷你缓冲区)中。因此,如果您(buffer-file-name)在输入迷你缓冲区时运行,则会得到nil,因为(current-buffer)它是迷你缓冲区。您也可以在微型缓冲区中切换缓冲区,因此很难像Emacs所知的那样,在当前缓冲区是微型缓冲区时,跟踪哪个缓冲区就是您对当前缓冲区的看法。
吉尔(Gilles)'所以

Answers:


11

您可以在.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)))))

也看到这个问题,似乎很相似。


4

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

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
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.