linter-textlint
linter-textlint copied to clipboard
linterの「Lint As You Type」オプションを利用しているとエラーが出る
以下の環境で利用しています。
- Atom 1.10.2
- linter-textlint 2.0.0
- linter 1.11.16
-
Lint As You Type
オプション有効
-
- textlint 7.1.1
lint自体は正常に行われるのですが、ファイルを更新するたびにエラーダイアログが表示されます。 エラーメッセージは次の通りです。
Error: Column start (31) greater than line length (0)
at rangeFromLineNumber (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\atom-linter\lib\index.js:179:11)
at D:/PortableApplications/Atom/.atom/packages/linter-textlint/lib/index.js:116:20
at Array.map (native)
at D:/PortableApplications/Atom/.atom/packages/linter-textlint/lib/index.js:112:25
at tryCatcher (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\util.js:16:23)
at Promise._settlePromiseFromHandler (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:510:31)
at Promise._settlePromise (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:567:18)
at Promise._settlePromise0 (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:612:10)
at Promise._settlePromises (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:691:18)
at Promise._fulfill (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:636:18)
at PromiseArray._resolve (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise_array.js:125:19)
at PromiseArray._promiseFulfilled (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise_array.js:143:14)
at Promise._settlePromise (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:572:26)
at Promise._settlePromise0 (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:612:10)
at Promise._settlePromises (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:691:18)
at Async._drainQueue (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\async.js:138:16)
at Async._drainQueues (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\async.js:148:10)
at Async.drainQueues (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\async.js:17:14)
なお、保存されたファイルを初めて読み込んだ時にはエラーは出ず、そこから何か変更を加えるたびにエラーが出るという感じです。
また、linterの Lint As You Type
オプションを無効にするとエラーは出なくなります。
書き忘れていましたが、OSは Windows 7 Professional Service Pack 1 (64bit) です。
OS: OSX Yosemite 10.10.5と El Capitan Atom 1.10.2 でも同じ問題がおきてました。
うーん。macOS Sierra + Atom 1.10.2 ですが、再現できません…
エラーは常に出るわけではなく、出る時と出ない時があるようです。 この1か月使ってみて気付いたのですが、どうやらtextlintで警告が出た行を触るとlinter-textlintのエラーが出るみたいです。
というわけで試してみました。
環境は次の通りです。
- OS: Windows 7 Professional Service Pack 1 (64bit)
- Atom 1.10.2
- linter 1.11.18
-
Lint As You Type
オプション有効
-
- linter-textlint 2.0.0
- linter 1.11.18
- textlint 7.1.1
- textlint-rule-preset-japanese 1.3.3
テスト用に、次の3行のテキストを「test.txt」としてファイルに保存します。
この行にはtextlintによる警告は出ない。
この行にはtextlintにより警告が発せられる。この行に何かしようとするとエラーになるようだ。
この行にはtextlintによる警告は出ない。
このファイルを Atom で開くと、lintが行われ、次のような警告が出ます。
textlint Error preset-japanese/no-doubled-joshi 一文に二回以上利用されている助詞 "と" がみつかりました。at line 2 col 38
この状態から、テキストをいろいろ編集してみると、次のような結果になりました。
- 2行目「
しようとすると
」の2回目の「と
」よりも前、もしくは1行目の任意の桁にカーソルを置く- その位置で改行する ⇒ linter-textlintのエラーが出る
- その位置に「
あ
」という1文字を挿入する ⇒ linter-textlintのエラーは出ない - その位置の1文字を削除する ⇒ linter-textlintのエラーは出ない
- 2行目「
しようとすると
」の2回目の「と
」以後、もしくは3行目の任意の桁にカーソルを置く- その位置で改行する ⇒ linter-textlintのエラーは出ない
- その位置に「
あ
」という1文字を挿入する ⇒ linter-textlintのエラーは出ない - その位置の1文字を削除する ⇒ linter-textlintのエラーは出ない
本日 Atom 1.11.1 が出たので、
- OS: Windows 7 Professional Service Pack 1 (64bit)
- Atom 1.11.1
- linter 1.11.18
-
Lint As You Type
オプション有効
-
- linter-textlint 2.0.0
- linter 1.11.18
- textlint 7.1.1
- textlint-rule-preset-japanese 1.3.3
の環境でも上記を試してみましたが、やはり同様の結果でした。
https://github.com/azu/linter-atom-issue-27 で再現できました。
git clone https://github.com/azu/linter-atom-issue-27 issue
cd issue
npm i
atom .
で 2行目の先頭で backspace
を押すと例外が出る感じでした。
ルールによって不正なカラム位置が返されてるのかもしれないです。 (textlint自体はline, columnがはみ出ているかのチェックをしてないはずなので)
http://denpa-shinbun.com/entry/textlint-rule も同じ話っぽい。 ルールが異常値出したときにtextlint側で丸めるのか、Atom plugin側で丸めるのかというのはありそう。 (個人的には両方かなという感じはしてます)
ルールが異常値出したときにtextlint側で丸めるのか、Atom plugin側で丸めるのかというのはありそう。 (個人的には両方かなという感じはしてます)
両方が良いですね。linter-textlint 側も対処します...
ルールが異常値を出すのはあり得えますが、この場合Lint As You Typeじゃなくても起きるはずなんですよね。 なので、Linterのチェックも怪しい感じがしてきますね。 textlintは非同期で処理するので、チェック瞬間の行数とチェック後の行数は異なることはありそうなので、その辺補正されてないと存在しない行へのエラレポートになってしまいそう。