現在のファイルのフルパスをミニバッファーに表示する機能


98

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

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

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

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

追加されました

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

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

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

回答:


91

これ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

7
emacsでは24 buffer-file-nameは変数です
バラセル2013

5
...しかし、それでも機能
phils

16
関数の場合、なぜ表示されM-xないのですか?
asmeurer 2014年

8
asmeurer-インタラクティブではないため
Ben Fitzgerald

2
@Talespin_Kitはい、絶対に。Elispは「lisp-1」ではなく「lisp-2」であり、2つの独立した名前空間(変数と関数)があることを意味します。したがって、各シンボルには「関数スロット」と「値スロット」があり、アクセスされるスロットはコンテキストによって異なります。実際には多くの例があります(たとえば、マイナーモード名は関数と変数の両方になります)。funcall変数の値として保存されている関数を呼び出すためにを使用する必要があるのもこのfooためです。使用した(foo)場合はfoo、値スロットではなくの関数スロットを使用するためです。
phils 2018

73

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

あるいは、(buffer-file-name)バッファをどこかに入力してC-x C-e閉じ括弧で実行します(これは、lispモードだけでなく、どのモードでも機能します)。


3
ありがとう、私はbuffer-file-nameを関数と考えましたが、では表示されませんが、M-xでは表示さM-:emacs evalます。あなたの答えのおかげで、コマンドを実行できます:)
PeterZD

6
ええ、M-x対話型の関数のみを実行しますM-:が、elisp関数は実行します。
asmeurer 2017年

40

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


私もそうします。それは筋金入りのemacs-yではありませんが、私が気にしているのは現在のファイルへのパスだけであれば、それは機能します。
andrunix 2017年

たとえばAというファイルを開いてから、Bなどの別のファイルにジャンプする場合、たとえばプラグインの定義へのジャンプ機能を使用すると、このメソッドはBではなくAのパスを表示します。したがって、この答えは、OPが求めていることを常に提供するとは限りません。
Abhishek Anand 2017

4
Cx Cvは、現在のパスだけでなく現在のファイルの名前も表示します
kuzzooroo

ido-mode以外のユーザーに適した@kuzzooroo(名前はido-modeを使用すると、Cx Cfに表示されます)。
Julien Palard 2017年

16

あなたが望むものの直接の実装は:

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


この設定の使用方法について詳しく教えてください。そして、「\ Cr」はどういう意味ですか?
モデラー2018

気にしないで。私はそれを考え出した。idoモードでファイルをポイントしているときに便利だと思います。Crを押すだけで、そのファイルの完全なパスを取得できます。本当に便利です。しかし、私はまだ知らないなぜ代わりにC.の使用\ C
モデラー

11

余分な機能は必要ありません。

M-! pwd

これは機能しますが、Windowsシステムでは機能しません。また、emacsの現在の作業ディレクトリが現在のバッファーのファイルのディレクトリと異なる可能性があるという事実を説明できません。でファイルにアクセスしてC-x C-fを実行しM-! pwdM-x cd別のディレクトリを選択してM-! pwd再度実行すると、これを確認できます。
josaphatv 2017

3

次のコードはすでに長い間使用されています。モードラインでバッファ名の上でマウスの中央ボタンを押すと、ファイルの完全パスがキルリングにコピーされます。モードラインのバッファ名で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

C-x C-dもを介して呼び出すM-x list-directoryことができ、現在のファイルのディレクトリが表示されます。ミニバッファーをクリアするには、「Enter」キーを押すだけです。詳細については、こちらをご覧ください


私のお気に入りの答えは、シンプルで迅速かつ簡単です!
ticktock

2

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


2

C-u C-x C-b 現在アクセスしているファイルをリストします。


1

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

xclip(Linux)、pbcopy(Mac)、putclip(Cygwin)のようなものにシェルアウトすることができます。

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

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

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


これは機能するはずですが、私には機能しません。(Ubuntu 14.04.1。)つまり、シェルに入力するdate | xclipと、xclip fileどちらもアドバタイズされたとおりに機能します(日付またはファイルのコンテンツをプライマリに保存します)。しかし、M-の後にこれらのコマンドのいずれかを入力すると、emacs(およびreturnヒット)では何も起こりません。カーソルは、追加の入力を期待しているかのようにミニバッファーに残ります。制御を取り戻すために中断した場合、プライマリには何も保存されません。
Silvio Levy

OK、あなたのアイデアはxclipの代わりにxselでうまく機能します:(shell-command (format "echo '%s' | xsel -i" buffer-file-name))-インタラクティブなコマンド(上記の@JeromeRadixによる最も支持された回答で提案されているように)にすると、これは大きな勝利です!ありがとう!
Silvio Levy

0

最も簡単な方法は

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

あなたはサイトでより多くの情報を見つけることができます


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.