🎄

Vim でよく使う Vim じゃない機能

2023/12/09に公開

こんにちは。42 Tokyo というパリ発のエンジニア養成機関の 2023 年度アドベントカレンダー 8日目を担当します、在校生の now4est と申します。
(言い訳が通用しないタイムスタンプになってしまいました 🙇)

7日目の昨日は、snara さんが「コマンドラインで作曲したい!〜 MML to MIDI compiler のようなものを作ってみた〜 #Go - Qiita」という記事を書かれていました。
Qiita デイリーいいね数ランクイン記事です。要チェックですね。

今日の記事は

よくわからないタイトルですみません。主に外部コマンドとの連携のお話です。
自分がよく使っているものを紹介します。-clipboard -terminal な Vim でも使えるはずです。
よりスマートな方法も色々とあると思います。ぜひ教えてください。
また、間違い等がございましたら、こちらもぜひお知らせください。

ファイル全体をクリップボードへコピーする

MacOS 向け

:w !pbcopy

GNU/Linux なら

:w !xsel -ib

など

あるいは、厳密には「コピー」ではなく「切り取り」相当の挙動になりますが

:%!pbcopy
:%!xsel -ib

実行後に u キーで undo すると良い感じです。

現在の行をクリップボードへコピーする

:.!pbcopy

%. で範囲を指定しています。詳しくは Vim の :help range で調べてみてください。Web ブラウザで確認するなら help - Vim日本語ドキュメントで。
! の後にシェルコマンドやシェルスクリプトを続けます。シェルコマンドには標準入力として渡され、実行されます。

本来はテキストを外部で加工して Vim へ戻す機能です。
「切り取り」相当ではなく、より「コピー」っぽくするなら (zsh 環境が前提ですが)

:.!tee >(pbcopy)

ただし、これも編集履歴に残ったりと若干癖があります。何より面倒なので使わないです。
tee コマンドは別の形でよく使います。

管理者権限で保存

これです。今までの組み合わせです。

:w !sudo tee >/dev/null %

シェル側で保存を行っているので、Vim 終了時に未保存のメッセージが表示されます。Don't Panic
%:help cmdline-special で確認できます。
ネット上に詳しい解説記事がたくさんありますので、詳細はググってみてください。

編集中のファイルのパスをコピーする

これも % の活用です。(zsh 前提)

:!pbcopy <<< '%:p'

<<< は zsh の here-string です。詳しくは man zshall で検索してみてください。

シェルコマンドの実行結果を読み込む

write ときたら read です。

:r !ls -1

ls コマンドの結果などは、42 の課題でも便利ですね。

シェルのコマンド履歴を読み込む

作業ログをまとめる際に便利です。(zsh 前提)

:r !fc -R ~/.zsh_history && fc -ln

~/.zsh_history は適宜置き換えてください。$HISTFILE で確認できると思います。
fchistory の実態です。インタラクティブシェル向けの機能を別の場所で利用するには若干工夫が必要です (たぶん)
履歴ファイルを読み込ませ出力させたものを Vim で読む感じです。fc については man zshall で。

まとめ

Vim を使いこなすのは大変ですが、外部との連携さえできれば、それらをシームレスに有効活用できます。
今日は書ききれませんでしたが、オススメは jq や pandoc などです。うまくやり取りできれば、ターミナルとの行き来が無くなるので、いわゆる「Vim でやった方が早い」率がさらに高まります 😁

明日は

corvvs さんが「暗号学的ハッシュ関数」について書いてくれる予定です、そちらの記事もお楽しみに!


corvvs さんと言えば、4日目の記事も担当されていました。こちらもチェック済みでしょうか?

とても難しい内容だったのですが、調べつつ読んでみると、CTF の高度な問題としても扱われていました。
CTF も少しずつ手を出しているので、引き出しが増えて良かったです。(分かっていないですが)

GitHubで編集を提案

Discussion