書綴日記

小説書いたり、徒然

VSCodeを小説用にカスタマイズ

目次

はじめに

ネタのメモを以前は普通にtxtで作成していたのだけれど、VSCodeを使うのであれば目次などがハイライトされるのでMarkdownで書いたほうが楽だなと思いいたり、md形式で書くようにした。
で、地道にその形式でやっていってもいいとは思うのだけれど、便利なプラグがあったので色々とインストールすることにした。

VSCodeの小説用環境構築

前提

以下がインストール済み

名称 バージョン
VSCode 1.78.2
Node v18.12.1
npm 8.19.2

やりたいこと

  1. Markdown形式の文章をもっと簡単に書きたい
  2. textlintを入れて校正できるようにしたい
  3. その他

1. Markdown形式の文章をもっと簡単に書きたい

次のプラグインをインストール

  • markdownlint
    • Markdown形式かの校正をしてエラーを出すやつ
  • Markdown Preview Enhanced
    • 画面分割をしてプレビューが見れる
  • Markdown Shortcuts
    • 入力補助をしてくれるやつ
  • Markdown All in One
    • ショートカットとか使いやすいらしい。まだ活用できていない。
  • Table Formatter
    • テーブルを見やすくするやつ
  • Auto Markdown TOC
    • 自動で目次を作ってくれるやつ

注意

自動整形は次の設定をしておかないといけない。

  • editor.formatOnSave
    • オン

また、markdownlintの不要なエラーは外した。
(以下、自分用なので雑)

    "markdownlint.config": {
        "MD022": false,
        "MD025": false,
        "MD032": false,
        "MD041": false,
        "line-length": false, // MD013: 1文の最大文字数をはtextlintと競合するため無効化
        "no-duplicate-heading": false, // MD024: 見出し文字列の重複を許容
        "no-trailing-punctuation": false, // MD026: 見出しに.,;:が入ることを許容
        "no-inline-html": false, // MD033: HTML記述を許容
        "no-bare-urls": false // MD034: URLそのままの表記を許容
    },

2. textlintを入れて校正できるようにしたい

