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

pro*_*eek 91 emacs clipboard elisp aquamacs

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

  • 有功能吗?
  • 如果没有,那么获得它的elisp功能是什么?
  • 如何将结果(路径名)复制到剪贴板以便我可以重复使用它?

我正在使用Mac OS X和Aqumacs.

(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???
Run Code Online (Sandbox Code Playgroud)

添加

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name))
  (kill-new (file-truename buffer-file-name))
)
(global-set-key "\C-cz" 'show-file-name)

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

  • (file-truename)是什么?
  • 我可以将路径名复制到系统(OS)的剪贴板,而不是杀死环,以便我可以将信息与其他应用程序一起使用吗?

Jér*_*dix 82

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

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

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

你也可以这样做:

(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
Run Code Online (Sandbox Code Playgroud)

  • 如果它是一个函数,那么它为什么不出现在`Mx`中? (13认同)
  • 在emacs 24中,`buffer-file-name`是一个变量 (7认同)
  • asmeurer - 因为它不是互动的 (7认同)
  • ......但还是一个功能 (5认同)
  • @Talespin_Kit是的,绝对的.Elisp是一个"lisp-2"而不是"lisp-1",这意味着有两个独立的名称空间(变量和函数).因此,每个符号具有"功能槽"和"值槽",并且访问哪个槽取决于上下文.实践中有许多例子(例如,任何次要模式名称都将是一个函数和一个变量).这也是为什么你需要使用`funcall`来调用一个存储为变量`foo`的值的函数,因为如果你使用``(foo)`你将使用`foo的函数槽`而不是价值槽. (2认同)

asm*_*rer 66

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

  • 是的,`Mx`只运行交互式函数,而`M-:`运行任何elisp函数. (5认同)
  • 谢谢,我认为`buffer-file-name`是一个函数,但是它没有出现在`Mx`中,而是出现在`M-:`中为`emacs eval`,在这里我可以运行命令,多亏了您的回答:) (2认同)

Jul*_*ard 37

我的诀窍就是C-x C-f打开一个文件,它会用当前文件路径预填充迷你文件,然后C-g退出.M-: buffer-file-name比任何其他方法都要快,但远远不够.

  • Cx Cv不仅会显示当前路径,还会显示当前文件的名称 (3认同)

Tre*_*son 15

直接实现您想要的是:

(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))))
Run Code Online (Sandbox Code Playgroud)

也就是说,我发现能够获得迷你缓冲区中的完整路径非常有用,这就是我使用的:

(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))))
Run Code Online (Sandbox Code Playgroud)

然后,如果我想要它在剪贴板中,我只是杀死线(C-a C-k).但是我们可以在上面的命令中轻松地将truename复制到剪贴板,只需将最后一行更改为:

(insert (kill-new (concat file-true-dir file-name)))))
Run Code Online (Sandbox Code Playgroud)

新部分是'kill-new将字符串放入kill ring 的调用.


tha*_*hpk 6

不需要额外的功能,只是

M-! pwd
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 5

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


MLe*_*Lev 5

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