pythonでのcomment-dwim挙動変更

pythonでプログラムを書く際、Emacs+ Patchedに含まれているcomment-dwimという機能のお世話になっている。この機能を使うことでIntelliJのIntention ActionのようにIDEが空気を読んで適切なコメントアウト処理をしてくれるようになる。たとえば、以下のような処理を同じキー操作で行なうことができる。

  • 行に何も書かれていなければ、' # 'を挿入してコメント記載の準備をする
  • プログラムが書いてある行では、末尾に' # 'を挿入してコメント記載の準備をする
  • 既にコメントが記載されている行では、コメント文の先頭までカーソルを移動させる
  • 範囲選択中であれば、選択行をまとめてコメントアウトする

ただ、pythonでプログラムを書いている時はcomment-dwimで挿入されるコメントが' # '(空白 + # + 空白 + 空白)になってしまい、内蔵のPEP8チェッカから「コードとコメントの間は少なくとも2スペース以上空けましょう」とか「1行コメントは '# 'で始めましょう」という注意を受けていた。

せっかくEmacs+ Patchedを自分でビルドできるようになったので、試しに修正してみた。 CommentHandler.javaのMultiCaretCodeinsightActionHandlerを以下のように変更する。

// 変更前
protected String getEmptyLineComment() {
    return ' ' + myLineC + ' ';
}

// 変更後
protected String getEmptyLineComment() {
  if (myLineC.equals("# ")) {
    myLineC = " #";
  }
  return ' ' + myLineC + ' ';
}

pythonプログラムを編集している間は、myLineCの値が'# '(# + 空白)になっている。このため、getEmptyLineComment()は' # '(空白 + # + 空白 + 空白)を返すようなっていた。これを逆の' #'にすることで、最終的に返ってくる文字列が' # '(空白 + 空白 + # + 空白)になるようにした。

python以外の#をコメント行に使うプログラミング言語が混在してきた場合の影響は不明だが、CLionでc++pythonのプログラムを書く分には意図した通りに動作している。