Функция для отображения полного пути текущего файла в мини-буфере
мне нужно получить полный путь к файлу, который я редактирую с помощью 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)
объединив два ответа, которые я получил, я мог бы получить то, что хочу. Спасибо за ответ. И еще несколько вопросов.
- Что такое (file-truename)?
- могу ли я скопировать имя пути в буфер обмена System (OS), а не kill ring, чтобы я мог использовать информацию с другими приложениями?
12 ответов:
это встроенная функция
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
чтобы заимствовать из ответа Жерома радикса, если вы просто хотите быстро увидеть путь к файлу текущего буфера, вы можете сделать
M-: buffer-file-name
.
мой трюк, чтобы сделать
C-x C-f
Как открыть файл, он будет предварительно заполнить минибуф с текущим путем к файлу,C-g
бросить. Быстрее, чемM-: buffer-file-name
но гораздо уродливее, чем любые другие методы.
прямая реализация того, что вы хотите:
(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, когда я нажимаю среднюю кнопку мыши на имени буфера в строке режима. Он копирует только имя буфера в 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)))
могу ли я скопировать имя пути в буфер обмена 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, либо средний щелчок.
C-x C-d
, также можно вызвать черезM-x list-directory
, покажет вам каталог для вашего текущего файла, и вам нужно только нажать клавишу "Enter", чтобы очистить минибуфер. Дополнительная информация доступна здесь.
самый простой способ и будет
(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)))
вы можете найти дополнительную информацию о сайт
copy-buffer-file-name-as-kill
из [0] делает именно то, что вам нужно, я думаю. Он также имеет возможность скопировать только имя каталога или просто имя файла.[0] http://www.emacswiki.org/emacs/download/buffer-extension.el