2010-12-10 57 views
2

Je cherche un moyen d'imiter le comportement d'édition CSS de Textmate dans Emacs.Emacs Fermeture automatique des accolades en mode css et insertion automatique des points-virgules après les deux-points (ala Textmate)

En TextMate, lors de l'ajout d'une propriété CSS:

#element {} <-- Braces auto close. 
#element {background: ;} <-- after typing the colon, the semi-colon is automatically inserted and the cursor is placed between them. 

J'ai examiné à plusieurs modes de css (et textmate.el) mais ne peut pas voir que quelqu'un a mis en œuvre cela.

J'ai absolument aucune connaissance d'emacs-lisp serait prêt à essayer et à écrire quelque chose moi-même, mais est-ce que quelqu'un sait si cela a déjà été fait?

+0

L'insertion des deux-points et des points-virgules après l'auto-complétion du nom de la propriété est également super confortable! – smonff

Répondre

3

Vous souhaitez examiner quelques exemples de fonctions electric (la convention de dénomination utilisée lorsque des entrées ou des mises en forme supplémentaires sont effectuées lors de la saisie de caractères visibles particuliers).

L'implémentation n'a rien de spécial. La clé en question est liée dans la table de touches du mode à une fonction qui fait le travail. Mis à part le fait que vous devez gérer l'insertion du caractère tapé, c'est comme n'importe quel autre raccourci clavier.

Le mode cc a plusieurs exemples. L'approche de base ressemble à ceci:

(define-key c-mode-base-map "{" 'c-electric-brace) 

(defun c-electric-brace (arg) 
    (interactive "*P") 
    ;; [...] 
    (self-insert-command (prefix-numeric-value arg)) 
    ;; [...] 
) 

Il est vrai que c-électrique-brace est une fonction beaucoup plus compliqué que vous pourriez être attendre, mais il serait trivial d'avoir une fonction qui insère simplement le même nombre de } s après avoir inséré le { s.

(defun my-electric-brace (arg) 
    "Automatically add a closing '}' for every '{' inserted." 
    (interactive "*P") 
    (let ((count (prefix-numeric-value arg))) 
    (self-insert-command count) 
    (save-excursion 
     (insert-char ?} count)))) 

(defun my-css-mode-hook() 
    (local-set-key (kbd "{") 'my-electric-brace)) 

(add-hook 'css-mode-hook 'my-css-mode-hook) 

Vous trouverez peut-être c'est un peu simpliste, et il y a des circonstances dans lesquelles vous ne voulez pas l'accolade correspondante à insérer, cependant. Vous voudrez probablement aussi traiter automatiquement en supprimant accolades correspondantes lorsque vous supprimez l'un d'entre eux, en définissant des fonctions de suppression électrique. Votre exigence de deux points électriques est également moins triviale que l'accolade, car elle ne devrait se produire que dans le bon contexte (bien qu'en pratique, vous pourriez obtenir une implémentation naïve, car je ne pense pas que vous seriez en train de taper des deux-points un fichier CSS qui n'était pas dans le bon contexte.)

Espérons que cela vous indique la bonne direction, si vous décidez d'écrire vos propres solutions.

Il est évident que vous voulez lire quelques tutoriels sur elisp, mais pour comprendre le code ci-dessus, juste noter que vous pouvez utiliser Ch f (describe-function) lire la documentation pour toute fonction elisp (ou Mxfind-function à voir le code).

+0

merci pour une telle explication détaillée – prevailrob

1

Pour l'entretien général de toutes sortes d'accolades, etc., vous pouvez jeter un oeil à autopair-mode.

+0

C'est une solution assez complète pour cet aspect. – phils