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%"zy
yv%%"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