在迷你缓冲区中显示当前文件完整路径的功能

Posted

技术标签:

【中文标题】在迷你缓冲区中显示当前文件完整路径的功能【英文标题】:The function to show current file's full path in mini buffer 【发布时间】:2011-04-09 19:55:14 【问题描述】:

我需要获取我正在使用 emacs 编辑的文件的完整路径。

有这样的功能吗? 如果不是,那么获取它的 elisp 函数是什么? 如何将结果(路径名)复制到剪贴板以便重复使用?

我正在使用 Mac OS X 和 Aqumacs。

(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???

添加

(defun 显示文件名 () “在 minibuffer 中显示完整路径文件名。” (交互的) (消息(缓冲区文件名)) (kill-new (file-truename buffer-file-name)) ) (global-set-key "\C-cz" '显示文件名)

结合我得到的两个答案,我可以得到我想要的。感谢您的回答。还有一些问题。

(file-truename) 有什么用? 我可以将路径名复制到 System(OS) 的剪贴板,而不是 kill ring,以便我可以将信息用于其他应用程序吗?

【问题讨论】:

你试过C-x C-f 吗?这不是为了那个,但它可以工作(意味着这个gnu.org/software/emacs/manual/html_node/emacs/Visiting.html) 【参考方案1】:

是内置函数 buffer-file-name 为您提供文件的完整路径。

最好的办法是让您的 emacs 窗口始终显示您的系统名称和您当前正在编辑的缓冲区的完整路径:

(setq frame-title-format
      (list (format "%s %%S: %%j " (system-name))
        '(buffer-file-name "%f" (dired-directory dired-directory "%b"))))

你也可以这样做:

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name)))

(global-set-key [C-f1] 'show-file-name) ; Or any other key you want

【讨论】:

在emacs 24中buffer-file-name是一个变量 ...但还是一个函数 如果它是一个函数那么为什么它没有出现在M-x asmeurer - 因为它不是交互式的 @Talespin_Kit 是的,绝对是。 Elisp 是“lisp-2”而不是“lisp-1”,这意味着有两个独立的名称空间(变量和函数)。因此,每个符号都有一个“函数槽”和一个“值槽”,访问哪个槽取决于上下文。实践中有很多例子(例如,任何次要模式名称都将是函数和变量)。这也是为什么您需要使用funcall 之类的函数来调用存储为变量foo 的值的函数,因为如果您使用(foo),您将使用foo 的函数槽而不是比值槽。【参考方案2】:

借用 Jérôme Radix 的回答,如果你只是想快速查看当前缓冲区的文件路径,你可以做M-: buffer-file-name

或者,在缓冲区的某处输入(buffer-file-name),然后在右括号上运行C-x C-e(这将在任何模式下工作,而不仅仅是lisp模式)。

【讨论】:

谢谢,我以为buffer-file-name是一个函数,但它没有出现在M-x中,而是出现在M-:中作为emacs eval,在那里我可以运行命令,感谢你的答案:) 是的,M-x 只运行交互函数,而M-: 运行任何 elisp 函数。 C-h v 并输入 buffer-file-name 为您提供变量的值和描述,并使用制表符完成。【参考方案3】:

我的技巧是做一个C-x C-f 喜欢打开一个文件,它会用当前文件路径预先填充minibuff,C-g 退出。比M-: buffer-file-name 快,但比任何其他方法都丑得多。

【讨论】:

我也这样做。它不像 emacs-y 那样硬核,但如果我只关心当前文件的路径,它就可以工作。 如果你打开一个文件,比如 A,然后跳转到另一个文件,比如 B,例如使用插件的一些跳转定义功能,此方法显示 A 的路径,而不是 B!因此,这个答案并不总是能提供 OP 的要求。 C-x C-v 不仅会显示当前路径,还会显示当前文件名 @kuzzooroo 适合非 ido-mode 用户(名称显示在 C-x C-f 中,您使用 ido-mode)。【参考方案4】:

你想要的直接实现是:

(defun copy-full-path-to-kill-ring ()
  "copy buffer's full path to kill ring"
  (interactive)
  (when buffer-file-name
    (kill-new (file-truename buffer-file-name))))

也就是说,我发现能够获取 minibuffer 中内容的完整路径非常有用,这就是我使用的:

(define-key minibuffer-local-completion-map "\C-r" 'resolve-sym-link)
(defun resolve-sym-link ()
  "Try to resolve symbolic links into true paths."
  (interactive)
  (beginning-of-line)
  (let* ((file (buffer-substring (point)
                                 (save-excursion (end-of-line) (point))))
         (file-dir (file-name-directory file))
         (file-true-dir (file-truename file-dir))
         (file-name (file-name-nondirectory file)))
    (delete-region (point) (save-excursion (end-of-line) (point)))
    (insert (concat file-true-dir file-name))))

然后,如果我想将它放在剪贴板中,我只需删除该行 (C-a C-k)。但是我们可以在上面的命令中轻松地将真名复制到剪贴板,只需将最后一行更改为:

(insert (kill-new (concat file-true-dir file-name)))))

新部分是对'kill-new 的调用,它将字符串放入kill ring。

【讨论】:

