web-dev-qa-db-ja.com

Emacs C ++モードのインデントが正しくありませんか?

Emacs 23をc ++モードで実行していますが、インデントの問題があります。私がこのコードを持っているとしましょう:

void foo()
{
   if (cond)
     { <---
        int i;
        ...
     } <---
}

これは自動インデントのデフォルトの動作のようです。ただし、変更したいので、次のようにします。

void foo()
{
   if (cond)
   {
      int i;
      ...
   }
}

C++モードまたは私の.emacsファイルを構成することでこれを簡単に行う方法はありますか?

35
Idan K

私の.emacsファイルには次のものが含まれています。

(defun my-c++-mode-hook ()
  (setq c-basic-offset 4)
  (c-set-offset 'substatement-open 0))
(add-hook 'c++-mode-hook 'my-c++-mode-hook)

任意の行で[ctrl-c ctrl-s]を押すと、編集するオフセットを決定できます。 ifの後に中括弧が付いた最初の行では、substatement-open

41
Alex B

これは私のものです...これはビジュアルスタジオのデフォルトのセットアップと一致します。

(defun my-c-mode-common-hook ()
 ;; my customizations for all of c-mode, c++-mode, objc-mode, Java-mode
 (c-set-offset 'substatement-open 0)
 ;; other customizations can go here

 (setq c++-tab-always-indent t)
 (setq c-basic-offset 4)                  ;; Default is 2
 (setq c-indent-level 4)                  ;; Default is 2

 (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60))
 (setq tab-width 4)
 (setq indent-tabs-mode t)  ; use spaces only if nil
 )

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
22
justinhj

短い答え:この行を.emacsファイルに入れます。

(c-set-offset 'substatement-open 0)

長い答え:...

Emacs-LISPを初めて使う人のために、 http://www.cs.cmu.edu/ にかなり単純なメソッドがあります。

  • インデントしたい行に移動します

  • C-C C-Oと入力します(ゼロではなく文字「O」です)。

  • Enterを押してデフォルトの提案を受け入れます

  • 余分なインデントがない場合は「0」(ゼロ)を入力し、Enterを押します

  • Tabと入力して、行を再度インデントします。

  • この状況での将来の「{」は、emacsを再起動するまで、正しいタブ設定になります。

この方法の良い点は、変更したいLISPコードを実際に参照できることです。あなたはあなたの.emacsファイルに入れることができます:

(c-set-offset 'SYNTACTIC-SYMBOL OFFSET)

さらに、プログラム AStyle をチェックアウトして、emacs外のC++ソースを自動的にフォーマットすることもできます。

9
Colin

受け入れられた答えは実際には間違っています。 Emacswikiは役に立ちません。

以下のコードを〜/ .emacsに挿入します。

(defun fix-c-indent-offset-according-to-syntax-context (key val)
  ;; remove the old element
  (setq c-offsets-alist (delq (assoc key c-offsets-alist) c-offsets-alist))
  ;; new value
  (add-to-list 'c-offsets-alist '(key . val)))

(add-hook 'c-mode-common-hook
          (lambda ()
            (when (derived-mode-p 'c-mode 'c++-mode 'Java-mode)
              ;; indent
              (fix-c-indent-offset-according-to-syntax-context 'substatement-open 0))
            ))

技術的な詳細については http://blog.binchen.org/posts/ccjava-code-indentation-in-emacs.html を参照してください。

重要な問題はc-set-offsetが信頼できないで、構文コンテキストを検出できなくなりました(Emacs24.3.1)。したがって、信頼できる唯一の方法は、元のemacsコードを分析することです。コードをハックする詳細な手順は私の記事に記載されています。基本的に、/ usr/share/emacs/24.3/LISPで定義されている関数c-indent-lineを読む必要があります/progmodes/cc-cmds.el

一部の人々は私のセットアップが機能しないと不平を言いました。実際には、デフォルトの設定を変更しない限り、Emacsのすべてのstableバージョン(23.4、24.3、24.4)で機能します(インデントには異なるプロファイルがあり、私の設定はデフォルトのプロファイルに基づいています) )。

私の重要な点は、この特定の問題については、コードを読む必要があるということです。

3
chen bin

個々のオフセットを調整する前に、望ましいスタイルを構成します。私はstroustrupを使用しています。他の人も試してみてください。名前については http://www.emacswiki.org/emacs/IndentingC#toc1 を参照してください http://en.wikipedia.org/ wiki/Indent_style#Variant:_Stroustrup

M-xカスタマイズ変数c-default-style(およびC++ _

1
Mekk