Emacsで編集しているファイルの完全なパスを取得する必要があります。
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つの答えを組み合わせることで、欲しいものを手に入れることができました。答えてくれてありがとう。そして、さらにいくつかの質問。
組み込み関数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
JérômeRadixの答えを借りて、現在のバッファのファイルパスをすばやく確認したい場合は、M-: buffer-file-name
。
私のトリックは、C-x C-f
を実行してファイルを開くことです。ミニバフに現在のファイルパスC-g
を事前に入力して終了します。 M-: buffer-file-name
より高速ですが、他のどの方法よりもはるかにいです。
あなたが望むものの直接の実装は次のとおりです。
(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
の呼び出しで、文字列をキルリングに入れます。
特別な機能は不要、ただ
M-! pwd
私は次のコードをすでに長い間使用しています。モードラインでバッファ名の上でマウスの中ボタンを押すと、完全なファイルパスをキルリングにコピーします。モードラインの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)))
C-x C-d
は、M-x list-directory
からも呼び出し可能で、現在のファイルのディレクトリを表示します。ミニバッファーをクリアするには、「Enter」キーを押すだけです。追加の詳細情報が利用可能です こちら 。
他のアプリで情報を使用できるように、キルリングではなくパス名をシステム(OS)のクリップボードにコピーできますか?
Xclip(Linux)、pbcopy(Mac)、putclip(Cygwin)のようなものにシェルアウトすればできます。
個人的には、ラッパースクリプトc
とp
をそれぞれコピーと貼り付けに使用します。最初は標準入力から読み取り、後者は標準出力に書き込みます。そのようにして、これは私のすべての開発プラットフォームで動作します:
(Shell-command (format "echo '%s' | c" buffer-file-name))
これは、Emacsのクリップボードサポートを使用するよりも信頼性が高く、設定可能です。たとえば、私のc
コマンドは、入力をLinux上の3つのクリップボードすべて(プライマリ、セカンダリ、クリップボード)にコピーするので、Ctrl-Vまたは中クリックのいずれかで貼り付けることができます。
C-u C-x C-b
は、現在ファイルを訪問しているバッファをリストします。
C-x C-b
は、バッファのリストと、該当する場合は各バッファのファイルパスを示します。
copy-buffer-file-name-as-kill
from [0]は、私が思うに必要なことを正確に行います。また、ディレクトリ名のみ、またはファイル名のみをコピーするオプションもあります。
[0] http://www.emacswiki.org/emacs/download/buffer-extension.el
最も簡単な方法となるだろう
(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 で詳細を確認できます。