您能详细说明如何使用此设置吗? “\C-r”是什么意思? 没关系。我想到了。我认为当我处于 ido 模式并指向一个文件时它很有用,然后我只需按 C-r 即可获取该文件的完整路径。确实有用。但是我仍然不知道为什么使用 \C 而不是 C。【参考方案5】:

不需要额外的功能,只需

M-! pwd

【讨论】:

虽然这可以工作,但它不能在 Windows 系统上工作,并且它无法解释 emacs 的当前工作目录可能与当前缓冲区文件的目录不同的事实。您可以通过访问带有C-x C-f 的文件,运行M-! pwd,然后运行M-x cd 并选择不同的目录,然后再次运行M-! pwd 来亲自看到这一点。【参考方案6】:

我的以下代码已经使用了很长时间。 当我在模式行中的缓冲区名称上按下鼠标中键时,它会将完整文件路径复制到终止环。当我在模式行中的缓冲区名称上按 shift-mouse-2 时,它只会将缓冲区名称复制到 kill-ring。

(defun copy-buffer-file-name (event &optional bufName)
  "Copy buffer file name to kill ring.
If no file is associated with buffer just get buffer name.
"
  (interactive "eP")
  (save-selected-window
    (message "bufName: %S" bufName)
    (select-window (posn-window (event-start event)))
    (let ((name (or (unless bufName (buffer-file-name)) (buffer-name))))
      (message "Saved file name \"%s\" in killring." name)
      (kill-new name)
      name)))

(define-key mode-line-buffer-identification-keymap [mode-line mouse-2] 'copy-buffer-file-name)
(define-key mode-line-buffer-identification-keymap [mode-line S-mouse-2] '(lambda (e) (interactive "e") (copy-buffer-file-name e 't)))

【讨论】:

【参考方案7】:

C-x C-b 显示缓冲区列表以及每个缓冲区的文件路径(如果适用)。

【讨论】:

【参考方案8】:

C-x C-d,也可通过M-x list-directory 调用,将显示您当前文件的目录,您只需按“Enter”键即可清除迷你缓冲区。更多详情请见here。

【讨论】:

我最喜欢的答案,简单、快捷、容易!【参考方案9】:

C-u C-x C-b 列出当前访问文件的缓冲区。

【讨论】:

【参考方案10】:

如标题所述(在 minibuffer 中显示当前文件路径),您可以这样做:

M-x buffer-file-name

要将其永久显示在模式行中,您可以使用:

(setq-default mode-line-buffer-identification
              (list 'buffer-file-name
                    (propertized-buffer-identification "%12f")
                    (propertized-buffer-identification "%12b")))

或者这个(颜色+缩写):

(setq-default mode-line-buffer-identification
              '((:eval
                 (list (propertize (abbreviate-file-name
                                    (expand-file-name buffer-file-name))
                                   'face 'font-lock-string-face)))))

【讨论】:

【参考方案11】:

我可以将路径名复制到系统(操作系统)的剪贴板,而不是 kill ring,以便我可以将信息用于其他应用程序吗?

如果您使用 xclip (Linux)、pbcopy (Mac)、putclip (Cygwin) 之类的东西,则可以。

我个人使用包装脚本cp 分别进行复制和粘贴,第一次从标准输入读取,后者写入标准输出。这样,这适用于我所有的开发平台:

(shell-command (format "echo '%s' | c" buffer-file-name))

我发现这比使用 Emacs 剪贴板支持更可靠且可配置。例如,我的c 命令将输入​​复制到 Linux 上的所有 3 个剪贴板(主、辅助、剪贴板),因此我可以使用 Ctrl-V 或中键进行粘贴。

【讨论】:

这应该可以,但它不适合我。 (Ubuntu 14.04.1。)也就是说,如果在 shell 中输入,date | xclipxclip file 都会像宣传的那样工作(将文件的日期或内容存储到主文件)。但是,如果我在 M- 之后键入这些命令中的任何一个!在 emacs 中(并按回车键)没有任何反应;光标保留在 minibuffer 中,就好像期待更多输入一样;如果我中断以重新获得控制权,则没有任何内容存储在主数据库中。 好的,你的想法适用于 xsel 而不是 xclip:(shell-command (format "echo '%s' | xsel -i" buffer-file-name)) - 当做成一个交互式命令时(如上面@JeromeRadix 最赞成的答案所建议的那样),这是一个很大的赢!谢谢!【参考方案12】:

最简单的方法是

(buffer-name)<(C-x)(C-e)> for the file name to appear in the echo area

(buffer-name)<(C-u)(C-x)(C-e)> would print the location <here>

借用特雷杰克逊 我想出了这个:

(defun buffer-kill-path ()
  "copy buffer's full path to kill ring"
  (interactive)
  (kill-new (buffer-file-name)))

您可以在site找到更多信息

【讨论】:

【参考方案13】:

copy-buffer-file-name-as-kill from [0] 完全符合我的想法。它还可以选择只复制目录名或文件名。

[0]http://www.emacswiki.org/emacs/download/buffer-extension.el

【讨论】:

以上是关于在迷你缓冲区中显示当前文件完整路径的功能的主要内容,如果未能解决你的问题,请参考以下文章

在Emacs中,如何在Finder中显示当前文件?

不要在 Emacs 完成窗口中显示无趣的文件

显示 MTKView 的当前帧率

在 C++ 中创建一个 zip 存档

与 realpath() 缓冲区混淆 [重复]

EMACS快捷键