Vim-Galore : Vimについて知っておくべき全てのこと (3/5)

(訳注: 2016/2/26、記事タイトルを変更いたしました。)

vim-galore


特定のトピックについての記述をご希望ですか? Issueを立てるか、Twitterで私までお知らせください!ありがとう!


はじめに

基礎

使用方法

ヒント

  • 適切なnとNの振る舞い
  • 適切なコマンドライン履歴
  • 適切なCTRL-L
  • ビープ音とビジュアルベルを無効にする
  • 現在の行を動かす
  • 空行を追加する
  • マクロを編集する
  • ヘッダやソースファイルにジャンプする
  • GUIのフォントサイズを変更する
  • モードに応じてカーソルスタイルを変更する
  • セレクションを横に移動させた時に見失わない
  • 保存時にファイルをリロードする
  • スマートなカーソルライン
  • より速いキーワード補完

コマンド

  • :global – マッチする全ての行でコマンドを実行する
  • :normalと:execute – スクリプトの夢のチーム
  • :redir – メッセージのリダイレクト

デバッグ

  • 一般的なヒント
  • 起動時間のプロファイル
  • ランタイムでのプロファイル
  • verbose
  • Vimスクリプトのデバッグ
  • 構文ファイルのデバッグ

その他

  • その他の資料
  • Vimのディストリビューション
  • 標準プラグイン
  • CapsLockをCtrlにマップする
  • イースターエッグ
  • なぜナビゲーションはhjklなのか?

Quirks

  • 小さいファイルの編集が遅い
  • 大きいファイルの編集が遅い
  • NULに使われる改行
  • 括弧付きペースト(なぜいつも”paste”を設定しなくてはならないのか)
  • ターミナルでEscを使った時の遅延

カラースキームのリスト

プラグインのリスト

Neovim


使い方

オフラインでのヘルプの利用

Vimには、特殊なレイアウトのテキストファイル群から成る素晴らしいヘルプ文書が付属しています。Vimはタグをベースとするシステムを使って、これらのヘルプファイルの特定の部分にアクセスします。

まず始めに:help :helpを実行し、読んでください。新しいウィンドウで$VIMRUNTIME/doc/helphelp.txtというファイルが開いて、ファイル内の:helpタグに移動します。

簡単なルールがいくつかあります。

  • オプションはシングルクオートで囲む。 例 :h 'textwidth'
  • VimLの関数は()で終わる。 例 :h reverse()
  • コマンドは : で始める。 例 :h :echo

<c-d>(ctrlキー + dキー)を使えば、入力したクエリに一致する全てのタグのリストが出力されます。例えば、:h tab<c-d>と入力すると、tabの項の'softtabstop'からsetting-guitablabelまで全てのタグがリスト出力されます。

VimLの関数全部のリストが欲しければ簡単です。:h ()<c-d>。ウィンドウは別なほうがよければ、:h win*()<c-d>です。

ヘルプはすぐにうまく使えるようになりますが、特に最初のうちは、どんなタグを探せばいいのか見当がつかない時もあるでしょう。そんな時は関係のありそうなキーワードをいくつか思い浮かべてください。:helpgrepが役に立ちます!

:helpgrep backwards

このコマンドで、全てのドキュメントファイルから “backwards”という単語を探し、最初にヒットした箇所に移動します。検索結果はQuickfixリストの形に集約されます。:cn/:cpを使えば、次の/前の結果に移動します。または:copenでQuickfixリストをウィンドウ表示にして、<cr>を入力すればヒットした行に移動します。全容は:h quickfixを参照してください。

オフラインでのヘルプ(代替案)

次のリストは、Vim開発者の中でも活動的な@chrisbraによってまとめられ、vim_devに掲載されています。

若干の変更を加えてここに掲載しています。


探しているものが分かっていれば、ヘルプの検索を使った方が大抵の場合は簡単に見つかります。項目はスタイルガイドに沿って分類されています。

持っているVimのバージョンのヘルプで検索できるので、持っているバージョンより古いヘルプ項目や新しいヘルプ項目が検索結果に出ることはありません。

