結論から先に書く
function pbvim (){readonly pbvim_tmp_file=./.pbvim.tmp
pbpaste | vim - +"w $pbvim_tmp_file"cat"$pbvim_tmp_file" | tr-d"\012"| pbcopy # tr は末尾の改行を削除するためrm-f"$pbvim_tmp_file"}
上記の関数を rc ファイルに追加する。 ( e.g ~/.bashrc
~/.zshrc
)
シェルを再起動して pbvim
を実行すると、vimでクリップボードのテキストを直接編集して上書き出来る。
ccc/pbvim at master · YumaInaura/ccc
ステップ解説
Step. 標準出力からVim編集を開始する
pbpaste | vim -
ただ、このやり方だとファイル名を渡していないため、そのままだと編集できない
Step. Vimにファイルパスを渡す
pbpaste | vim - +"w some_filepath"
「シェルから実行するvimコマンド」の引数として「vim 内部のコマンド」を渡す。
:w some_filepath
という「vim内部のコマンド」がファイル編集前に実行される。 ( some_filepath
という名前で編集内容を保存 )
Step. 一時ファイルを利用
vimでの編集内容を pbcopy コマンドに標準入力として渡したいが、
vim コマンドはファイル内容を標準出力するわけではないので、ここでは一時ファイルを利用する。
- 一時ファイルを作成
- pbpaste での標準出力をvimに渡す
- vimで編集して一時ファイルに記録された内容を、別コマンド ( cat ) で標準出力する
- 標準出力を pbcopy コマンドに渡す
- 一時ファイルを削除する
この流れ全体を実行したのが最初の例である。
Versions
- VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 7 2018 21:58:18)
- Max OS X High Sierra
Ref
- Read from stdin to new, named, file in vim - Super User
- How to save as a new file and keep working on the original one in Vim? - Stack Overflow