Emacsのメモとか気になったことをメモしておく。

インデントスタイル

  • "c-set-style" で使えるスタイル
“gnu”The default style for GNU projects
“k&r”What Kernighan and Ritchie, the authors of C used in their book
“bsd”What BSD developers use, aka “Allman style” after Eric Allman.
“whitesmith”Popularized by the examples that came with Whitesmiths C, an early commercial C compiler.
“stroustrup”What Stroustrup, the author of C++ used in his book
“ellemtel”Popular C++ coding standards as defined by "Programming in C++, Rules and Recommendations," Erik Nyquist and Mats Henricson, Ellemtel
“linux”What the Linux developers use for kernel development
“python”What Python developers use for extension modules
“java”The default style for java-mode (see below)
“user”When you want to define your own style
gnuk&rbsdwhitesmithstroustrupellemtellinuxpythonjavacc-mode
基本インデント量25TAB(8)1434844
  • 使い方
(add-hook 'c-mode-hook
          (lambda () (c-set-style "stroustrup")))

EmacsのC++インデント設定
IndentingC -EmacsWiki-
CC-Mode Manual
  • 関連
en:Indent_style -Wikipedia-

インデントの設定例

インデント幅4、タブ幅4、インデントはスペースでやって貰う場合の設定
setq-defaultならデフォルトのインデントの設定をすることができるので、
一番最初に使うのが吉。この設定をやった後にC/C++やらのそれぞれの
モードのフックを設定するのがイイ。

(setq-default c-basic-offset 4     ;;基本インデント量4
              tab-width 4          ;;タブ幅4
              indent-tabs-mode nil)  ;;インデントをタブでするかスペースでするか


それぞれのモードのフックを設定する。設定を関数として定義しておけば関数を定義
し直すだけで設定の変更ができるので、設定を変更したりする場面が多ければ、
lambdaを使うより関数にしたほうがイイ。

;; モードごとの設定の仕方
;; モードごとの設定関数を宣言しておけば、関数の中身を書き換えるだけで
;; フック(ファイルを開いた時に実行する処理)の書き換えが簡単にできる。
;; C++
(defun my-c++-mode-conf ()
  (c-set-style "ellemtel")     ;;インデントスタイルをellemtaelにする
  (show-paren-mode t))        ;;カッコを強調表示する

;; フックを設定する
(add-hook 'c++-mode-hook 'my-c++-mode-conf)

