vim folding

vim - Explicando la sintaxis de foldexpr



folding (1)

¿Podría explicarme la sintaxis en el siguiente ejemplo o publicar un enlace donde se explica de forma más general y detallada los símbolos individuales? La ayuda en vim es incompleta

:set foldexpr=getline(v:lnum)=~''^//s*$''&&getline(v:lnum+1)=~''//S''?''<1'':1

¿Qué no está claro?

  1. Las cadenas se encuentran entre comillas simples en lugar de comillas dobles? O puedo elegir?
  2. ¿Qué significa la marca de explicación (?)? in =~''//S''?''<1'':1
  3. ¿Qué significa la expresión ''string1''string2''string3 ?
  4. ¿Qué significa :1 ?

Gracias


La opción foldexpr supone contener una expresión que evalúa en un número entero o cadena de formato particular que especifica el nivel de plegado de la línea cuyo número se almacena en la variable global v:lnum en el momento de la evaluación.

Sigamos la lógica de este ejemplo foldexpr de arriba a abajo.

getline(v:lnum)=~''^//s*$''&&getline(v:lnum+1)=~''//S''?''<1'':1

En el nivel superior, la expresión completa es un operador ternario A ? B : C A ? B : C El resultado del operador es el valor de la expresión B si A evalúa a no cero, y el valor de la expresión C contrario (ver :help expr1 ). En este caso, B es el literal de cadena ''<1'' , y C es el número 1 (para el significado de ''<1'' y 1 como especificadores de nivel de pliegue ver :help fold-expr ).

La expresión A consiste en dos condiciones unidas por el operador && :

getline(v:lnum) =~ ''^//s*$'' && getline(v:lnum+1) =~ ''//S''

Ambas condiciones tienen la misma forma

getline(N) =~ S

La función getline devuelve el contenido de la línea (en el búfer actual) al que hace referencia el número de línea pasado como argumento (ver :help getline ). Cuando se evalúa el foldexpr , la variable v:lnum contiene el número de la línea para la que se debe calcular el nivel de plegado.

El operador =~ comprueba si su operando izquierdo coincide con una expresión regular dada por su operando de cadena derecho, y devuelve un valor booleano (ver :help expr4 , en particular, cerca del final de la sección expr4 ). Por lo tanto, la condición A tiene la intención de verificar que la línea v:lnum coincide con el patrón ''^//s*$'' , y la línea al lado de v:lnum one coincide con el patrón ''//S'' .

Los patrones de expresiones regulares se especifican en la expresión como literales de cadena. Los literales de cadena tienen dos formas sintácticas y pueden citarse mediante comillas dobles o simples. La diferencia entre estas formas es que la cadena de comillas dobles podría contener varias secuencias de control que comienzan con una barra diagonal inversa. Las secuencias permiten especificar caracteres especiales que no se pueden escribir fácilmente de otra forma (comillas dobles, por ejemplo, escribe /" ). Las cadenas de comillas simples, por otra parte, no permiten tales secuencias de barra invertida. (Para una descripción completa de las las cadenas de comillas dobles verán :help expr-string y :help literal-string )

La consecuencia notable de la sintaxis de cadenas entre comillas dobles es que se debe escapar el símbolo de barra invertida ( // ). Es por eso que las cadenas de comillas simples se usan a menudo para especificar expresiones regulares: no hay necesidad de escapar del símbolo de barra invertida que se exige constantemente. Sin embargo, uno puede notar que las barras invertidas se escapan en los patrones anteriores. Esto se debe a que algunos símbolos (incluida la barra invertida) tienen un significado especial cuando se utilizan comandos Ex (incluido :set , por supuesto). Cuando presionas Enter para iniciar el comando

:set foldexpr=...

Vim interpreta algunas secuencias de caracteres primero (ver :help cmdline-special ). En particular, la secuencia // se trata como una sola barra invertida.

Poniéndolo todo junto, la expresión prueba si el número de línea v:lnum contiene solo caracteres en blanco, mientras que la línea al lado (número v:lnum+1 ) tiene cualquier carácter no en blanco (ver :help pattern para comprender el significado del patrones). Si es así, la expresión se evalúa como la cadena ''<1'' , de lo contrario se evalúa como el número 1 .