Путь к файлу в буфер обмена в Emacs - PullRequest
36 голосов
/ 10 марта 2010

Какой самый простой способ отправить текущее полное имя файла с путем к файлу в буфер обмена?

Теперь я использую буфер сообщений: я копирую имя файла, которое появляется там после сохранения файла. Но, полагаю, должен быть гораздо более простой способ.

Ответы [ 6 ]

25 голосов
/ 10 марта 2010

Я использую это:

(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))))
24 голосов
/ 23 февраля 2012

In 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))))
18 голосов
/ 09 августа 2013

Если вы хотите записать имя / путь текущего буфера, вы можете набрать C-u M-:, а затем либо (buffer-file-name) - для полного пути - или (buffer-name) для имени буфера.

То есть:

M-: + ellisp expression вычисляет выражение эллипса в мини-буфере

C-u записать вывод в текущий буфер

Точно не отвечает на вопрос, но может быть полезно, если кто-то использует эту или другую функцию спорадически, и предпочитает не инициализировать функцию при каждом запуске.

12 голосов
/ 12 июня 2017

В дистрибутиве Spacemacs вы можете нажать Пробел f y , чтобы отобразить имя буфера в минибуфере и скопировать его в список уничтожений.

Функция 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"))))
7 голосов
/ 31 октября 2018

Почему никто не скажет простое решение.

Просто перейдите в буфер с данными и нажмите 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

5 голосов
/ 23 февраля 2012

Существует расширение буфера - и оно имеет функцию copy-buffer-file-name-as-kill. Он даже спрашивает, что копировать: имя, полное имя или имя каталога.

Редактировать

Я использую модифицированную версию 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))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...