2019年3月2日土曜日

Emacsで文法チェックをやるflycheckの見直し?

私はDebian上のエディタは、emacs(26.1)をメインにしている。 まあ、vimが周辺をサポートしているのようなのだが。

用途は、org-modeをメモに使っているのと、少し長めのpythonスクリプト。 素人なので、コピペ基本の設定である。

今回は flycheck について見直してみた。

各種言語で書かれた文書に対して文法チェックを行うプログラムをlintというらしい(wikipedia)。 実行したりコンパイルしたりする前にチェックするためのもの。

flycheckは、 Flycheck is a modern on-the-fly syntax checking extension となっている。 syntax checkerとlintの違いがよく分らないが、 実質的なチェックは別プログラムがやっているので、 lintを利用する仕組みと考えればよいのかもしれない。

なので、lintがshellとかで使えるのが前提で、各種lintの設定は必要に応じて別途行い、 emacsの方では、lintの起動と結果受け取りが設定されてるみたい。 以前、pathが反映されてなくて動かないことがあった。

対応している言語は多く、どの言語にどのlintを使うかは、 Supported Languages に説明されている。

私の場合は、python, markdown, rest, textに対応できれば良いが、 一応、色々インストしてみている。shell, perl, html, cssとか。 使うかどうかは別の話。

あと日本語の文法チェックをtextlintに設定してみた。 チェック時間が多めだし煩いので、普段はproselint(文法ではないらしい)、 たまにtextlintを使う。で、いつも沢山しかられる。