そのため、ヘルプの使い方やヘルプで使用されている言語を覚える必要があります。いくつか例を挙げます(内容的に不完全あるいは書き忘れたことがあるかもしれません)。

  1. オプションはシングルクウォート(一重引用符)で囲まれています。リストオプションのヘルプを検索する際には、:h 'list'を使用します。もし、特定のオプションを検索する場合は、:h options.txtと入力し、全てのオプションが記述されているヘルプのページを開いて、/widthのような正規表現を使用して検索することができます。オプションによっては、例えば:h cpo-a:h cpo-A:h cpo-bのように名前空間を持っています。

  2. コマンドのノーマルモードは名前のとおりです。:h gtと入力し、ヘルプページの”gt”コマンドを見ることができます。

  3. 正規表現の項目は必ず”/”で始まります。よって、:h /\+はVimの正規表現の”+”量指定子のヘルプにたどり着きます。正規表現について知りたい場合は、:h pattern.txtと入力して、表示されるテキストを読んでください。

  4. キーの組み合わせは通常、使用できるモードを表す1文字から始まります。例えば、:h i_CTRL-Xは、単語の補完やウィンドウスクロールのできる挿入モードのCTRL-Xコマンド類を見せてくれます。キーには、常に同じように書かれるものがあることに注意してください。例えば、コントロールキーは常にCTRLと記載されます。ノーマルモードコマンドに関するヘルプの場合は、ノーマルモードを表す”n”は必要なく、:h CTRL-文字で十分です。例えば:h CTRL-Aのように。反対に、:h c_CTRL-RはCTRL-Rがコマンドラインで何をするのか表示します。:h v_Ctrl-Aはビジュアルモードで数字のインクリメントを行い、:h g_CTRL-Aはgコマンドを表示します(このように”g”を押します)。この”g”はノーマルコマンド”g”を意味し、”z”から始まるコマンドと同じように、続く文字が必要となります。

  5. レジスタは常に”引用符”で始まるので、:h quoteを入力して、表示される特定の”:”レジスタに関するテキストを読んでください。

  6. Vimスクリプト(VimL)は、:h eval.txtで表示されます。’X’を:h expr-Xと入力すれば、言語の特定の一面が表示されます。例えば、:h expr-!と入力すると、VimLの’!’ (論理否定)演算子の簡単な説明が表示されます。

  7. :h map.txtと入力すれば、ヘルプページでマッピングについての説明が読めます。:h mapmode-iと入力すると、:imapコマンドについての説明が読めます。また、:map-topicと入力すると、マッピングに関する小項目が表示されます(例えば、:h :map-localでバッファローカルマッピング、:h map_barで’|’がマッピングでどのように扱われているのかが表示されます)。

  8. コマンドの定義は、:h command-*で表示されます。:hコマンドバーを使用すれば、カスタムコマンドの’!’引数についての説明が読めます。

  9. ウィンドウ制御コマンドは必ずCTRL-Wで始まります。:h CTRL-W_*(*に文字を入れる)と入力すれば該当のヘルプが表示されます(例えば、:h CTRL-W_pと入力すると前のウィンドウに移るヘルプが表示されます)。また、ウィンドウ操作に関するコマンドについては:h windows.txtにアクセスして説明を読んでください。

  10. Exコマンドは常に”:”で始まるので、:h :sに”:s”コマンドが含まれます。

  11. 項目を入力した後で、CTRL-Dを使用すれば、Vimにある関連した項目を全て表示してくれます。

  12. :helpgrepを使用すれば、全ヘルプページで検索できます(プラグインでインストールされたヘルプページも大抵含まれます)。:h :helpgrepと入力して、使い方を参照してください。項目を検索するとクイックフィックス (あるいはロケーション) ウィンドウで表示可能になり、:copen:lopenで開くことができます。さらに/を使用して検索を絞り込むことができます。

  13. :h helphelpと入力すれば、ヘルプの使い方に関する情報を見ることができます。

  14. ユーザマニュアルは初心者にとってより親しみやすい項目について説明しています。:h usr_toc.txtから始めると、目次が出てきます(おそらく想像通りです)。興味を引く項目がないか見てください。例えば、24章に”Digraphs”や”特殊文字入力”のような項目があります(このヘルプページに移りたい場合は、:h usr_24.txtと入力してください)。

  15. ハイライトグループのコマンドは常にhl-*で始まります。例えば、:h hl-WarningMsgは、”WarningMsg”(警告メッセージ)グループをハイライトするよう指定できます。

  16. 構文ハイライトは”:syn-topic”の名前空間を持ちます。例えば、:h :syn-concealは:syn コマンドの Conceal 引数について書かれています。

  17. クイックフィックスコマンドは大抵”:c”で始まり、ロケーションリストコマンドは大抵”:l”で始まります。

  18. :h BufWinLeaveでBufWinLeaveの自動コマンドを説明します。全てのイベントは:h autocommands-eventsで説明されています。

  19. 起動引数は常に”-“で始まります。よって、:h -fを入力するとVimの”-f”コマンドスイッチのヘルプが表示されます。

  20. オプションの機能は常に”+” から始まります。よって、conceal機能の使い方について調べるのであれば:h +concealを入力してください。

  21. エラーと警告のコードを直接ヘルプで見つけることができます。:h E297でエラーメッセージの説明を読むことができます。しかしながら、エラーコードによっては説明されていないものがありますが、大抵はそれを引き起こすVimコマンドに記載されています。例えば、:h hE128と入力すると、直接:functionコマンドに移ります。

  22. 構文ファイルを含むドキュメントは通常:h ft-*-syntaxで見つけることができます。例えば、:h ft-c-syntaxでは、C構文ファイルとそのファイルで提供されるオプションを見つけることができます。場合によっては、オムニ補完(:h ft-php-omni)やファイルタイプのプラグイン(:h ft-tex-plugin)を提供していることがあります。

