search – ¿Cómo buscar patrones en ciertas regiones de sintaxis?

Pregunta:

Estoy usando vim para editar documentos de látex. A menudo, querré cambiar el nombre de una variable a otra cosa. Sin embargo, es un poco molesto tener que buscar coincidencias irrelevantes cuando busco el nombre de la variable. Me gustaría buscar solo en "zonas matemáticas" como se define en el archivo de sintaxis tex. ¿Existe una forma sencilla de limitar una búsqueda a una región de sintaxis específica?

Respuesta:

Aquí hay una función que puede probar. Solo lo he probado un poco, pero parece funcionar bien.

function! JJSyntaxSearch(pattern, syntaxitem)
  while search(a:pattern, 'W') > 0
    for id in synstack(line("."),col("."))
      if synIDattr(id,"name") =~? a:syntaxitem
        return line(".")
      endif
    endfor
  endwhile
  return 0
endfunc

command! -nargs=* JJSyntaxSearch call JJSyntaxSearch(<f-args>)

La función llama a la función de búsqueda de Vim en un bucle hasta que encuentra una coincidencia 'ordinaria' que también es una coincidencia 'calificada' para un elemento de sintaxis en particular, o hasta que llega al final del búfer.

Se necesitan dos argumentos. El primero es el patrón de búsqueda y se pasa sin cambios a la función search() Vim. Consulte :help search() para ver cómo funciona esa función. El segundo argumento es el nombre del elemento de sintaxis en el que desea filtrar estas coincidencias. Esto también puede ser un patrón y se compara como una expresión regular que no distingue entre mayúsculas y minúsculas.

Para encontrar el patrón 'alfa' en zonas matemáticas, puede hacer

:JJSyntaxSearch alpha texMathZone.

El . al final está el átomo de patrón para cualquier carácter individual, consulte :help /. . Esto se debe a que hay muchos elementos de sintaxis de la zona matemática llamados texMathZoneA , texMathZoneB , etc.

La función de search() mueve el cursor a la siguiente coincidencia 'ordinaria'. Luego, nuestra función obtiene todos los ID de elementos de sintaxis para esa nueva posición del cursor con synstack() . Al recorrerlos, recupera el nombre de cada elemento y lo prueba con el argumento de syntaxitem . Consulte :help synstack() y :help synIDattr() . Si hay una coincidencia "calificada", devuelve el número de línea. Si llega al final del búfer sin encontrar ninguna coincidencia 'calificada', devuelve 0 . El objetivo de la función es llevar el cursor a la siguiente coincidencia 'calificada' para que pueda realizar alguna operación allí, pero es útil devolver "número de línea o 0" para indicar si tiene sentido volver a llamar a la función, por instancia si desea llamar a la función repetidamente desde otra función o una macro.

Elegí usar la bandera W para la search() porque evita 'envolver' el final del búfer. De lo contrario, la función podría atascarse ya que sigue encontrando las mismas coincidencias "normales" pero no coincidencias "calificadas".

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım