🦍

LanguageToolのLinterで英文法をチェック

2022/01/22に公開

初めに

ども、今年から本格的に英語を勉強し始めたゴリラです。

みなさん、英文法チェックするときはどうしていますか?
GrammarlyDeepLを使って翻訳した文を確認する、といったやり方があるかと思います。

しかし、自分はVimで英語を書くのがメインになることが多いため、Vimで英文を書きながら、間違った場合は指摘してほしいなと思っています。
そこで、LanguageToolを使って、必要に応じて文法チェックをしてくれるようにLintツールlanguagetool-lintを作りました。
今回の記事はこのLintツールの紹介になります。

使い方

まず最初にLanguageToolをインストールする必要がありますが、Dockerがある場合は次のコマンドでサーバを立ち上げられます。

$ docker run -d -p 8010:8010 erikvl87/languagetool

languagetool-lintは主に標準入力と指定されたファイルの英文をチェックして、次のような結果を出力します。
フォーマットはfilename:line:colというふうになっていて、どの行のどの列から始まる単語が変なのかを教えてくれます。

$ cat your_text_file
When you type |:write|, then it would be executed in terminal, and
you can choose any options(e.g add labels).

$ languagetool-lint -a http://localhost:8081 -l "en-US" your_text_file
your_text_file:2:27: The abbreviation “e.g.” (= for example) requires two periods.

$ echo "this is a pen." | languagetool-lint
stdin:1:0: This sentence does not start with an uppercase letter.

この出力をVimのlocationリスト/quickfixに流すと、簡単に英文法を修正できます。

上記のデモは次の設定になっています。

function! s:languagetool_lint() abort
  let fname = expand('%')
  if !filereadable(fname) || &modified
    let fname = tempname()
    call writefile(getline(1, '$'), fname)
  endif
  let cmd = printf('languagetool-lint %s', fname)
  lgete system(cmd) | lw
endfunction

command! LanguageToolLint call <SID>languagetool_lint()

LS(Language Server)として使う

efm-langserverと組み合わせることで、LSを通して間違った英文を教えてくれます。

詳細の設定はこちらを参照してください。

最後に

今回LSはefm-langserverを通していますが、将来的にlanguagetool-lint自身にLSを実装して、efm-langserverへの依存をなくしたいと考えています。
CodeActionで単語を登録したり、正しい文法を選択できたら便利かなと思います。

Discussion