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/ ↩︎