Подтвердить что ты не робот

Путь к файлу в буфер обмена в Emacs

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

То есть:

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

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

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

Ответ 4

В дистрибутиве 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"))))

Ответ 5

Здесь 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))))

Ответ 6

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

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