2009-05-27 7 views
11

Lors de l'utilisation paredit dans les modes de programmation tels que C, en tapant (insérera un espace avant le PAREN quand je suis en train d'appeler une fonction, me laissant avec:Modification Paredit Mise en forme

foo() 

est-il un moyen pour désactiver l'insertion de l'espace sans changer la source de paredit?

Répondre

13

Eh bien, la façon dont paredit semble fonctionner est qu'il vérifie les tables de syntaxe pour voir si vous insérez une paire juste après un mot/symbole/etc., Dans ce cas, cela force l'insertion d'un espace Vous devez remplacer cette fonctionnalité - ce qui peut être fait de différentes manières: conseils, redéfinir la fonction déterminante g espace, changer la table de syntaxe, etc.

Je vais essayer la simple:

(defun paredit-space-for-delimiter-p (endp delimiter) 
    (and (not (if endp (eobp) (bobp))) 
     (memq (char-syntax (if endp (char-after) (char-before))) 
      (list ?\" ;; REMOVED ?w ?_ 
        (let ((matching (matching-paren delimiter))) 
        (and matching (char-syntax matching))))))) 

Cela s'appliquera évidemment à tous les endroits où vous utilisez paredit. Si vous voulez quelque chose de plus spécifique au mode, vous pouvez ajouter quelques conditions à cette instruction and (par exemple (and ... (memq major-mode '(c-mode lisp-mode)))).

Alors ... je suppose que j'ai changé la "source", mais vous pouvez faire la même chose avec un morceau de defadvice ... tout est élisp, donc la différence est minime. Il ne semble pas y avoir de paramètre pour contrôler ce type de comportement.

+2

J'ai voulu ce depuis longtemps, depuis que je trouve autopair.el _very_ lent. Paredit fonctionne maintenant comme un charme dans 'c-mode'. Je vous remercie! :) –

+0

Pour être spécifique au mode, on peut aussi écrire '(defvar-local mon-paredit-no-insert-space nil)' et utiliser '(et ... my-paredit-no-insert-space)' au lieu de '(et ... (memq mode majeur '(c-mode lisp-mode))))', puis définissez 'my-paredit-no-insert-space' à' t' à partir de 'c-mode-common- crochet ». De cette façon, deux personnes ayant des préférences de différence peuvent utiliser la même nouvelle définition de 'paredit-space-for-delimiter-p' –

+0

' Si vous voulez quelque chose de plus spécifique au mode, vous pouvez ajouter des conditions à cela et à la déclaration' - je veux ne remplace pas ceci pour certains modes, mais je ne comprends pas à quelle instruction 'if 'je peux ajouter la condition. Pouvez-vous clarifier s'il vous plait? – Max

4

Eh bien, Paredit est idéal pour éditer des langages construits avec des expressions-S. Si vous aimez juste comment il insère automatiquement le paren de fermeture, utilisez la fonctionnalité skeleton-pair.

(setq skeleton-pair t) 
(global-set-key "(" 'skeleton-pair-insert-maybe) 
+0

Bon point. J'ai oublié la paire de squelettes. Je suis tellement habitué à Paredit pour me balader avec emacs lisp. J'ai besoin de mettre cela en place pour mes langages non-lispy. –

+3

En fait, le mode paredit est extrêmement utile en dehors des langages s-expression pour forcer la validité des délimiteurs appariés; ce n'est pas seulement une question d'insertion. – technomancy

5

Voir paredit-space-for-delimiter-predicates

+0

Cela pourrait être intéressant à cet égard (peut-être besoin d'ajuster les noms de mode, ou même de supprimer 'dolist' et simple ajout de 'lambda()' au hook de votre mode (si vous avez un seul mode)): https://gist.github.com/remvee/879305 – dimsuz