さらに、存在する場合は、ユーザドキュメント(多くの場合、コマンドの説明はユーザ視点からのものが多く、詳しく書かれているものは少ない)へのリンクはヘルプページの一番上に記載されています。:h pattern.txtでユーザマニュアルの項目である:h 03.9:h usr_27を見ることができます。

オンラインでのヘルプ

どうしても解決のできない問題があったり、一般的な情報が必要だったりする場合は、vim_useのメールリストを参照してください。別の素晴らしい資料としては、IRCがあります。Freenode#vimチャンネルを使用している人が多く、役立つ情報を多く得ることができます。

Vimのバグの報告はvim_devメールリストを使ってください。、

クリップボード

GUIサポートのないVimをUNIXシステムで使用する際に、'clipboard'オプションを使用する場合は、+clipboard、そして随意で+xterm_clipboard 機能 が必要となります。

関連するヘルプ:

:h 'clipboard'
:h gui-clipboard
:h gui-selections

記事後半の括弧付きペースト(なぜいつも”paste”を設定しなくてはならないのか)も参照してください。

クリップボードの使用法(Windows、OS X)

Windowsにはclipboard機能があります。OSXにはpasteboard機能があります。

両方ともユーザが期待するような機能です。コピーしたいテキストをctrl+c/cmd+cで選択し、ctrl+v/cmd+vで別のアプリケーションにペースト(貼り付け)できます。

コピーされたテキストはクリップボートに移されるため、コピー元のアプリケーションを他のアプリケーションにペーストする前に閉じても問題はないことを覚えておいてください。

この作業の時、クリップボードレジスタの*には選択範囲の文字列が入ります。Vimからは、"*y"*pを使ってクリップボートにあるテキストをヤンク・ペーストしてください。

常に*レジスタを指定したくない場合は、次をvimrcに入れてください。

set clipboard=unnamed

通常、ヤンク/削除/貼り付け機能の場合、"レジスタが使われます。この場合、*レジスタが同じ機能に使用されるため、ypと入力するだけで十分になります。

繰り返しになりますが、上のオプションを使用することで、同じVimのウィンドウで使用する場合でも、全てのヤンク・ペーストでクリップボードは変更されます。これが便利かどうかは使い手次第です。

yとタイプするのさえ面倒な人は、設定を次のようにすることで全てのビジュアル選択をクリップボードに送ることができます。

set clipboard=unnamed,autoselect
set guioptions+=a

関連するヘルプファイル:

:h clipboard-unnamed
:h autoselect
:h 'go_a'

クリップボードの使用法(Linux、BSD他)

お使いのOSがXの場合、クリップボートの使い方は若干変わってきます。XはX Window System Protocolのオープンソース実装で、1987年から提供されており、現在バージョン11が提供されています。そのため、X11とも呼ばれます。

