Каков самый простой способ отправить текущее полное имя файла с пути к файлу в буфер обмена?
Теперь я использую буфер сообщений: копирую имя файла, которое появляется после сохранения файла. Но, я полагаю, должен быть гораздо более простой способ.
Каков самый простой способ отправить текущее полное имя файла с пути к файлу в буфер обмена?
Теперь я использую буфер сообщений: копирую имя файла, которое появляется после сохранения файла. Но, я полагаю, должен быть гораздо более простой способ.
Я использую это:
(defun my-put-file-name-on-clipboard ()
"Put the current file name on the clipboard"
(interactive)
(let ((filename (if (equal major-mode 'dired-mode)
default-directory
(buffer-file-name))))
(when filename
(with-temp-buffer
(insert filename)
(clipboard-kill-region (point-min) (point-max)))
(message filename))))
В Emacs Prelude Я использую:
(defun prelude-copy-file-name-to-clipboard ()
"Copy the current buffer file name to the clipboard."
(interactive)
(let ((filename (if (equal major-mode 'dired-mode)
default-directory
(buffer-file-name))))
(when filename
(kill-new filename)
(message "Copied buffer file name '%s' to the clipboard." filename))))
Если вы хотите написать имя/путь текущего буфера, вы можете ввести C-u M-:
, а затем (buffer-file-name)
- для полного пути - или (buffer-name)
для имени буфера.
То есть:
M-: + ellisp expression
оценивает эллипсовое выражение в минибуфере
C-u
записать вывод в текущий буфер
Не точно отвечает на вопрос, но может быть полезным, если кто-то использует эту или другую функцию спорадически и предпочитает не инициализировать функцию при каждом запуске.
В дистрибутиве Spacemacs вы можете нажать Space f y, чтобы отобразить имя буфера в минибуфере и скопировать его в список уничтожений.
spacemacs/show-and-copy-buffer-filename
функция spacemacs/show-and-copy-buffer-filename
происходит из этого сообщения в блоге: Emacs: Показать имя файла буфера.
(defun camdez/show-buffer-file-name ()
"Show the full path to the current file in the minibuffer."
(interactive)
(let ((file-name (buffer-file-name)))
(if file-name
(progn
(message file-name)
(kill-new file-name))
(error "Buffer not visiting a file"))))
Здесь buffer-extension - и имеет функцию copy-buffer-file-name-as-kill
. Он даже спрашивает, что вам нужно скопировать: имя, полное имя или имя каталога.
Edit
Я использую измененную версию copy-buffer-file-name-as-kill
из buffer-extension.el
:
(defun copy-buffer-file-name-as-kill (choice)
"Copyies the buffer {name/mode}, file {name/full path/directory} to the kill-ring."
(interactive "cCopy (b) buffer name, (m) buffer major mode, (f) full buffer-file path, (d) buffer-file directory, (n) buffer-file basename")
(let ((new-kill-string)
(name (if (eq major-mode 'dired-mode)
(dired-get-filename)
(or (buffer-file-name) ""))))
(cond ((eq choice ?f)
(setq new-kill-string name))
((eq choice ?d)
(setq new-kill-string (file-name-directory name)))
((eq choice ?n)
(setq new-kill-string (file-name-nondirectory name)))
((eq choice ?b)
(setq new-kill-string (buffer-name)))
((eq choice ?m)
(setq new-kill-string (format "%s" major-mode)))
(t (message "Quit")))
(when new-kill-string
(message "%s copied" new-kill-string)
(kill-new new-kill-string))))
Почему никто не скажет простое решение.
Просто зайдите в свой буфер и затем нажмите 0 w или C-u 0 w.
Это вызовет dired-copy-filename-as-kill
который даст вам полный путь к файлу. Если вы хотите текущий каталог, просто удалите файл в конце или вы можете использовать функцию ниже, а затем связать его с любой клавишей, которая вам нравится.
(defun my/dired-copy-dirname-as-kill ()
"Copy the current directory into the kill ring."
(interactive)
(kill-new default-directory))
PS: лично я иду в текущий каталог из файлового буфера, используя dired-jump