Vim - 編集中ファイルのパスをクリップボードに登録する
tips vim
編集中のパスを expand() で展開し、結果をレジスタ経由でクリップボードに登録する方法について。
モチベーション
カレントバッファのパスをコピーしたい
Windows 環境にて gVim を使っていた時にはあまりやる機会がなかったが、
開発環境が MacOS + Terminal(iTerm2) + Vim に移行してから、
カレントバッファのパスをコピーしたい というシチュエーションが増えた気がする。
Google 先生に尋ねればすぐにわかることだが、なかなか記憶に定着しないので簡単な記事にしておくことにする。
前提
Vim 内部だけでなく 外側のアプリケーション に結果を渡したいので クリップボード を経由して渡すことにする。そのため、使っている Vim が +clipboard にてビルドされている必要がある。
ビルド時のオプションを確認:
$ vim --version | grep clipboard
+clipboard +keymap +printer +vertsplit
+emacs_tags -mouse_gpm -sun_workshop -xterm_clipboard
-clipboard となっている場合は 残念ながら クリップボード連携が有効になっていないので、ここら辺 を参考に インストールし直そう。
解決方法
カレントバッファのパスをクリップボードへ登録:
:let @* = expand('%:p')
カレントバッファの親ディレクトリをクリップボードへ登録:
:let @* = expand('%:h')
カレントバッファのファイル名をクリップボードへ登録:
:let @* = expand('%:t')
組込関数 expand について
組込関数 である expand() は、引数が % か # か < で始まる場合には
続いて指定された変換子との組み合わせで、それぞれに関連付けられた変換を行った結果を返す。
今回使った % は 現在のバッファのファイル名(カレントディレクトリからの相対) を表し、以下の識別子と組み合わせることができる。
変換子:
:p フルパス名を展開
:h ヘッド(ディレクトリ)
:t テイル(ファイル名だけ)
:r 拡張子が削除される
:e 拡張子だけ
ある条件化での % と 識別子 との組み合わせの展開結果を 例として記載しておく。
条件:
- カレントディレクトリ:
/Users/micheam - 編集中ファイル:
/Users/micheam/Documents/Work/file.txt
展開結果:
| 識別子 | Exコマンド | 結果 |
|---|---|---|
| - | :echo expand(’%') | Documents/Work/file.txt |
| :p | :echo expand(’%:p') | /Users/micheam/Documents/Work/file.txt |
| :h | :echo expand(’%:h') | Documents/Work |
| :p:h | :echo expand(’%:p:h') | /Users/micheam/Documents/Work |
| :t | :echo expand(’%:t') | file.txt |
| :r | :echo expand(’%:r') | Documents/Work/file |
| :e | :echo expand(’%:e') | txt |
詳細は :h expand() を参照のこと。
vim-jp.org/vimdoc-ja
参考
-
macのvimでクリップボードにコピーを使いたい - Qiita
Homebrew にて連携可能な Vim をインストールする方法などについて解説している記事(macOS かつ Homebrew な人向け)1 -
Yank file name / path of current buffer in Vim - stackoverflow
掲題の件と類似した質問と解決方法。この回答 が的確で良かった。
おわり
-
Windows な人は Kaoriya さんが配布している Vim を使うのが良いだろう。確か
+clipboardでビルドされていたと思うので。 https://www.kaoriya.net/software/vim/ ↩︎