Функция для отображения текущего полного пути файла в мини-буфере
Мне нужно получить полный путь к файлу, который я редактирую с помощью 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, чтобы я мог использовать информацию с другими приложениями?
Ответы
Ответ 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
Ответ 2
Чтобы заимствовать у Jérôme Radix ответ, если вы просто хотите быстро увидеть путь к файлу текущего буфера, вы можете сделать M-: buffer-file-name
.
Ответ 3
Мой трюк состоит в том, чтобы сделать C-x C-f
, чтобы открыть файл, он запустит мини-тубус с текущим пути к файлу, C-g
, чтобы выйти. Быстрее, чем M-: buffer-file-name
, но гораздо более уродливее, чем любые другие методы.
Ответ 4
Прямая реализация того, что вы хотите:
(defun copy-full-path-to-kill-ring ()
"copy buffer 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.
Ответ 5
У меня есть следующий код, который уже используется в течение длительного времени.
Он копирует полный путь к кольцу уничтожения, когда я нажимаю среднюю кнопку мыши на имя буфера в строке режима. Он копирует только имя буфера в 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)))
Ответ 6
Нет необходимости в дополнительной функции, просто
M-! pwd
Ответ 7
Могу ли я скопировать имя пути в буфер обмена System (OS), а не в kill ring, чтобы я мог использовать информацию с другими приложениями?
Вы можете, если вы используете что-то вроде xclip (Linux), pbcopy (Mac), putclip (Cygwin).
Я лично использую сценарии-оболочки c
и p
для копирования и вставки соответственно, первое чтение со стандартного ввода, последнее записывается на стандартный вывод. Таким образом, это работает на всех моих платформах разработки:
(shell-command (format "echo '%s' | c" buffer-file-name))
Я нахожу это более надежным и настраиваемым, чем использование поддержки буфера обмена Emacs. Например, моя команда c
копирует вход во все 3 буфера обмена в Linux (первичный, вторичный, буфер обмена), поэтому я могу вставить либо Ctrl-V, либо средний клик.
Ответ 8
C-x C-b
показывает список буферов и путь к файлу для каждого буфера, где это применимо.
Ответ 9
C-x C-d
, также вызываемый через M-x list-directory
, покажет вам каталог для вашего текущего файла, и вам нужно только нажать клавишу "Enter", чтобы очистить минибуфер. Дополнительные подробности доступны здесь.
Ответ 10
Самый простой способ и будет
(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 full path to kill ring"
(interactive)
(kill-new (buffer-file-name)))
Дополнительную информацию можно найти на сайте
Ответ 11
copy-buffer-file-name-as-kill
from [0] делает именно то, что вам нужно, я думаю. Он также имеет возможность копировать только имя каталога или просто имя файла.
[0] http://www.emacswiki.org/emacs/download/buffer-extension.el