質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

1回答

1271閲覧

vim内でjqを使ってjsonをフォーマットしたい

mochmoch

総合スコア39

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

0グッド

1クリップ

投稿2020/11/19 10:06

vimでjqを使ってjsonをフォーマットしたい

現在、vim-lsp-settingsを使ってLSPの管理をしています。
LspDocumentFormatでjqを実行したいので次のように~/.vimrcに書き込みました。

augroup jsonSettings autocmd! autocmd BufNewFile, BufRead *.json setlocal equalprg=jq\ -M\ "." autocmd BufWritePre *.json LspDocumentFormat augroup END

この状態でtest.jsonをvimで開き:wを行ってもフォーマットされません。

Pythonで同様の記述を行った場合はフォーマットされます。

augroup pythonSettings autocmd! autocmd BufNewFile, BufRead *.py setlocal colorcolumn=88 tabstop=4 softtabstop=4 shiftwidth=4 equalprg=yapf\ 2>/dev/null autocmd BufWritePre *.py LspDocumentFormat augroup END

:LspDocumentFormatでは

Document formatting not supported for json

と出力されるのですがどのように書くと思うような動作になるでしょうか

ご教授よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

jq自体は単純なCLIプログラムでlspとは関係がなく、記述の設定でも期待した動作はしなさそうです。

手前味噌ですが、自作のプラグインで以下のような設定をしています。(efm-langserverというcliプログラムの入出力をうまくlspで扱うためのツールを使います)

同じような設定を、vim-lsp-settingで入れたefm-langserverに設定してあげれば期待した動きになるのではないかと思います。

toml

1 jq-format: &jq-format 2 format-command: 'jq .' 3 format-stdin: true

https://github.com/tsuyoshicho/vim-efm-langserver-settings/blob/f5a500fc192118e1d42d53cb503af70f62854fd2/config/efm-langserver/config.yaml#L158-L160

toml

1 json: 2 - <<: *jq-format

https://github.com/tsuyoshicho/vim-efm-langserver-settings/blob/f5a500fc192118e1d42d53cb503af70f62854fd2/config/efm-langserver/config.yaml#L304-L306

投稿2020/11/19 13:23

編集2020/11/19 13:25
tsuyoshi_cho

総合スコア189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mochmoch

2020/11/20 13:50

お教え頂いたように設定しました。 * プラグインの追加 ```dein.toml [[plugins]] repo = "tsuyoshicho/vim-efm-langserver-settings" depends = ["vim-lsp"] ``` * lsp-settingsでefm-langserverを追加 ```vim :lspInstallServer efm-langserver ``` * `~/.config/efm-langserver/config.yaml`を作成(実際はシンボリックリンクを貼っています) ```config.yaml version: 2 root-markers: - .git/ commands: - command: vim arguments: - ${INPUT} title: vim tools: jq-format: &jq-format format-command: "jq ." format-stdin: true languages: json: - <<: *jq-format ``` この状態で`:LspDocumentFormat`を実行してもフォーマットがされません。 config.yamlのversionなどをいまいち理解しないまま書いているのでこの部分が設定できていないかjsonを開いたときに適用されているLspが違うのが原価と思うのですがどうすればよいでしょうか?
tsuyoshi_cho

2020/11/21 00:18

ええと、利用してもらったりはありがたいのですが、ある程度情報は提供はできましたが、どういう構成にしようとしており、それがどう動くか理解できてないと難しいところはあります(なんとなく、とりあえず設定してみた感になってるように見えます) jqでフォーマット、までの道程はいろいろあり、かつそれなりに手間がかかります。 * (今回の対象の)vim-lspが正常に動くこと * jqにパスが通っていること ここはOKとして A案 * (vim-lsp-settingsがあるので)InstallLspServerでefm-langserverを入れること * vim-lsp-settingsのefm-langserverを有効にする(後述) * efm-langserverの設定ファイルにjsonでjqでformatするように設定する(例示したやつ) ```vim let g:lsp_settings = { \ 'efm-langserver': {'disabled': v:false} \} ``` B案 * vim-efm-langserver-settingsを入れる * efm-langserverを手動で go get(go installでもいいが)し、パスを通す (vim-lsp-settingsから入れてもいいが、パスを通すのがちょっと面倒になるので、まあ一応できるとだけ言っときます) (efm-langserverの設定はプラグインがかかえているので不要) C案 * 自力でefm-langserverを入れる * 自力でefm-langserverの設定をする * 自力でvim-lspへサーバとして登録する などのどれかをやる必要があります。 今回やったのは、A案とB案のかけあわせになっているので、あとちょっと手とどいてません。 ちなみに最初の回答では、自分は(自分のをpushするわけじゃないので)すでにvim-lsp-settingsもあるしで、A案相当の説明をしたつもりです。 設定有効とか、「自分で入れたプラグインのことだし」で説明ははしょってる部分ありましたが。
mochmoch

2020/11/27 10:34

間が空いてしまい、申し訳ありません。 ドキュメントを読みつつなんとか設定することができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問