2024-02-24

Neovim 上でファイルパスをクリップボードにコピーする

現在開いているファイルのパスが欲しくなるときが意外とあります。クリップボードにコピーして、その次の行動に使えるようにしたいです。

コマンドが覚えにくい

しかしながら、Vim / Neovim でこれを実現するには少々面倒なコマンドが必要なようです。
私が最初に知ったのは stack overflow の こちらの質問 で紹介されている方法でした。

:let @+ = expand("%")

このコマンドを実行すると、たしかに期待通りの動きをしてくれます。

  • @ はレジスタを参照する場合の記法で @+ はクリップボードレジスタを表す
  • expand("%") で現在のファイルの相対パスを取得する

..というような仕組みによって、クリップボードレジスタにファイルの相対パスを書き込みます。

copy-file-path.nvim プラグインを作る

やりたいことは実現できたのですが、複雑で覚えられる気がしません。仮に覚えられたとしても入力が面倒なのでコマンド化はしたいところです。

このような背景で、copy-file-path.nvim という小さな Neovim プラグインを作りました。

https://github.com/mogulla3/copy-file-path.nvim

copy-file-path.nvim demo

使い方は簡単です。 lazy.nvimvim-plug などお気に入りのプラグインマネージャーでインストールするだけで、以下のコマンドが使えるようになります。

  • :CopyFilePath : CopyRelativeFilePath のエイリアス
  • :CopyRelativeFilePath : 相対パスをクリップボードにコピー
  • :CopyAbsoluteFilePath : 絶対パスをクリップボードにコピー
  • :CopyRelativeFilePathFromHome : $HOME からの相対パスをクリップボードにコピー
  • :CopyFileName : ファイル名のみをコピー

コピーすると Copied: .. とコピーした結果を出力するようにしてみました。ちょっと迷ったのですがあったほうが使っていて安心感があるなと感じたためです。

また私の経験上、相対パスを利用したくなるケースが最も多いので、これを最も短いコマンド :CopyFilePath でも実行できるようにしています。

さらに、お好みで以下のようなキーマップを追加するとよいかもしれません。

vim.keymap.set("n", "<Leader>cp", "<Cmd>CopyFilePath<CR>", { noremap = true, silent = true })

これで、<Leader>cp と入力するだけでカレントファイルの相対パスをコピーできるようになります。

おわりに

小さなプラグイン copy-file-path.nvim を作った話でした。 もし同じようなニーズを持っている Neovim ユーザの方がいたら、ぜひ使ってみてください。