Функция для отображения полного пути текущего файла в мини-буфере - PullRequest
91 голосов
/ 08 сентября 2010

Мне нужно получить полный путь к файлу, который я редактирую с помощью emacs.

  • Есть ли для этого функция?
  • Если нет, то что будетФункция elisp для получения этого?
  • Как я могу скопировать результат (имя пути) в буфер обмена, чтобы я мог его повторно использовать?

Я использую Mac OS X и Aqumacs,

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

ДОБАВЛЕНО

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

Комбинируя два полученных ответа, я мог получить то, что хочу.Спасибо за ответы.И еще несколько вопросов.

  • Для чего (имя-файла)?
  • Могу ли я скопировать имя пути в буфер обмена системы (ОС), а не в список уничтожений, чтобы я могможете использовать информацию с другими приложениями?

Ответы [ 12 ]

82 голосов
/ 08 сентября 2010

Это встроенная функция 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
64 голосов
/ 02 июля 2013

Чтобы позаимствовать ответ Jérôme Radix, если вы просто хотите быстро увидеть путь к файлу текущего буфера, вы можете сделать M-: buffer-file-name.

37 голосов
/ 24 октября 2013

Мой трюк в том, чтобы сделать C-x C-f, как открыть файл, он предварительно заполнит минибуф текущим путем к файлу, C-g, чтобы выйти.Быстрее, чем M-: buffer-file-name, но гораздо страшнее, чем любые другие методы.

15 голосов
/ 08 сентября 2010

Прямая реализация того, что вы хотите:

(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 ). Но мы могли бы легко скопировать имя в буфер обмена в приведенной выше команде, просто изменив последнюю строку на:

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

Новая часть - это вызов 'kill-new, который помещает строку в список уничтожений.

6 голосов
/ 21 января 2017

Нет необходимости в дополнительных функциях, просто

M-! pwd
3 голосов
/ 29 октября 2014

У меня следующий код уже давно используется.Он копирует полный путь к файлу в список уничтожений, когда я нажимаю среднюю кнопку мыши на имени буфера в строке режима.Он копирует только имя буфера в kill-ring, когда я нажимаю shift-mouse-2 на имени буфера в строке режима.

(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)))
2 голосов
/ 19 декабря 2016

C-x C-d, также вызываемый через M-x list-directory, покажет вам каталог для вашего текущего файла, и вам нужно всего лишь нажать клавишу «Enter», чтобы очистить минибуфер. Дополнительные подробности доступны здесь .

1 голос
/ 17 июня 2018

C-u C-x C-b перечисляет буферы, в настоящее время посещающие файлы.

1 голос
/ 11 февраля 2016

C-x C-b показывает список буферов и путь к файлу для каждого буфера, где это применимо.

1 голос
/ 07 ноября 2013

Можно ли скопировать имя пути в буфер обмена системы (ОС), а не в список уничтожений, чтобы я мог использовать информацию с другими приложениями?

Можно, если выОболочка для чего-то вроде xclip (Linux), pbcopy (Mac), putclip (Cygwin).

Я лично использую сценарии оболочки c и p для копирования и вставки соответственно, первое чтение из стандартного вводаПоследний пишет на стандартный вывод.Таким образом, это работает на всех моих платформах разработки:

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

Я считаю это более надежным и настраиваемым, чем использование поддержки буфера обмена Emacs.Например, моя команда c копирует входные данные во все 3 буфера обмена в Linux (основной, дополнительный, буфер обмена), поэтому я могу вставить их с помощью Ctrl-V или среднего щелчка.

...