以前、X10のバージョンでカットバッファが導入されました。これは、クリップボードのようなもので、コピーされたテキストはXによって格納され、全てのアプリケーションからアクセスが可能でした。この仕組みは今でもXに存在しますが、今では使用が反対され、多くのソフトウェアではもう使用されていません。

現在はアプリケーション間のデータの移動は、セレクション機能で実行されます。定義された3つのセレクションアトムの中でも、実際使用されているのはプライマリ選択とクリップボード選択の2つのみです。

この2つのセレクションは次のように機能します。

Program A: <ctrl+c>
Program A: クリップボードの所有権を持ちます
Program B: <ctrl+v>
Program B: クリップボードの所有権はProgram Aにあります
Program B: Program Aにデータをリクエストします
Program A: リクエストに応答して、Program Bにデータを送ります
Program B: Program Aからデータを受け取り、ウィンドウに挿入します

選択 使用する時 ペーストの方法 Vimからアクセスする方法
プライマリ テキストの選択 middle-clickshift+insertの入力 *レジスタ
クリップボード テキストの選択およびctrl+cの入力 ctrl+vの入力 +レジスタ

注:セレクションがXサーバに格納されることは絶対にありません(クリップボードセレクションでさえ格納されません)。そのため、アプリケーションを終了するとctrl+cでコピーしたものは失われます。

"*pを使用してプライマリ選択したものをペーストするか、"+y1Gを使用して、クリップボード選択へファイル全体をヤンクしてください。

もし、この2つのレジスタにアクセスする頻度が高い場合は、次を使うのも良いでしょう。

set clipboard^=unnamed      " * register
" or
set clipboard^=unnamedplus  " + register

(^=はデフォルト値の:h :set^=を追加するときに使います)

これで全てのヤンク/削除/貼り付け機能は、無名の"レジスタの代わりに*+で使用することができます。これによって、後でypでX選択に簡単にアクセスすることができます。

関連するヘルプ:

:h clipboard-unnamed
:h clipboard-unnamedplus

ファイルを開いてカーソルの位置を元に戻す

この機能がないと、ファイルを開くとカーソル位置は一行目に戻ります。この機能があれば、カーソルの位置はファイルを閉じる前に作業していたところに復元します。

次をvimrcに追加してください。

autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line("$") |
    \   exe "normal! g`\"" |
    \ endif

