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

时间:2010-09-08 15:49:22

标签: emacs elisp clipboard aquamacs

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

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

我正在使用Mac OS X和Aqumacs。

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

ADDED

(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)?
  • 我可以将路径名复制到System(OS)的剪贴板,而不是kill ring,以便我可以将这些信息与其他应用一起使用吗?

13 个答案:

答案 0 :(得分:80)

内置函数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

答案 1 :(得分:63)

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

答案 2 :(得分:37)

我的诀窍是做一个C-x C-f喜欢打开一个文件,它将使用当前文件路径C-g预填充迷你buff,以退出。比M-: buffer-file-name更快,但远远超过任何其他方法。

答案 3 :(得分: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))))

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

(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 )。但是我们可以在上面的命令中轻松地将truename复制到剪贴板,只需将最后一行更改为:

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

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

答案 4 :(得分:6)

无需额外功能,只需

M-! pwd

答案 5 :(得分:3)

我已经使用了以下代码很长一段时间了。 当我在模式行中按缓冲区名称上的鼠标中键时,它会将完整的文件路径复制到kill ring。当我在模式行的buffer-name上按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)))

答案 6 :(得分:2)

C-x C-d也可以通过M-x list-directory调用,它会显示当前文件的目录,只需按“Enter”键即可清除迷你缓冲区。其他详细信息可供here

答案 7 :(得分:1)

  

我可以将路径名复制到系统(OS)的剪贴板,而不是杀死响铃,以便我可以将信息与其他应用一起使用吗?

你可以选择像xclip(Linux),pbcopy(Mac),putclip(Cygwin)这样的东西。

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

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

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

要做标题所说的(显示迷你缓冲区中的当前文件路径),您可以这样做:

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 :(得分:0)

最简单的方法就是

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

借用Trey Jackson 我想出了这个:

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

您可以在site

上找到更多信息

答案 12 :(得分:0)

来自[0]的

copy-buffer-file-name-as-kill完全符合您的需要。它还可以选择仅复制目录名称,或仅复制文件名。

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