8
votes

Comment puis-je obtenir des eMacs pour insérer automatiquement des accolades

Je viens de commencer à utiliser Emacs, et il y a une fonctionnalité que j'aimerais vraiment, et la recherche autour d'un peu était infructueuse. J'espère que quelqu'un d'autre l'a fait parce que je ne veux pas apprendre Elisp tout simplement. XXX PRE>

J'aimerais taper un "{" pour que cela arrive p>

void foo(){
    <cursor>
}


2 commentaires

Je pense que c'est duplicata de Stackoverflow.com/Questtions/1023770 / ...


J'ai examiné cette question, mais c'était à propos de l'ajout de la parenthèse de fermeture / BRACE / etc. Je veux que cela newline deux fois, indentez et repositionnez le curseur à la ligne vide aussi


7 Réponses :


2
votes

try Yasnippet (ou sur la page Wiki EMACS Yasnippet ). Il existe de nombreux forfaits pour EMACS qui soutiennent ce genre de chose, mais Yasnippet semble avoir de l'élan actuellement et est très extensible. Découvrez les vidéos.


2 commentaires

Cela ne semble pas être idéal, j'ai besoin d'appuyer sur Tab pour l'agrandir et cela ne fonctionne pas s'il n'y a pas d'espace entre le "{" et tout ce qui est saisi.


Vous pouvez probablement modifier le modèle pour supprimer l'espace. La modification / la création de modèles est assez facile.



1
votes

Vous devrez approfondir avec Emacs-Lisp pour le faire exactement comme vous le souhaitez, car Yasnippet fera quelque chose de gentil pour vous, mais pas exactement ce que vous demandez.

Je pense que le moyen le plus simple de le faire serait de lier une fonction à la touche RET , dans la touche CC-Mode.

La fonction doit vérifier que le caractère précédent est un { et, le cas échéant, exécutez le RET , res , Onglet , } , up , onglet pour obtenir le curseur où vous voulez et la fermeture } } inséré.

Vous pouvez rendre la fonctionnalité plus robuste en le permettant de vérifier une fermeture équilibrée } mais ce serait plus compliqué et je recommanderais de voir comment il se sent sans cette fonctionnalité de polissage supplémentaire.

Si vous aimez, je peux écrire la fonction et la fixation de la carte de la clé pour vous, mais que vous avez demandé une idée de la façon dont cela est fait, je vous laisserai à vous de demander plus d'aide si vous en avez besoin.

Alternativement, je trouve que autopair.el le fait-il assez bien pour moi, et je fais moi-même des lignes neuves;)


2 commentaires

c'est ce que je pensais. Y a-t-il un moyen facile de, à l'intérieur de la fonction LISP, vérifiez si je suis dans un commentaire / chaîne et si je suis à la fin de la ligne? Je sais que le mode CC le fait en interne et cela rendrait cela vraiment facile si je pouvais simplement l'utiliser.


Vous pouvez utiliser Chose-A-point pour déterminer quel contexte vous êtes dans.



3
votes

Je vous recommande d'essayer d'essayer l'excellent Autopair Mode mineur - il fait beaucoup Plus que simplement insérer des accolades et fabrique des eMacs beaucoup plus d'IDE comme dans cette zone. Je suppose que la combinaison avec le paramètre d'accolades électriques en mode CC vous donnera plus ou moins le comportement que vous recherchez.


0 commentaires

5
votes

Cela le fera:

(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)


0 commentaires

9
votes

sur les derniers EMACS, vous pouvez utiliser:

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

(electric-pair-mode &optional ARG)

Automatically pair-up parens when inserting an open paren.


0 commentaires

1
votes

Vous voudrez peut-être conserver l'option d'un organe de fonction vide, auquel cas vous voudrez que la corse de fermeture reste sur la même ligne. Si tel est le cas, vous pouvez essayer cette solution alternative:

  1. S'appuyer sur les packages mentionnés dans les réponses précédentes pour ajouter automatiquement la corse de fermeture. li>
  2. Lorsque vous souhaitez ajouter des instructions à l'organisme de fonction, vous appuyez sur la touche CODE> RETURN > (lorsque l'attelle de fermeture ajoutée automatiquement est toujours sous le curseur). La touche "retour" est liée comme suit: P>

    ;; 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)
    


0 commentaires

3
votes

Activer le mode paire électrique dans EMACS 24 ou version plus récente.

(electric-pair-mode 1)


0 commentaires