これを追加することで、作業していた場所が存在すれば(他のプログラムによってファイルの行数が減っている場合があります)、g`"(ジャンプリストを変更することなく、最後に作業していた場所にカーソルが移動します)が実行されます。

これをするには、:h viminfo-'というviminfoファイルを使用する必要があります。

バックアップ/スワップ/アンドゥ/viminfoファイル

オプションによっては、Vimは最大で4つの作業ファイルを作成します。

バックアップファイル

Vimに元のファイルをバックアップするように指定できます。デフォルトでVimはバックアップを自動的に作成しますが、元のファイルの書き込みが成功するとバックアップを削除してしまいます(:set writebackup)。最新のバックアップファイルを取っておく場合は、:set backupを使います。あるいは、:set nobackup nowritebackupでバックアップを作成しないよう設定することもできます。

では、私が最後にvimrcに追加したものを見てみましょう。

$ diff ~/.vim/vimrc ~/.vim/files/backup/vimrc-vimbackup
390d389
< command! -bar -nargs=* -complete=help H helpgrep <args>

関連するヘルプ::h backup

スワップファイル

例えば、最高のサイエンスフィクション小説を書くアイデアが浮かんだとします。何時間も没頭して何千のも文字を書き続けて、停電になってしまったとします。そして、~/wicked_alien_invaders_from_outer_space.txtを保存していなかったことに気が付きます。

絶望的ではないのでご安心を。ファイルを編集する際、Vimはオリジナルに保存されていない変更箇所を保持するスワップファイルを作成します。試してみましょう。ファイルを開いてみて:swapnameで現在のスワップファイルがあることを確かめてみてください。:set noswapfileをvimrcに追加することでスワップファイルも作成されないよう設定できます。

デフォルトで、スワップファイルは編集したファイルと同じディレクトリに.file.swpのような名前で作成されます。スワップファイルの更新は200文字が変更された場合または4秒間タイプしていない場合にされます。ファイルの編集が終了するとスワップファイルは削除されます。更新の設定は:h 'updatecount':h 'updatetime'を使用して変更することが可能です。

停電のせいでスワップファイルは削除されることはありませんでした。Vimで~/wicked_alien_invaders_from_outer_space.txtを入力すれば、Vimはファイルを復元してくれます。

関連するヘルプ::h swap-file and :h usr_11

アンドゥファイル

アンドゥファイルはメモリに格納され、Vimを終了すると削除されます。残しておきたい場合は、:set undofileにします。すると、~/foo.c.un~にアンドゥファイルを~/foo.cとして保存することができます。

関連するヘルプ::h 'undofile'および:h undo-persistence

Viminfoファイル

バックアップファイルやスワップファイル、アンドゥファイルはどれもテキストの状態に関するものでした。viminfoファイルはそれ以外のもの、Vimを終了すると失われてしまうものを保存するために使用します。viminfoファイルには履歴(コマンドライン、検索、入力)、レジスタ、マーク、バッファリスト、グローバル変数などが格納されます。

デフォルトでviminfoは~/.viminfoに書き込まれるよう設定されています。

関連するヘルプ::h viminfoおよび:h 'viminfo'

私のように、上記全てのファイルを同じ場所、例えば~/.vim/filesに格納したい場合は次のとおりです。

set backup
set backupdir   =$HOME/.vim/files/backup/
set backupext   =-vimbackup
set backupskip  =
set directory   =$HOME/.vim/files/swap//
set updatecount =100
set undofile
set undodir     =$HOME/.vim/files/undo/
set viminfo     ='100,n$HOME/.vim/files/info/viminfo

~/.vim/filesディレクトリは前もって作成する必要があります。作成しておかないとエラーが生じます。頻繁に新しいホストで作業をする場合は、これを自動化した方がいいでしょう。

if exists('*mkdir') && !isdirectory($HOME.'/.vim/files')
  call mkdir($HOME.'/.vim/files')
endif

注:共有のシステムで編集をしていて、スワップファイルがすでにあるとVimが知らせてきた場合、他の人がファイルを編集している最中であることを意味します。この”機能”は、スワップファイルをホームディレクトリに保存してしまうと失われてしまいます。

リモートファイルの編集


Vimにはリモートファイルの編集を可能にするnetrwプラグインが付いてきます。実際には、リモートファイルをローカルtempファイルにscp経由で移動し、そのファイルを使用してバッファを開き、変更をリモートファイルに書き込み、保存します。これは、ローカル設定で使用したい場合は、サーバにSSHしたり、管理者に指示されたものを使ったりするよりも、遥かに便利です。

:e scp://bram@awesome.site.com/.vimrc

~/.ssh/configがすでに設定されている場合は、自動的に次のことが実行されます。

Host awesome
    HostName awesome.site.com
    Port 1234
    User bram

これが、~/.ssh/configの中にあれば、下も可能です。

:e scp://awesome/.vimrc

~/.netrc, see :h netrw-netrcを使用しても同じようなことができます。

:h netrw-ssh-hack:h g:netrw_ssh_cmdは必ず読むようにしてください。

また、FUSE を使用するsshfsを使用してリモートファイルシステムをローカルファイルシステムに搭載する方法もあります。

プラグインの管理

Pathogenは、プラグインを管理するための最初の人気のあるツールです。実際に行っていることは、全てを適したディレクトリの下に含めるようにランタイムパス:h 'rtp')を調整する、というものです。プラグインのレポジトリを、自分の手でクローニングしなくてはいけません。

実際のプラグインマネージャはVimの中からプラグインをインストールしアップデートするコマンドを提供します。以下に挙げるのは、一般的に使われるマネージャのリストをアルファベット順に並べたものです。

私のお気に入りはplugです。でも皆さんの役に立つのは、様々かもしれません。

ブロックの挿入

これは複数の連続した行に、同じテキストを同時に挿入するテクニックです。こちらのデモを見てください。

<c-v>でビジュアルブロックモードに切り換えます。その後、数行ほど下へ移動したら、IあるいはAを押して、テキストを入力し始めましょう。

最初は少し当惑するかもしれませんが、テキストはいつも現在の行に挿入され、現行の挿入が終わった後にだけ、先のビジュアルセレクションの行すべてに同じテキストが適用されます。

簡単な例としては、<c-v>3jItext<esc>になります。

もしも異なる長さの行があり、各行の終わりに同じテキストを付け加えたいのなら、次のことを実行しましょう。<c-v>3j$Atext<esc>

時には、現在の行の終わりのどこかにカーソルを置く必要があることもあります。これはデフォルトでは行えませんが、オプションのVirtualeditを設定することができます。

set virtualedit=all

その後で、行の最後であっても$10l あるいは90|が働きます。

さらに情報が欲しい方は、:h blockwise-examplesを参照してください。最初は複雑に思えるかもしれませんが、すぐに習慣づくでしょう。

もしも本当に手の込んだものがお望みなら、マルチカーソルを見てみましょう。

外部プログラムの実行と、フィルタの使用

免責事項:Vimはシングルスレッドなので、外部のプログラムをフォアグラウンド処理で実行すれば、他のものも全部ブロックされてしまいます。もちろん、LuaなどのVimのプログラミングインターフェースや、そのスレッドのサポートを使うことができます。しかしそれでも、その間Vimのプロセスはブロックされます。Neovimは適したジョブAPIを加えることで、この問題を解決します。

(どうやらBramはVimにもジョブコントロールを加えることを検討しているようです。最新のバージョンを持っているなら、:helpgrep startjobを見てください。)

ジョブを始めるために、:!を使いましょう。現在稼働しているディレクトリでファイルをリスト化したいのなら、:!lsを使いましょう。通常どおりシェルの中で命令するためには、|を使います。例えば、:!ls -1 | sort | tail -n5のような感じです。

範囲がないのなら、:!のアウトプットはスクロールできるウィンドウで見られるでしょう。その一方、範囲が与えられているのなら、これらの行はフィルタにになるでしょう。つまり、フィルタプログラム上で標準入力によって命令されているということです。そして処理はフィルタの標準出力によって置き換えられます。例えば、次の5行のために数字を用意するためには、次を使いましょう。

:.,+4!nl -ba -w1 -s' '

手動で範囲を加えることはかなり面倒なので、Vimは便利なヘルパーも用意しています。範囲にはよくあることですが、ビジュアルモードで行を選択することもでき、それからをヒットします。また、動作を行う!オペレータもあります。例えば、!ip!sortは、現在のパラグラフの行をソートします。

フィルタリングの良いユースケースとしては、Go programming languageがあります。このインデントは独断的ですが、Goのソースコードを適切にインデントするgofmtと呼ばれるフィルタも付いてきます。ですからGoのためのプラグインは、しばしば:Fmtと呼ばれるヘルパーコマンドを提供します。それは基本的には:%!gofmtを行い、ファイルの全ての行をインデントします。

現在の行より下でプログラムのアウトプットを取り出すために、しばしば:r !progが使われます。これはスクリプトには問題ありませんが、実行中の場合には代わりに:r !progを使う方が簡単だと思います。これは現行の行と置き換わるものです。

:h filter
:h :read!

Matchlt

VimはC言語内で書かれたものなので、多くの特徴はC言語に似た構文と考えられます。デフォルトでは、カーソルが{あるいは#endifにある時、%を使ってそれぞれ対応する}#ifdefにジャンプすることができます。

Vimにはmatchit.vimと呼ばれるプラグインがバンドルされています。デフォルトでは有効になっていません。また、%をHTMLタグに循環させ、VimLなどでifやelse、endifなどを構築し、新しいコマンドをいくつか導入します。

プラグインを常に読み込むには、vimrcに以下を追加しましょう。

if !exists('g:loaded_matchit')
  runtime macros/matchit.vim
endif

Matchitのドキュメンテーションはかなり広範囲に渡るので、次のものも1回試してみることをお勧めします。

:!mkdir -p ~/.vim/doc
:!cp $VIMRUNTIME/macros/matchit.txt ~/.vim/doc
:helptags ~/.vim/doc

これでプラグインを使う準備ができました。サポートされているコマンドは:h matchit-introを、サポートされている言語は:h matchit-languagesを参照してください。

対応したペアを定義するのは簡単です。

autocmd FileType python let b:match_words = '\<if\>:\<elif\>:\<else\>'

その後で、%(前)やg%(後ろ)を使うことで、Pythonmのどのファイルでもこの3つのステートメントを循環させることができます。

関連するヘルプ

:h matchit-install
:h matchit
:h b:match_words