;; 自分のおすすめ設定
(defun my-c-mode-common-conf ()
  ;; (electric-mode + 自動インデント + 欲張り削除) ";"を押すと現在の行を
  ;; 再インデントして自動的に改行をするモードのなる設定。これは強力すぎて扱いづらい。
  ;; (c-toggle-auto-hungry-state 1)
  
  ;; (electric-mode) ";"や"{"などをを入力した場合現在の行を自動インデントを有功にする
  ;; (c-toggle-electric-state 1)
  
  ;; (欲張り削除 + electric-mode)バックスペースなどの削除するキーを押すと
  ;; スペースを一気に消す欲張り削除機能とelecetic-modeをを有功にする
  (c-toggle-hungry-state 1)

  ;; この関数は廃れた機能 (obsoleteされた)ものなので、emacsのバージョンが22.1以上なら使わないこと
  ;; (c-toggle-auto-state 1) obsoleted 

  ;; (自動インデント) 改行をしたら次の行を自動でインデントしてくれる
  ;; (c-toggle-auto-newline 1)

  ;; C-m を newline-and-indentに設定する
  ;; しかしこれをするとEnterのキーマップまで影響するので
  ;; 大人しくC-jを使ったnewline-and-indentを使うほうが
  ;; (define-key c-mode-base-map ""\C-m" 'newline-and-indent)

  (c-set-style "stroustrup")                  ;; スタイルはストラウストラップ
  (flyspell-prog-mode)                        ;; flyspell-prog-mode(自動ispell機能)
  (show-paren-mode t)                         ;; カッコを強調表示する

  ;; 他のエディタなどがファイルを書き換えたらすぐにそれを反映する
  ;; auto-revert-modeを有効にする
  (auto-revert-mode)
  )

;; C言語系のモード全てに適用されるフック
;; c-mode-common-hookにフックを設定する
(add-hook 'c-mode-common-hook 'my-c-mode-common-conf)


Electric C Characters
Hungry Delete Feature in C
41.1.1.1 C , C++ , JAVA のモードのフック -Meadow/Emacs memo-
16.3 タブ幅の設定 -Meadow/Emacs memo-
EmacsのC++インデント設定
IndentingC -EmacsWiki-

スタイルの作り方

(setq-default c-indent-tabs-mode t     ; Pressing TAB should cause indentation
              c-indent-level 4         ; A TAB is equivilent to four spaces
              c-argdecl-indent 0       ; Do not indent argument decl's extra
              c-tab-always-indent t
              backward-delete-function nil) ; DO NOT expand tabs when deleting

;; If a statement continues on the next line, indent the continuation by 4
(c-add-style "my-c-style" '((c-continued-statement-offset 4)))
(defun my-c-mode-style ()
  (c-set-style "my-c-style")
  (c-set-offset 'substatement-open '0) ; brackets should be at same indentation level as the statements they open
  (c-set-offset 'inline-open '+)
  (c-set-offset 'block-open '+)
  (c-set-offset 'brace-list-open '+)   ; all "opens" should be indented by the c-indent-level
  (c-set-offset 'case-label '+))       ; indent case labels by c-indent-level, too

(add-hook 'c-mode-hook 'my-c-mode-style)
(add-hook 'c++-mode-hook 'my-c-mode-style)
c-indent-levelブロック内のCの文の字下げを指定します.周囲のブロックの字下げとは開き中 かっこのある行の字下げをいいます.
c-continued-statement-offsetif文のthen節やwhile文の本体のように,文の中で始まる文に加える字下げの数 を指定します.
c-brace-offset開き中かっこで始まる行に加える字下げの数を指定します.
c-brace-imaginary-offset他のテキストの後ろにある開き中かっこが,この行の先頭からどれだけ右にある と考えるかを指定します.
c-argdecl-indentCの関数の引数宣言の字下げを指定します.
c-label-offsetラベルやcase,defaultのある文に加える字下げの数を指定します.

インデント操作

(setq c-auto-newline t)   ; 全自動インデントを有効
(setq c-auto-newline nil) ; 全自動インデントを無効

;;半自動インデントを指定する変数はc-tab-always-indentです。
(setq c-tab-always-indent t)   ; [TAB]キーでインデント実施
(setq c-tab-always-indent nil) ; [TAB] キーで、TABコードを入力

メモ


(defun my-c-mode-conf ()
  (setq c-hanging-braces-alist
		'((brace-list-open (after before ))
		  (substatement-open after)
		  (block-close . c-snug-do-while)))
  (setq c-indent-level 2
		c-argdecl-indent 0
		c-label-offset -4
		c-continued-statement-indent 0
		c-brace-offset 0
		tab-width 4
		comment-column 40
		c-auto-newline t)
  (make-variable-buffer-local 'dabbrev-case-fold-search)
  (setq dabbrev-case-fold-search nil)
  (make-variable-buffer-local 'dabbrev-case-replace)
  (setq dabbrev-case-replace nil)
  )

(add-hook c-mode-hook  'my-c-mode-conf)

構文シンボル

string複数行におよぶ文字列の内側。
c複数行におよぶCスタイルのブロックコメントの内側。
defun-open関数定義を開始する中括弧。
defun-close関数定義を終了する中括弧。
defun-block-introトップレベルの関数定義の最初の行。
class-openクラス定義を開始する中括弧。
class-closeクラス定義を終了する中括弧。
inline-openクラス内のインラインメソッドを開始する中括弧。
inline-closeクラス内のインラインメソッドを終了する中括弧。
extern-lang-open外部言語ブロックを開始する中括弧。
extern-lang-close外部言語ブロックを終了する中括弧。
func-decl-cont関数定義の引数リストと関数定義の本体を開始する中括弧のあいだの領域。 ただし、K&R版の関数定義を除く。 Cでは、この部分に空文字やコメント以外は置けない。 C++やJavaでは、throws宣言などを置ける。
knr-argdecl-introK&R版Cの引数宣言の最初の行。
knr-argdeclK&R版Cの引数宣言の2行目以降。
topmost-intro最上位の言語構成要素の最初の行。
topmost-intro-cont最上位の言語構成要素の2行目以降。
member-init-intro(構造体の)メンバ初期化リストの最初の行。
member-init-cont(構造体の)メンバ初期化リストの2行目以降。
inher-intro多重継承リストの最初。
inher-cont多重継承リストの2行目以降。
block-open文ブロックを開始する中括弧。
block-close文ブロックを終了する中括弧。
brace-list-openenumのリストや静的配列の初期化リストを開始する中括弧。
brace-list-closeenumのリストや静的配列の初期化リストを終了する中括弧。
brace-list-introenumのリストや静的配列の初期化リストの最初の行。
brace-list-entryenumのリストや静的配列の初期化リストの2行目以降。
brace-entry-open行が開き中括弧で始まるときの、 enumのリストや静的配列の初期化リストの2行目以降。
statement通常の文。
statement-cont文の継続行。
statement-block-intro新規文ブロックの最初の行。
statement-case-introcaseブロックの最初の行。
statement-case-open中括弧で始まるcaseブロックの最初の行。
inexpr-statement式の内側にある文ブロック。 これは、C言語のGNU拡張や、 文ブロックを引数としてとるPikeの特殊関数に用いる。
inexpr-class式の内側にあるクラス定義。 これは、Javaの無名クラスや無名配列の初期化式に用いる。
substatementif、while、for、 do、elseの直後の最初の行
substatement-opensubstatementのブロックを開始する中括弧。
case-labelcaseまたはdefaultラベルを表す。
access-labelC++のアクセス指定子private、protected、publicを表す。
label通常のラベル。
do-while-closuredo-while文のwhile。
else-clauseif-else文のelse。
catch-clauseC++やJavaのtry...catch構成の catch行やfinally行。
comment-introコメントの導入部分だけを含んだ行。
arglist-intro引数リストの最初の行。
arglist-cont引数リストを開始する括弧の行に引数がない場合、 引数リストの2行目以降。
arglist-cont-nonempty引数リストを開始する括弧の行に少なくとも1つの引数がある場合、 引数リストの2行目以降。
arglist-close引数リストを終了する括弧。
stream-opストリーム演算子を用いた式が継続する行。
inclassクラス定義の内側に入れ子になった言語構成要素。 字下げは、クラス定義の開き中括弧に相対である。
inextern-lang外部言語ブロックの内側に入れ子になった言語構成要素。
inexpr-statement式の内側の文ブロックの最初の行。 これは、構文({ ... })を使うCに対するGCC拡張に用いる。 文ブロックを引数としてとるPikeの特殊関数にも用いる。
inexpr-class式の内側のクラス定義の最初の行。 これは、Javaの無名クラスや無名配列の初期化式に用いる。
cpp-macrocppマクロの開始。
friendC++のfriend宣言。
objc-method-introObjective-Cのメソッド定義の最初の行。
objc-method-args-contObjective-Cのメソッド定義を継続する行。
objc-method-call-contObjective-Cのメソッド呼び出しを継続する行。
inlambdainclassと同様だが、ラムダ(つまり、無名)関数の内側に用いる。 Pikeのみで用いる。
lambda-intro-contキーワードlambdaと関数本体のあいだの、 ラムダ関数のヘッダーの継続行。 Pikeのみで用いる。
  • とてもわかりやすく構文シンボルの説明をしてくれているサイト
EmacsにおけるC++ source codeの細かいindent設定方法 (1)
EmacsにおけるC++ source codeの細かいindent設定方法 (2)

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

フリーエリア




編集にはIDが必要です