9

私は emacs を使い始めたばかりで、とても気に入っている機能が 1 つあります。私はまだelispを学びたくないので、他の誰かがこれをやったといいのですが。

void foo()<cursor>

「{」を入力してこれを発生させたい

void foo(){
    <cursor>
}

これはccモードでのみ発生し、文字列/コメント/ etcでない場合は行末でのみ発生することを望みます

最初に頭に浮かんだのは、常にこれを行うために "{" を再バインドすることでした (自分でこれを行う方法を理解できました) が、適切なタイミングでのみ発生させるのは難しいでしょう。

ヒントをいただければ幸いです。

4

7 に答える 7

9

使用できる最新のemacsでは:

electric-pair-mode is an interactive compiled Lisp function.

(electric-pair-mode &optional ARG)

Automatically pair-up parens when inserting an open paren.

これは Emacs 24.1 (実際には CVS) に統合されています。

于 2010-09-27T22:51:45.683 に答える
5

これはそれを行います:

(defun my-c-mode-insert-lcurly ()
  (interactive)
  (insert "{")
  (let ((pps (syntax-ppss)))
    (when (and (eolp) (not (or (nth 3 pps) (nth 4 pps)))) ;; EOL and not in string or comment
      (c-indent-line)
      (insert "\n\n}")
      (c-indent-line)
      (forward-line -1)
      (c-indent-line))))

(define-key c-mode-base-map "{" 'my-c-mode-insert-lcurly)
于 2010-09-27T20:12:08.730 に答える
3

優れたオートペアマイナーモードを試してみることを心からお勧めします。これは、単に中括弧を挿入するだけでなく、Emacsをその領域のようにIDEのようにします。ccモードの電気ブレース設定と組み合わせると、多かれ少なかれあなたが求める振る舞いが得られると思います。

于 2010-09-27T08:04:21.177 に答える
3

emacs 24 以降のバージョンで electric-pair-mode をオンにします。

(electric-pair-mode 1)
于 2015-11-27T06:31:58.740 に答える
2

yasnippet(またはEmacs Wikiページyasnippet )を試してください。この種のことをサポートするEmacsのパッケージはたくさんありますが、yasnippetは現在勢いがあり、非常に拡張可能です。ビデオをチェックしてください。

于 2010-09-27T05:11:20.593 に答える
1

YASnippet はあなたのために何か良いことをしてくれますが、あなたが求めているものとは正確には違うので、あなたが望むようにこれを行うには emacs-lisp を掘り下げる必要があります。

RETこれを行う最も簡単な方法は、cc モードのキーマップで関数をキーにバインドすることだと思います。

この関数は、前の文字が{であることを確認し、そうであれば、必要なRET, RET, TAB, } ,Upを実行して、必要なTAB場所にカーソルを置き、終了}を挿入します。

バランスの取れたクロージングをチェックすることで機能をより堅牢にすることができます}が、これはより複雑になるため、この追加の洗練された機能なしでどのように感じられるかを確認することをお勧めします.

もしよろしければ、関数とキー マップ バインディングを作成することもできますが、それがどのように行われるかについてのアイデアを求められたので、必要に応じてさらに支援を求めるために、あなたに任せます.

あるいは、autopair.elがこれをうまくやってくれることがわかり、自分で改行を行います ;)

于 2010-09-27T07:49:35.783 に答える
1

空の関数本体のオプションを保持したい場合があります。その場合、右中括弧を同じ行に残したいでしょう。その場合は、次の代替ソリューションを試すことができます。

  1. 閉じ括弧を自動的に追加するには、以前の返信で言及されているパッケージに依存してください。
  2. 関数本体にステートメントを追加する場合は、Returnキーを押します (自動的に追加された右中括弧がまだカーソルの下にある間に)。「Return」キーは次のようにバインドされています。

    ;; automatic first line in function                                             
    (defun my-c-mode-insert-funline ()
      (interactive)
      (newline-and-indent)
      (when (looking-at "}")
        (newline-and-indent)
        (forward-line -1)
        (c-indent-line)))
    (global-set-key (kbd "RET") 'my-c-mode-insert-funline)
    
于 2015-06-30T15:18:08.093 に答える