1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VSCode で不要な空白文字や空白行を削除する

Posted at

VSCode で不要な空白文字や空白行を削除する

行末の空白文字やファイルの末に複数ある空白行は不要なものとして削除しておきたい。これを自動的に実行したい。

■ VSCode デフォルトによる構成

デフォルトでは、次の 3 つの設定がある。これらは保存時に実行される。

設定
(デフォルト値)
説明
files.insertFinalNewline 真偽値 (false) ファイルの最終行に空白行を挿入する
files.trimFinalNewlines 真偽値 (false) ファイルの最終の空白行を削除する
files.trimTrailingWhitespace 真偽値 (false) 各行末の半角スペースを削除する

ちなみに、files.insertFinalNewlinefiles.trimFinalNewlines がともに true の場合、ファイルの最終行に空白行が 1 行だけ挿入される。

■ 行末の空白文字を削除する

files.trimTrailingWhitespace では半角スペースのみしか対応していない。これをすべての空白文字に関して対応させたい。

^([\S]*)\s+$

ECMAScript では、\s[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] を指している。そのため、\s だけで全角スペースなども含まれている。

これを $1 に置換する。Perl ライクに表現すると次のようなものになる。

s/^([\S]*)\s+$/$1/gm

これをキーバインドとして設定するならば、次のようにすると良いだろう。ただし、このキーバインドは検索・置換ウィジェットを表示させるに留まる。これの後に、Ctrl+Alt+Enter を押下することで全置換することが出来る。

{
  "key": "",
  "command": "editor.actions.findWithArgs",
  "args": {
    "searchString": "^([\\S]*)\\s+$",
    "replaceString": "$1",
    "isCaseSensitive": false,
    "matchWholeWord": false,
    "isRegex": true,
    "preserveCase": false,
    "findInSelection": false,
  },
  "when": "editorTextFocus && !editorReadonly"
}

▽ Markdown の強制改行は無視したい

Markdown における強制改行は半角スペース 2 つで表現される。これだけは残すようにしてみたい。

この場合は、次のように正規表現を与えてみると良いだろう。

^(\s+|([\S]+)(\s|\s{3,}))$

■ 連続した空白行を置換で削除する

ここでの空白行とは「文字が何もない行および空白文字のみの行」を指すこととする。

連続した空白行を削除したい場合には、次のような正規表現を用いて置換すると良いだろう。置換先は何もなしで良い。

^\s*$\n^\s*$

テストすると次のようになる。

Perl ライクに表現すると次のようなものになる。

s/^\s*$\n^\s*$//gm

これをキーバインドとして設定するならば、次のようにすると良いだろう。ただし、このキーバインドは検索・置換ウィジェットを表示させるに留まる。これの後に、Ctrl+Alt+Enter を押下することで全置換することが出来る。

{
  "key": "",
  "command": "editor.actions.findWithArgs",
  "args": {
    "searchString": "^\\s*$\\n^\\s*$",
    "replaceString": "",
    "isCaseSensitive": false,
    "matchWholeWord": false,
    "isRegex": true,
    "preserveCase": false,
    "findInSelection": false,
  },
  "when": "editorTextFocus && !editorReadonly"
}

この置換では、以下のような連続していない空白文字のみの行は無視している。

hello = "Hello World"
   
print(hello)

余談

デフォルトの構成に加えて、ユーザによる置換も提案してみた。正規表現は好きなように変更すると良いだろう。

multi-command を利用すると、editor.actions.findWithArgs によるシーケンスを上手く構成することが出来る。興味があれば試してみても良いだろう。

例えば、以下のような感じ。

// settings.json
  "multiCommand.commands": [
    {
      "command": "multiCommand.remove.consecutiveBlankLines",
      "sequence": [
        {
          "command": "editor.actions.findWithArgs",
          "args": {
            "searchString": "^\\s*$\\n^\\s*$",
            "replaceString": "",
            "isRegex": true
          }
        },
        "editor.action.replaceAll",
        "closeFindWidget"
      ],
      "description": "Remove consecutive blank lines"
    }
  ]
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?