まず、flycheck。

   (use-package flycheck :ensure t
   :init (global-flycheck-mode)
   :config
    (setq
      flycheck-display-errors-delay 1
      flycheck-highlighting-mode 'lines  ;; columns symbolsm sexps lines
      flycheck-check-syntax-automatically '(save)
       ;; events that may trigger syntax checks.
       ;; save, idle-change, idle-buffer-switch, new-line, mode-enabled
      ;;flycheck-disabled-checkers '(c/c++-clang c/c++-gcc)
       ;; Syntax checkers excluded from automatic selection.
    )
    (set-face-attribute 'flycheck-error nil :underline '(:color "red3" :style wave))
    (set-face-attribute 'flycheck-warning nil :underline '(:color "orange2" :style wave))

    ;; mode hook を自分用にセットする。
    ;; 例えば、201902デフォは、proselintが以下で、rst-modeは含まれていない。
    ;;   :modes (text-mode markdown-mode gfm-mode message-mode org-mode)
    ;; 追加した。
    (flycheck-add-mode 'proselint 'rst-mode)

    ;; defaultのtextlintがrst-modeで動かなかったので、以下にしてみた。こぴぺ。
    ;; rst-modeで挙動が少しおかしい。
    (flycheck-define-checker textlint
     "A linter for textlint."
     :command ("/home/hogehoge/.yarn/bin/textlint" "--format" "unix"
                ;; "--rule" "no-mix-dearu-desumasu" "--rule" "max-ten" "--rule" "spellcheck-tech-word"
                source-inplace)
     :error-patterns
     ((warning line-start (file-name) ":" line ":" column ": "
        (id (one-or-more (not (any " "))))
      (message (one-or-more not-newline)
               (zero-or-more "\n" (any " ") (one-or-more not-newline)))
     line-end))
     :modes (text-mode markdown-mode gfm-mode message-mode adoc-mode mhtml-mode latex-mode org-mode rst-mode))
    (add-to-list 'flycheck-checkers 'textlint)

   ;; for python  私の環境ではflake8がうまく動かなかったので、pyflakeのみ。
   ;;   一部、設定ファイルが見付けられないので、指定(mypy使ってない)。
    (add-hook 'python-mode-hook
      (lambda ()
        (setq flycheck-disabled-checkers '(python-flake8))
        (setq flycheck-pylintrc "/home/hogehoge/.config/pylintrc")
        (setq flycheck-python-mypy-ini "/home/hogehoge/.mypy.ini")
      ))

      ; Multiple syntax checker for Python in Emacs, using Flycheck
      ;(use-package flycheck-pycheckers :ensure t
      ;   :config
      ;   (add-hook 'flycheck-mode-hook 'flycheck-pycheckers-setup)
      ;)

   ;; plantuml デフォで入ってないやつを、追加で入れる。
   (use-package flycheck-plantuml :ensure t
     :config
     (flycheck-plantuml-setup))
   )

textlintを日本語対応にするための設定は、以下を参考にさせていただいた。

現在、 ~/.textlintrc は以下になっている。 必要なmoduleをインストして設定を記述するのは結構面倒だった。 正しいかどうかは不明。いちおう動いているというレベル。

   {
    "plugins": {
      "rst": {
        "extensions": [
          ".rst"
         ]
       },
       "@textlint/markdown": {
         "extensions": [".mkd", "markdown"]
       }
    },
    "filters": {
        "comments": true,
        "whitelist": {
          "allow": [
             "ignored-word",
             "/{{[a-zA-Z.]*?}}/"
          ]}
    },
    "rules": {
      // 技術文書向けの textlint ルールプリセット
      "preset-ja-technical-writing": {
        // 1文の長さ
        "sentence-length": {
          max: 90
        },
        // 1文中のカンマ
        "max-comma": {
          max: 3
        },
        // 1文中の読点
        "max-ten": {
          max: 3
        },
        // 連続できる最大の漢字長 : 固有名詞は allow オプションに記述して回避できる
        "max-kanji-continuous-len": {
          max: 7
        },
        // 「ですます調」、「である調」を統一する
        "no-mix-dearu-desumasu": {
          // 見出しは自動
          "preferInHeader": "",
          // 本文はですます調
          "preferInBody": "ですます",
          // 箇条書きはである調
          "preferInList": "である",
          // 文末以外のチェックをしない
          "strict": false
        },
        // 文末の句点記号に「。」を使う
        "ja-no-mixed-period": false,
          // 二重否定は使用しない
          "no-double-negative-ja": true,
          // ら抜き言葉を使用しない
          "no-dropping-the-ra": true,
          // 逆接の接続助詞「が」を連続して使用しない
          "no-doubled-conjunctive-particle-ga": true,
          // 同じ接続詞を連続して使用しない
          "no-doubled-conjunction": true,
          // 同じ助詞を連続して使用しない
        "no-doubled-joshi": {
          // 助詞のtoken同士の距離が2以下ならエラー
          "min_interval" : 2,
          // 例外を許可するかどうか
          "strict": true,
          // 助詞のうち「も」「や」は複数回の出現を許す
          "allow": ["も","や"],
          // 文区切り文字の配列
          "separatorChars":
          ["。","?","!","?","!"]
        },
        // UTF8-MAC 濁点を使用しない
        "no-nfd": false,
        // 感嘆符「!!??」を使用を禁止する
        "no-exclamation-question-mark": false,
        // 半角カナを使用しない
        "no-hankaku-kana": true,
        // 弱い日本語表現の利用を使用しない
        "ja-no-weak-phrase": true,
        // 同一の単語を間違えて連続しているのをチェックする
        "ja-no-successive-word": true,
        // よくある日本語の誤用をチェックする
        "ja-no-abusage": true
      },
      // 日本語周りにおけるスペースの有無を決定する textlint ルールプリセット
      "preset-ja-spacing": {
        // カタカナ語間は中黒または半角スペースを用いて区切る
        "ja-nakaguro-or-halfwidth-space-between-katakana": true,
        // かっこの外側、内側ともにスペースを入れない
        "ja-no-space-around-parentheses": true,
        // 全角文字どうしの間にスペースを入れない
        "ja-no-space-between-full-width": true,
        // 半角文字と全角文字の間にスペースを入れるかどうか
        "ja-space-between-half-and-full-width": {
          "space": "never"
        },
        // 文末に感嘆符を使用し、後に別の文が続く場合は、直後に全角スペースを挿入する
        "ja-space-after-exclamation": false,
        // 文末に疑問符を使用し、後に別の文が続く場合は、直後に全角スペースを挿入する
        "ja-space-after-question": true,
        // インラインコードの前後が日本語である場合に半角スペースを入れるか
        "ja-space-around-code": {
             "before": false,
             "after": false
        }
        // "ja-space-around-code": false
      },
      // サ抜き、サ入れ表現の誤用
      "@textlint-ja/textlint-rule-no-insert-dropping-sa": true,
      // 漢字よりもひらがなで表記したほうが読みやすい副詞
      "ja-hiragana-fukushi": true,
      // 漢字よりもひらがなで表記したほうが読みやすい補助動詞を指摘する
      "ja-hiragana-hojodoushi": true,
      // 冗長な表現を禁止する
      "ja-no-redundant-expression": true,
      // 不自然なアルファベットを検知する
      "ja-unnatural-alphabet": true,
      // 常用漢字を使っているか
      //"joyo-kanji": true,
      // 連用中止法を検知する
      "no-renyo-chushi": true,
      // 全角文字と半角英字の間に半角スペース、ただし次の全角文字 [、。「 」(){}【】『』] の前後には不要
      // "one-white-space-between-zenkaku-and-hankaku-eiji": true
    }
   }
今回の見直しはこれでおわり。少しは使い易くなればと思う。

0 件のコメント:

コメントを投稿

麻のボディタオル

2018年の秋(まだ、自転車を封印してない)、 近江上布伝統産業会館 で、興味からボディタオルを購入した。 お、よかった。: 自然派パン工房 ふるさとの道 ほぼ毎日風呂で使ってきて、ついに寿命がきたようだ。 お店の方に、「糸が痩せて破れてくる」まで使える、と...