web-dev-qa-db-ja.com

ミニバッファ内の現在のファイルのフルパスを表示する関数

Emacsで編集しているファイルの完全なパスを取得する必要があります。

  • そのための機能はありますか?
  • そうでない場合、それを取得するためのelisp関数は何でしょうか?
  • 結果(パス名)をクリップボードにコピーして再利用できるようにするにはどうすればよいですか?

Mac OS XとAqumacsを使用しています。

(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???

追加されました

(defun show-file-name()
 "ミニバッファーにフルパスファイル名を表示してください。" 
(インタラクティブ)
(メッセージ(バッファーファイル-name))
(kill-new(file-truename buffer-file-name))
)
(global-set-key "\ C-cz" 'show-ファイル名)

私が得た2つの答えを組み合わせることで、欲しいものを手に入れることができました。答えてくれてありがとう。そして、さらにいくつかの質問。

  • (file-truename)の目的は何ですか?
  • 他のアプリで情報を使用できるように、キルリングではなくパス名をシステム(OS)のクリップボードにコピーできますか?
91
prosseek

組み込み関数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
82
Jérôme Radix

JérômeRadixの答えを借りて、現在のバッファのファイルパスをすばやく確認したい場合は、M-: buffer-file-name

64
asmeurer

私のトリックは、C-x C-fを実行してファイルを開くことです。ミニバフに現在のファイルパスC-gを事前に入力して終了します。 M-: buffer-file-nameより高速ですが、他のどの方法よりもはるかにいです。

37
Julien Palard

あなたが望むものの直接の実装は次のとおりです。

(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の呼び出しで、文字列をキルリングに入れます。

15
Trey Jackson

特別な機能は不要、ただ

M-! pwd
6
thanhpk

私は次のコードをすでに長い間使用しています。モードラインでバッファ名の上でマウスの中ボタンを押すと、完全なファイルパスをキルリングにコピーします。モードラインのbuffer-nameでshift-mouse-2を押すと、kill-ringにバッファー名だけがコピーされます。

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

C-x C-dは、M-x list-directoryからも呼び出し可能で、現在のファイルのディレクトリを表示します。ミニバッファーをクリアするには、「Enter」キーを押すだけです。追加の詳細情報が利用可能です こちら

2
MLev

他のアプリで情報を使用できるように、キルリングではなくパス名をシステム(OS)のクリップボードにコピーできますか?

Xclip(Linux)、pbcopy(Mac)、putclip(Cygwin)のようなものにシェルアウトすればできます。

個人的には、ラッパースクリプトcpをそれぞれコピーと貼り付けに使用します。最初は標準入力から読み取り、後者は標準出力に書き込みます。そのようにして、これは私のすべての開発プラットフォームで動作します:

(Shell-command (format "echo '%s' | c" buffer-file-name))

これは、Emacsのクリップボードサポートを使用するよりも信頼性が高く、設定可能です。たとえば、私のcコマンドは、入力をLinux上の3つのクリップボードすべて(プライマリ、セカンダリ、クリップボード)にコピーするので、Ctrl-Vまたは中クリックのいずれかで貼り付けることができます。

1
Barry Kelly

C-u C-x C-bは、現在ファイルを訪問しているバッファをリストします。

1
memeplex

C-x C-bは、バッファのリストと、該当する場合は各バッファのファイルパスを示します。

1
David

copy-buffer-file-name-as-kill from [0]は、私が思うに必要なことを正確に行います。また、ディレクトリ名のみ、またはファイル名のみをコピーするオプションもあります。

[0] http://www.emacswiki.org/emacs/download/buffer-extension.el

0
dolzenko

最も簡単な方法となるだろう

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

site で詳細を確認できます。

0
DJJ