emacsの自動改行+インデントについて

このQ&Aのポイント
  • LinuxでC言語を勉強している方へ、emacsを使用して自動改行とインデントを行う方法について教えてください。
  • 現在、emacsを使用してC言語を学習中ですが、自動改行とインデントを設定しています。しかし、設定すると期待した結果にならず、改行とインデントの位置が気になっています。
  • emacsでC言語のプログラムを書いている際に、自動改行とインデントを設定する方法について教えてください。具体的な設定方法と、求める結果になるようにするための注意点も教えていただきたいです。
回答を見る
  • ベストアンサー

emacsの自動改行+インデントについて

linuxでC言語を勉強しています。 emacsをいろいろなサイトを参考にしていじっているのですが、 (add-hook 'c-mode-common-hook ____________'(lambda () _________________(c-toggle-auto-hungry-state 1) )) で自動改行+インデントをしています。 しかし、これだと for(i=0;i<10;i++) ___{ _______... ___} というふうになってしまいます。どうも私はそれが気に食いません。 できれば、 for(i=0;i<10;i++){ ____... } となってほしいのです。 ただし、";"、"{"、"}"を入力した後には改行+インデントしてほしいです。 一度、 (define-key c-mode-base-map ";" 'newline-and-indent) としてみたのですが、これだと、;が表示されずに改行、インデントされてしまい失敗でした。 elispについて詳しく知らないので教えてください。

  • moses
  • お礼率75% (75/100)

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ちょっと手元で実験してみましたが, 変数 c-hanging-braces-alist を適切に設定すればいいような気がします. 例えば (c-toggle-auto-hungry-state 1) の次の行に (setq c-hanging-braces-alist '((substatement-open after) (substatement-close before))) を入れ, c-hanging-braces-alist の値を ((substatement-open after) (substatement-close before)) にするとこの例の場合はうまくいきそうです. もちろん, 他の場合で必要であれば「(substatement-open after)」みたいなものをもっと並べていくことになります. この変数をいじるだけなら大きな問題にはならないはずなので, ヘルプを見ながらいろいろと変えてみてはどうでしょうか. この辺は大きくはスタイルに依存するので, 本当は新しいスタイルを作るべきなのかもしれません.

moses
質問者

お礼

ありがとうございます。 うまくいきました。

関連するQ&A

  • emacs lisp

    OS:ubuntu feisty fawn app:emacs-snapshot (emacs23) アンチエイリアスフォントのためにemacs23を使用しております。 実行したのは以下のとおり。 sudo apt-get install emacs-snapshot emacs-snapshot-el .emacs.el (autoload 'c++-mode "cc-mode" nil t) (add-hook 'c-mode-common-hook (lambda () (setq c-set-style "linux") c-basic-offset 4)) (setq auto-mode-alist (append '(("\\.cpp$" . c++-mode)auto-mode-alist)) cc-modeのバージョンは5.28です。 この設定を施したにもかかわらず、Syntax highlightが動いてくれません。(強調表示) どなたかご教授願えませんでしょうか? よろしくお願いします。

  • Ubuntu+Emacs+Anthyの起動キー?

    お世話になります。 Ubuntu 13.10で、Emacs23.4.1を使っています。 また、USキーボードを使っています。 日本語IMEとしてAnthyを使いたいのですが、Windowsで使い慣れたAlt+`(ALT+Grave)を使いたいと思いました。 Ubuntu自体のデフォルトのキーバインドはトップバーから「地域と言語の設定」で変更できました。 ただ、Emacsを使うときが問題です。 Ubuntuそのままの設定を生かすと、インラインには変更せず、びろーんと変換ボックスが垂れ下がって変換されるので、これをEmacs側の設定でなんとかしたいのです。 C-\(Ctrl+\)でAnthyを起動すると、いい感じにインライン変換でトグルすることは分かりました。 また、Emacsを起動するときに  $ XMODIFIERS=@im=none emacs とすると、Ubuntu側のAnthy起動が殺せることがわかりました。 あとはEmacs側でAlt+`でAnthyを起動させるだけです。  (define-key global-map "\C-o" 'toggle-input-method) のように.emacs.d/init.elに書くと、C-oにIMEの起動/終了をバインドできることが分かったのですが、これをAlt+`にする方法が分かりません。  (define-key global-map "\M-'" 'toggle-input-method)  (define-key global-map "\M-\'" 'toggle-input-method)  (define-key global-map "\M-~" 'toggle-input-method)  (define-key global-map "\M-\~" 'toggle-input-method) など、全部ダメでした。 これをどうすればいいのでしょうか。 簡単に言うと、Altキーを押しながら`(バッククォート)を押すイベントに、toggle-input-methodをバインドするにはどうすればいいでしょうか。 よろしくお願いします。

  • emacsのカスタマイズ

    emacsのカスタマイズで質問です。 cモードになったとき(できれば他の全てのモードでも)、フリーにタブを入力したいのですが、どのようにカスタマイズすれば良いのでしょう? いろいろ調べてみて、 (setq c-auto-newline nil) とか、 (setq c-tab-always-indent nil) としてもダメです。 ついでに、タブ幅を4にしたとき、 (setq-default tab-width 4) (setq-default tab-always-indent t) タブは4桁になるのですが、タブキーを押すと2タブ入ってしまいます。 どうしても、1タブキーで8桁進めたいようです。 これを1タブキーでタブ1つが入って、4桁であって欲しいのですが、どうすれば良いでしょう? よろしくお願いします。

  • プロのコーダーは、仕事の時長い文章を改行したり、イ

    プロのコーダーは、仕事の時長い文章を改行したり、インデントを入れたりする時すべてCSSでやるものなのでしょうか? それともbrや全角空白でやったほうが早いのでこちらで良いのでしょうか? 私は下記のようにCSSでやっているのですが、下記のようなやり方でもWEB制作会社で働く場合問題にならないでしょうか? p.indent,dd.indent,dt.indent { text-indent: 1em; margin-top: 0px; margin-bottom: 0px; } p.indentnewline,dd.indentnewline,dt.indentnewline { text-indent: 1em; margin-top: 0px; } dt.indentnewline { text-indent: 1em; margin-top: 0px; padding-bottom: 1em; } p.newline,dd.newline,dt.newline { margin-top: 0px; padding-bottom: 1em; }

    • ベストアンサー
    • CSS
  • .emacsの編集について

    windowsでGNU Emacsを使い始めた初心者です。 .emacsを編集してemacsをカスタマイズしようと思い,.emacsが保存されていたCドライブの中のAPPData/Roamingというフォルダに入りました。予定通り.emacsファイルがあったのでそのファイルに命令を追加したのですがemacsに反映されずに困っています。なにか間違っているのでしょうか?教えてください。ちなみにファイルの中身は以下のように記述されています。 /*Textモードとauto-fillモードを自動的に有効にする*/ (setq default-major-mode'text-mode) (add-Hook 'Texy-mode-hook 'turn-on-auto-fill) /*言語設定*/ (set-language-environment"japanese" ) /*フォントの設定*/ (create-fontset-from-request "private-fontset" '((width . 25) (height . 16) (fixed . t) (italic . nil)) '((family . "MS ゴシック") (family . "Courier New"))) /*色に関する設定*/ (setq default-frame-alist (append (list '(font . "private-fontset")) default-frame-alist)) (if window-system (progn (set-face-foreground 'font-lock-comment-face "MediumSeaGreen") (set-face-foreground 'font-lock-string-face "purple") (set-face-foreground 'font-lock-keyword-face "blue") (set-face-foreground 'font-lock-function-name-face "blue") (set-face-bold-p 'font-lock-function-name-face t) (set-face-foreground 'font-lock-variable-name-face "black") (set-face-foreground 'font-lock-type-face "LightSeaGreen") (set-face-foreground 'font-lock-builtin-face "purple") (set-face-foreground 'font-lock-constant-face "black") (set-face-foreground 'font-lock-warning-face "blue") (set-face-bold-p 'font-lock-warning-face nil) (set-background-color "black") ) ;対応する括弧を表示する (show-paren-mode t)

  • WindowsのEmacsでTwitterを見たい

    Windowsは10か11で、Emacsはバージョンが27.3です。 Twittering-modeを使いたいのですが、うまく動作しません。 EmacsWikiのTwittering-modeのページ(https://www.emacswiki.org/emacs/TwitteringMode-ja)を参考にして、Githubからtwittering-mode-masterをダウンロードし環境変数でHOMEに指定したディレクトリにコピー。 init.elに(add-to-list 'load-path "~/twittering-mode-master")と(require 'twittering-mode)を記述して、M-x twitとすると「Failure: c:/Windows/system32/curl.exe exited abnormally (exit-status=2) for POST https://api.twitter.com/oauth/request_token cond: Failed to retrieve a request token」というメッセージが帰ってきます。 ちなみに、Linux(Debian 11.2)だと同様に設定すると問題なく動きます。 どなたかアドバイスお願いできますか。よろしくお願いいたします。

  • emacsによる字下げの方法

    最近、Windows版emacs(Meadow)で、C言語のプログラムを書き始めた初心者です。 emacsにはTABで半角スペースによる適切なインデントを行ってくれる便利な機能がありますが、行頭のみでしか行ってくれません。行頭以外でも字下げを行う方法はありますか?例えば、 ------ int n char a[10] ------ と記入した際、のnとa[10]の頭を揃える方法です。 自分である程度調べてみるとM-iに字下げを行うコマンドを見つけましたが、タブ文字を使用してしまうため環境によって表示がバラバラになり見にくいという指摘があるため、タブ文字の使用は控えたいのです。 このM-iによる字下げを半角スペースによって行う方法、行頭以外で半角スペースによる字下げを行う別の方法、どちらでも構いません。 わかる人がいれば教えてください。よろしくお願いします。

  • Emacsでのgccのインクルードパスの設定方法

    こんにちは。 Emacsは、Gnu Emacs for Windows 23.4 を使っています。 gccのインクルードパスの問題により、Emcasのcompileコマンドで、Cのソースファイルをコンパイルするができなくて困っています。 具体的には、CのソースファイルをEmacsで開き、「M-x compile」と入力した後、ミニバッファで「gcc -c test.c」と入力すると、以下のようなコンパイルエラーが表示されます。 ------------------------------------------------------------ gcc -c test.c test.c:1:19: no include path in which to search for stdio.h Compilation exited abnormally with code 1 at Sun Jul 08 18:24:05 ------------------------------------------------------------ どうやら、インクルードパスが設定されていないようです。 ちなみに、test.cは以下のような非常に単純なCプログラムです。 ------------------------------------------------------------ include <stdio.h> int main(void) { printf("Hello!\n"); return 0; } ------------------------------------------------------------ コマンドプロンプトや、ktermといった端末から、同じように gcc -c test.c というコマンドを実行すると、エラーが出る事はなく上手くコンパイルできますので、 適切なインクルードパスが設定されているはずです。 どうすれば、Emacsのcompileコマンドから、gccでコンパイルを行う時に使われる、インクルードパスを設定する事ができるのでしょうか? (gccの-Iオプションで、毎回インクルードパスを設定する必要をなくす方法が知りたいです。) では、よろしくお願い致します。

  • Emacs端末上で、Cプログラムが適切に動作しない

    こんにちは。 OSは現在、64bit版のWindows7を使っており、Emacsは、Gnu Emacs for Windows 23.4 を使っています。 Emacsのシェルモード(「M-x shell」で起動するモード)では、シェルとしてCygwinに付属しているbashを使い、C言語のソースをコンパイル(あるいはビルド)する場合は、Cygwinのgccを使おうと考えています。 ところが、ビルドしたプログラムをEmacsのシェルモードで実行すると、上手く起動しないので困っています。 具体的には、以下の通りです。 まず、テスト用のCソースファイルとして、以下のような、test.cを作成しました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { int num=2; printf"Enter integer: "); scanf("%d", &num); printf("Number enterd: %d", num); } ------------------------------------------------------------ これをシェルモードで、gccを使ってビルドし、作成されたa.exeを実行すると、以下のようになりました。 [TERM=emacs] ------------------------------------------------------------ Kei-Lavie@Kei:~/C_Programs $ gcc test2.c Kei-Lavie@Kei:~/C_Programs $ ./a.exe 20 Enter integer: Number enterd: 20 ------------------------------------------------------------ 作成された実行ファイルのa.exeを実行すると、まず Enter integer: と表示されるはずなのですが、それが表示されず、止まります。 そこで、整数として適当に20を入力してみると、 Enter integer: Number enterd: 20 と出力されました。 どうやら、必要な入力操作が終わってから、全ての出力操作が行われるようです。 その事を確認するために、先ほどのtest.cのmain関数を、以下のように変更し、数値を入力する場面を2箇所設けました。 ------------------------------------------------------------ int main(void) { int i=2; double d=0.1; printf("Enter integer: "); scanf("%d", &i); printf("Integer enterd: %d", i); printf("\n"); printf("Enter number: "); scanf("%lf", &d); printf("Number enterd: %f", d); } ------------------------------------------------------------ これをシェルモードで、gccを使ってビルドし、作成されたa.exeを実行すると、以下のようになりました。 [TERM=emacs] ------------------------------------------------------------ Kei-Lavie@Kei:~/C_Programs $ gcc test.c Kei-Lavie@Kei:~/C_Programs $ ./a.exe 20 0.123456789 Enter integer: Integer entered: 20 Enter number: Number entered: 0.123457 ------------------------------------------------------------ 作成された実行ファイルのa.exeを実行すると、まず Enter integer: と表示されるはずなのですが、それが表示されず、止まります。 そこで、整数として20を入力してみても止まったままです。 そして浮動小数点数として0.123456789を入力すると、 Enter integer: Integer entered: 20 Enter number: Number entered: 0.123457 と出力されました。 やはり、必要な全ての入力操作が終わってから、最後に全ての出力操作が行われるようです。 しかし、作成されたa.exeを、ktermといった端末上で実行すると、プログラムは以下のように適切に動作します。 [TERM=kterm] ------------------------------------------------------------ Kei@Kei-Lavie /cygdrive/c/Emacs_for_Windows/C_Programs $ ./a.exe Enter integer: 20 Integer entered: 20 Enter number: 0.123456789 Number entered: 0.123457 ------------------------------------------------------------ つまり、上記のように、作成されたプログラムが適切に動作しない問題は、Emacs端末に固有のもののようです。 上記のような問題を解決しようといろいろ試していると、kterm上で、a.exeの出力を、catやnkfといった出力コマンドにパイプすると、上記のような問題と同じ動作をしました。 具体的には以下の通りです。 [TERM=kterm] ------------------------------------------------------------ Kei@Kei-Lavie /cygdrive/c/Emacs_for_Windows/C_Programs $ ./a.exe |nkf 20 0.123456789 Enter integer: Integer entered: 20 Enter number: Number entered: 0.123457 ------------------------------------------------------------ 以上のような事から、どうやらEmacsのシェルモードでは、プログラムの出力を、catなどの出力コマンドにパイプしているのだと予想されます。 そこで、シェルモードの動作を決めると思われる、shell.el(あるいはshell.elc)やcomint.el(あるいはcomint.el)の内容を見てみたのですが、複雑すぎて、どの部分がEmacs端末上での出力に関与しているのかが分かりませんでした。 どうしてもEmacsのシェルモードを使って、C言語での開発を行いたいと思っていますので、 以上の件について、同じような経験をされた方、あるいは、何か解決策としてのご提案がある方は、是非、投稿をお願い致します。 自力では解決できそうにないので、どうか力をお貸しください。 よろしくお願い致します。

  • 指定文字数で、行を折り返す設定(Emacs)

    こんにちは。 Emacsは、Gnu Emacs for Windows 23.4 を使っています。 Emacsにおいて、指定文字数を越えた時に、折り返す機能について調べたところ、 特定のメジャーモードにおいて、以下のような2行を実行すれば、 80文字を越えた時点で、行が折り返されると書いてあるサイトを、いくつか見かけました。 -------------------------------------------------------------------------------- ;;auto-fillモードを有効にする. (turn-on-auto-fill) ;;これは, メジャーモードごとに設定する必要がある. ;;無効にするには, 「M-x auto-fill-mode」と入力する. ;:折り返しを行う時の文字数を指定する. (setq fill-column 80) ;;これは, メジャーモードごとに設定する必要がある. ;;auto-fillモードが有効な状態だと, 80文字で行が折り返される -------------------------------------------------------------------------------- そこで、Emacs-Lispモードや、C++モードなどのバッファにおいて、 上記の2行を実行したのですが、80文字を越えても、行が折り返されませんでした。 具体的に言いますと、 -------------------------------------------------------------------------------- あああああああああああああああああああああああああああああああああああああああああああああああああああああ -------------------------------------------------------------------------------- のように、日本語を入力したときは、80文字(全角40文字)を越えたところで、折り返されました。 ところが、 -------------------------------------------------------------------------------- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -------------------------------------------------------------------------------- のように、半角の英数字を入力したときは、80文字を越えても折り返されませんでした。 より詳しく調べてみると、どうやら、80文字を越えるところで、全角文字が入力されて確定される場合にのみ、行が折り返されるようでした。 例えば、 -------------------------------------------------------------------------------- 1234567890123456789012345678901234567890123456789012345678901234567890123456ああああああああ -------------------------------------------------------------------------------- のように、半角数字を76文字入力した後、「ああああああああ」と入力して確定すると、 2つ目と3つめの「あ」の間で、行が折り返されました。 半角文字だけの行でも、80文字を越えたら、折り返されるように設定したいのですが、 Emacsでそれは可能なのでしょうか? 色々調べてみても、やり方が分からなかったので、今回質問させて頂きました。 以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

専門家に質問してみよう