Estoy escribiendo una función VIML que, en el modo de inserción, permite una <BS>a través de la parte inicial de un par ( [, {, etc.) para eliminar la parte de cierre del par si es el siguiente carácter después del cursor (como auto-pares y vim-autoclose ). Esta función será diferente porque la parte de cierre del par no se eliminará si hay pares desequilibrados.
Ejemplos:
El formato es <initial> => <result-after-backspace>donde mi cursor está delante de |.
((|) => (|)
((|)) => (|)
(|) => |
(defn => (defn
(|) |)
¿Cómo puedo determinar si los pares están desequilibrados o no antes de continuar y eliminar el par de cierre?
He probado ambos pares automáticos y vim-autoclose . Con ambos complementos, la parte de cierre del par siempre se elimina.
vimscript
delimiter-matching
200_success
fuente
fuente

Respuestas:
Si entiendo su pregunta correctamente, la clave es determinar si el carácter en el cursor es un delimitador coincidente.
Considere los comandos de modo normal
v%"zyyv%%"zy.@z. El segundo tirará de una cadena de longitud exactamente 1, nuevamente, el delimitador en sí mismo@z.@z. Abortar.@z. Abortar.@z. Abortar.Por lo tanto, tenemos el siguiente resultado:
Sugerencias para VimL:
:norm ...ystrlen(@z)ayudará aquí.fuente
(|)presionar<BS>debería eliminar ambos. Sin embargo, si el formulario de nivel superior no está equilibrado, así:(defn (|)presionar<BS>solo debería eliminar lo que normalmente se eliminaría, en este caso dejándonos con(defn |).Ok, terminé revisando paredit.vim y sacando algunas funciones para crear esto: vim-pear . Inserta y elimina delimitadores en pares mientras mantiene un estado equilibrado.
fuente