Je suis en train d' écrire une fonction VIML qui, en mode d'insertion, permet à <BS>
travers la partie d'ouverture d'une paire ( [
, {
, etc.) pour supprimer la partie de fermeture de la paire si elle est le caractère suivant le curseur ( un peu comme paires d'auto- et vim-autoclose ). Cette fonction sera différente car la partie de fermeture de la paire ne sera pas supprimée s'il y a des paires déséquilibrées.
Exemples:
Le format est celui <initial> => <result-after-backspace>
où mon curseur se trouve devant le |
.
((|) => (|)
((|)) => (|)
(|) => |
(defn => (defn
(|) |)
Comment puis-je déterminer si les paires sont déséquilibrées ou non avant de continuer et de supprimer la paire de clôture?
J'ai testé les paires automatiques et vim-autoclose . Avec les deux plugins, la partie de fermeture de la paire est toujours supprimée.
la source
Réponses:
Si je comprends bien votre question, la clé est de déterminer si le caractère sur le curseur est un délimiteur correspondant.
Considérez les commandes en mode normal
v%"zy
etv%%"zy
.@z
. Le second tirera une chaîne de longueur exactement 1 - encore une fois, le délimiteur lui-même - dans@z
.@z
. Avorter.@z
. Avorter.@z
. Avorter.Ainsi, nous avons le résultat suivant:
Conseils pour VimL:
:norm ...
et vousstrlen(@z)
aideront ici.la source
(|)
:, appuyer sur<BS>
devrait supprimer les deux. Cependant, si le formulaire de niveau supérieur est déséquilibré, comme ceci(defn (|)
:, appuyer sur<BS>
ne devrait supprimer que ce qui serait normalement supprimé - dans ce cas, nous laisser avec(defn |)
.Ok donc j'ai fini par parcourir paredit.vim et en retirant quelques fonctions pour créer ceci: vim-pear . Il insère et supprime les délimiteurs par paires tout en conservant un état équilibré.
la source