はじめに
JSON文字列を整形して表示するというエントリを見て、quickrunを使わなくてももっと手軽な方法があるのでは、と思ったのが発端。
試してみたらあっさりと成功したので共有したい。
quickrunを使わずに整形する方法
1. 'equalprog'と={motion}を使う
={motion}は整形をするためのコマンドだと思われがちだが、ヘルプを読めば分かるが外部プログラムでフィルタするためのコマンドである。
{motion}で指定した範囲を'equalprog'に指定したプログラムでフィルタし、{motion}で指定した範囲をプログラムの実行結果で置き換えてくれる。
グローバルに設定してしまうと少し困ることになるので、setlocalでバッファローカルに設定する。
:setl equalprog=jq\ \".\"
jqに渡す引数まで含めるためにエスケープが必要となる。
その後バッファ全体を整形したいのであればgg=G、指定範囲だけjqで整形したければビジュアルモードで整形したい範囲を選択し、=するとjqで整形される。
JSファイルやjsonファイルを編集中に有効としたい場合は vimrcにこう書くとよい。
au FileType javascript setl ep=jq\ \".\"
au FileType json setl ep=jq\ \".\"
問題
quickrunと違い、jqに任意のオプションを渡すことが出来ない。
渡したければ都度'equalprog'の設定をする必要がある。
2. !{motion}{filter}を使う
こちらは設定すら不要である。
バッファ全体を整形したいのであればgg!G、指定範囲だけ整形したければビジュアルモードで整形したい範囲を選択して!とすると、フォーカスがコマンドラインに移るのでjq "."と入力してEnterするとjqで整形される。
都度jqコマンドを入力するのでコマンド一発とはならないがこちらであればjqに任意の引数を渡すことも出来る。