上に書いたように、Nodeやnpmが入っていないと使えない

  1. 適当なディレクトリに以下をダウンロード(以降ダウンロードディレクトリをTEXTLINT_HOMEと呼ぶ)

    • https://github.com/ttrace/textlint-settings-for-fiction
      • 作家の方が使用しているtextlintの設定をまるっとまとめたやつ
  2. PowerShellを起動

  3. 次のコマンドを実行

    1. デフォルトをインストール
      • cd %TEXTLINT_HOME%
      • npm install
    2. 他、欲しい物をインストール
      • 技術書用語
        • npm install textlint-rule-spellcheck-tech-word
      • 技術書用語2
  4. 設定ファイルの編集

    1. prh-my-rule.ymlの作成

      • dict直下に作成

      • 以下記述

        version: 1
        imports:
          - tech-rule/ja/kanji-open.yml
          - tech-rule/ja/typo.yml
          - tech-rule/javascript.yml
          - tech-rule/css.yml
          - tech-rule/software.yml
        ignoreRules:
        rules:
          # project configuration
          - expected: Almin
            patterns: /almin.js/i
          # 独自のもの
          - expected: VSCode
            pattern: /vs ?code(?!-textlint)/i
            specs:
              - from: vscode
                to: VSCode
              - from: vs code
                to: VSCode
              - from: VS Code
                to: VSCode
          - expected: Markdown
            pattern: /markdown(?!lint)/i
        
    2. .textlintrcの更新

      • 次のように更新

        {
           "rules": {
               "@textlint-ja/morpheme-match": {
                   "dictionaryPathList": [
                       "dict/morpheme-match-dict.js"
                   ]
               },
               "prh": {
                   "rulePaths": [
                       "dict/prh-rule.yml",
                       "dict/prh-local-rule.yml",
                       "dict/prh-my-rule.yml",
                       "node_modules/prh/prh-rules/media/techbooster.yml"
                   ]
               },
               "preset-jtf-style": {
                   "1.1.1.本文": false,
                   "1.1.3.箇条書き": false,
                   "2.1.8.算用数字": false,
                   "2.1.9.アルファベット": false,
                   "2.2.2.算用数字と漢数字の使い分け": false,
                   "3.1.1.全角文字と半角文字の間": false,
                   "3.3.かっこ類と隣接する文字の間のスペースの有無": false,
                   "4.1.1.句点(。)": false,
                   // "4.2.1.感嘆符(!)": false,
                   "4.2.9.ダッシュ(-)": false
               },
               "spellcheck-tech-word": true,
               "@textlint-ja/textlint-rule-no-synonyms": {
                   "allows": [
                       "ハロワ",
                       "ハローワーク",
                       "だし",
                       "出し",
                       "コロナ",
                       "コロナウイルス",
                       "ネット",
                       "ネットワーク",
                       "足",
                       "脚"
                   ]
               },
               "general-novel-style-ja": {
                   "chars_leading_paragraph": false,
                   "even_number_ellipsises": false,
                   "no_punctuation_at_closing_quote": false,
                   "max_arabic_numeral_digits": 4 // アラビア数字の桁数は2桁まで (false: チェックしない)
               }
           }
        }{
           "rules": {
               "@textlint-ja/morpheme-match": {
                   "dictionaryPathList": [
                       "dict/morpheme-match-dict.js"
                   ]
               },
               "prh": {
                   "rulePaths": [
                       "dict/prh-rule.yml",
                       "dict/prh-local-rule.yml",
                       "dict/prh-my-rule.yml",
                       "node_modules/prh/prh-rules/media/techbooster.yml"
                   ]
               },
               "preset-jtf-style": {
                   "1.1.1.本文": false,
                   "1.1.3.箇条書き": false,
                   "2.1.8.算用数字": false,
                   "2.1.9.アルファベット": false,
                   "2.2.2.算用数字と漢数字の使い分け": false,
                   "3.1.1.全角文字と半角文字の間": false,
                   "3.3.かっこ類と隣接する文字の間のスペースの有無": false,
                   "4.1.1.句点(。)": false,
                   // "4.2.1.感嘆符(!)": false,
                   "4.2.9.ダッシュ(-)": false
               },
               "spellcheck-tech-word": true,
               "@textlint-ja/textlint-rule-no-synonyms": {
                   "allows": [
                       "ハロワ",
                       "ハローワーク",
                       "だし",
                       "出し",
                       "コロナ",
                       "コロナウイルス",
                       "ネット",
                       "ネットワーク",
                       "足",
                       "脚"
                   ]
               },
               "general-novel-style-ja": {
                   "chars_leading_paragraph": false,
                   "even_number_ellipsises": false,
                   "no_punctuation_at_closing_quote": false,
                   "max_arabic_numeral_digits": 4 // アラビア数字の桁数は2桁まで (false: チェックしない)
               }
           }
        }
        
  5. 一部調整

  • %TEXTLINT_HOME%/node_modules/technical-word-rules/all.jsonを修正
    • 以下を削除
      • ,{"pattern":"(?:使うべきではない言葉なので修正してください|最強|常識的|最も優れた|知らない|知らなさそう|酷い)","expected":"使うべきではない言葉なので修正してください"}
        • 自動修正で「使うべきではない言葉なので修正してください」と上書きされてしまう
        • たぶんバグ
    • 以下を削除
      • ,{"pattern":"!?","expected":"!?"},{"pattern":"?!","expected":"?!"},{"pattern":"!!","expected":"!!"},{"pattern":"??","expected":"??"},{"pattern":"!?([^\\n\\s「」『』()[]])","expected":"!? $1"},{"pattern":"\\!\\?([^\\n\\s「」『』()[]])","expected":"!? $1"},{"pattern":"?!([^\\n\\s「」『』()[]])","expected":"?! $1"},{"pattern":"\\?\\!([^\\n\\s「」『』()[]])","expected":"?! $1"},{"pattern":"??([^\\n\\s「」『』()[]])","expected":"?? $1"},{"pattern":"\\?\\?([^\\n\\s「」『』()[]])","expected":"?? $1"},{"pattern":"!([^\\n\\s「」『』()[]])","expected":"! $1"},{"pattern":"?([^\\n\\s「」『』()[]★])","expected":"? $1"}
        • preset-jtf-styleと競合するので
  1. vscode-textlintのインストール
    • VSCodeに次のプラグインをインストール
      • vscode-textlint
    • 設定変更
      • 自分の環境に合わせて以下を設定
        • textlint.configPath
          • %TEXTLINT_HOME%/.textlintrc
        • textlint.nodePath
          • %TEXTLINT_HOME%

3. その他

VSCodeの設定

  • editor.wordSeparators
    • `~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?、。
    • 句点も区切り文字と認識されるようになる

novel-writerとvscode-textlintの共存について

次の記事でtextlintと共存できなくて諦めた、と書いたのだが、私の理解が間違っていて、novel-writerの機能を使いつつ、textlintの校正も同時に受ける、というのは無理なようだ。

じゃあどうやってどちらも使うかというのは、言語モードを変えることで対応できるみたい。

  • novel
    • ⇒novel-writer
  • txt

見たい感じ。
参考:Visual Studio Codeを翻訳用に使ってみた

今後について

その他にも以下が気になる。
メモ程度に単語を書いておく。

  • vale
  • prettier-code
  • Re:VIEW
  • prh -ProofReadingHelper
    • →これってすでに入っている?