なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

Emacsのインデントやコードスタイルをeditorconfigで定義する

いまさらeditorconfig

Emacsでeditorconfigを使いたい

やりたいこと

  • C++のコードに対して
    • インデントをスペース×4
    • タブ使わない
    • 行の最後にある空白除去(trailing whitespace)

editorconfig導入

以下のサイトを参考にさせてもらった
EditorConfig を Emacs から使う - 雑文発散(2014-01-04)

$ sudo apt-get install editorconfig

なんかexec-path-from-shellがうまく動かないので使っていない。

;; editorconfig
(unless (package-installed-p 'editorconfig)
  (package-refresh-contents) (package-install 'editorconfig))
(editorconfig-mode 1)
(setq edconf-exec-path "/usr/bin/editorconfig")
  • .editorconfig
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# Matches multiple files with brace expansion notation
# Set default charset
[*.{cpp,hpp,h}]
charset = utf-8
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

これで、Emacsの設定が空でもやりたいことは実現できた。

Emacsのインデントが気に入らない件

今更だがc++-modeのそのままのスタイルが気に入らない。

    // こうなってほしいのに
    Func(
        a,
        a
    );

    // こうなる
    Func(
            a,
            a
            );
  • いろいろ調べてelispの設定を変えた
    • arglist-intro が引数リストの最初のインデント設定、+はデフォルトのoffset値
    • arglist-close が引数リストの最後のインデント設定、これにはcc-modeで用意されている関数が適用できる

c-set-offset関数の第2引数には、offset値を指定することができます。offset値とは、次のindentの深さが現在のindentの深さからどれだけ離れているかを示す値です。整数、特殊symbol(+、-、++、--、*、/)等を指定することができます。
EmacsにおけるC++ source codeの細かいindent設定方法 (1) - I.S.の日記

	     ;; c++-mode-hookでコードスタイル変更
	     (c-set-offset 'arglist-intro '+)
	     (c-set-offset 'arglist-close 'c-lineup-close-paren)

この関数や中括弧のインデント設定はEmacsのcc-modeで全て名前がついている。
CC Mode Manual

これを読むのは苦しいので有志の方の書き下しを参考にさせていただいた。