Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5657

coc.nvim の CocAction ってなんだ?

$
0
0

簡単に言えば、エラーとかワーニングが表示されたときに、チョチョっと直してくれるいわゆる クイックフィックスのような機能を呼び出すために使うそうです。

正確に言えば、Language Server Protocol の Code Action Request に該当する機能を呼び出すものだと思われます(理解はできていないので、正確にとは言い辛いのですが...)。

" Add `:Format` command to format current buffer.
command!-nargs=0 Format :call CocAction('format')

定義

coc.nvim のドキュメントを検索しても見つからず、Visual Studio Code と Language Server Protocol の仕様書の中に類似の用語が見つかりました。

Visual Studio Code の機能うち Code Navigation とカテゴリに分類される Code Action の記述が、具体的にどういった機能を提供してくれているか、わかりやすいです。

Visual Studio Code > Code Navigation > Code Action
Warnings and Errors can provide Code Actions (also known as Quick Fixes) to help fix issues. These will be displayed in the editor in the left margin as a lightbulb. Clicking on the lightbulb will either display the Code Action options or perform the action.

LSP の仕様書のうち Language Features に分類される Code Action Request に記述が、内部でどういった動作をしているかの雰囲気を伝えてくれています。

Language Server Protocol Specification > Language Features > Code Action Request
The code action request is sent from the client to the server to compute commands for a given text document and range. These commands are typically code fixes to either fix problems or to beautify/refactor code.

背景

公式ドキュメントの Example vim configuration にある以下の設定をいれると...

" Add `:Format` command to format current buffer.
command!-nargs=0 Format :call CocAction('format')

:Formatを押下したタイミングで Formatter が走ってくれます。各言語ごとに Formatter の設定は必要になります。例えば JavaScript は、以下の通りです。

'format'以外にも使えるアクションがいくつかありそうです。一覧は以下のリンクをご参照ください。

"format"                    *coc-action-format*


    Format current buffer using the language server.
    Return `v:false` when format failed.

補足

:Formatを打つと :call CocAction('format')が実行されます。

command!-nargs=0 Format :call CocAction('format')
  • commandはコマンドラインモードで呼び出すコマンドを定義するそうです。
  • !は、それ以前に同じコマンド名 Formatがあった場合、それを上書きすそうです。
  • 上書きっていいのかなと思ったのですが vimscript は、この !をよく見かけます。そう言う文化なのでしょうか。Python では、属性名にプライベート __ではなくプロテクテッド _が使われるように。
  • -nargs=0は、引数がないことを表すそうです。

このあたりの動作は以下の本で勉強させていただきました。vim の help だけでは自分には難解すぎて読んでもわからず、本当に助かりました。

検索

CocActionが検索するも何かよくわからず調べていました。

Step 1. :help CocActionで検索する。

:{range}CocAction  [{only}]         *:CocAction*

        Get codeActions of current document in actions list,
        with optional {range}.

        {only} can be 'quickfix' or 'source' as CodeActionKind.

Step 2. :help codeActionsで検索する。

"codeActions" [{visualmode}] [{only}]       *coc-action-codeActions*

    Get codeActions of current range.

    {visualmode} can be result of |visualmode()| for visual selected
    range, When it's empty string or not exists use current line.

    {only} can be used to limit codeActionKind, possible values:
    'refactor', 'quickfix' and 'source'.

Step 3. s を除いた :help codeActionで検索する。

"codeAction" [{mode}] [{only}]          *coc-action-codeAction*

    Prompt for a code action and do it.

    {mode} should be result of visualmode(), when used in visualmode,
    could be empty string or v:null for none visualmode.

    {only} can be title of a codeAction or list of CodeActionKind.

Step 4.

ここで詰まってしまい、しばらくネットをさまよっていました。以下の記事から、どうも coc.nvim に限定された用語ではなさそうなことがわかり...

単純に code action で検索したら LSP や VS Code の記事に辿り着きました。以上になります。ありがとうございました。


Viewing all articles
Browse latest Browse all 5657

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>