Ignorar URL y direcciones de correo electrónico en el archivo ortográfico

12

¿Hay alguna manera de que vim no marque las URL HTTP y las direcciones de correo electrónico como errores ortográficos? ¿O, más generalmente, una forma de enumerar expresiones regulares de ortografías válidas?

noffle
fuente

Respuestas:

16

Puede agregar reglas de sintaxis personalizadas y asignarles la @nospellpalabra clave, esto le indicará a Vim que no aplique la corrección ortográfica a esta coincidencia de sintaxis. Por ejemplo:

:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell

Lo anterior funcionará para archivos de texto y algunos tipos de archivo (como markdown), pero no para todos los tipos de archivo.

Tenga en cuenta que utilicé una expresión regular bastante simple aquí; vea Cómo analizo las URL del texto para algunas alternativas.


Para otros tipos de archivos, debe hacer un poco más de trabajo. Por ejemplo, para pythonarchivos, los comentarios están contenidos en un pythonComment grupo, desde /usr/share/vim/vim74/syntax/python.vim:

syn match   pythonComment   "#.*$" contains=pythonTodo,@Spell

Para anular esto, debemos hacer:

:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment

El truco consiste en agregar una lista de coincidencias de sintaxis coincidentes previamente en las que nuestra coincidencia de sintaxis personalizada puede estar contenida. containedin=Esto le dice a Vim que busque la UrlNoSpellexpresión regular dentro de las pythonCommentcoincidencias.

También necesitamos usar highlightpara establecer los colores correctos, ya que estos no se heredan.

Debe hacer esto en varios lugares, por ejemplo, para cadenas de Python:

:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String

Necesitamos 2 grupos de coincidencia de sintaxis diferentes para poder aplicar el resaltado de sintaxis correcto.

Por supuesto, para otros tipos de archivos debe usar otras containedin=coincidencias de sintaxis ... AFAIK no tiene una solución "universal", pero buscar las correctas /usr/share/vim/vim74/syntax/*.vimno debería ser demasiado difícil.


Tenga en cuenta que todos los comandos anteriores deben ejecutarse después de los archivos de sintaxis; Hay 2 formas de hacer esto:

  • Desde un comando o asignación de teclas, esto debe invocarse manualmente cada vez. p.ej

    fun! NoUrlSpell()
        if &filetype == 'python'
            :syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
            :highlight def link UrlNoSpellComment Comment
            :syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
            :highlight def link UrlNoSpellString String
        elseif &filetype == 'ruby'
            " ...
        else
            syn match   pythonComment   "#.*$" contains=pythonTodo,@Spell
        endif
    endfun
    command NoUrlSpell :call NoUrlSpell()
    
  • Ponga los comandos en el ~/.vim/after/syntax/[filetype].vim. Vim recogerá estos archivos y los ejecutará después de los archivos de sintaxis predeterminados (ver:) :help after-directory.

Martin Tournoij
fuente
3

La excelente respuesta de Martin Tournoij no se comporta como se esperaba para mí, probablemente debido a que aproveché el fenomenal complemento de Diraol en lugar del archivo de sintaxis predeterminado de Vim para Python.python-mode

Para evitar resaltar los URI en los comentarios, cadenas o cadenas de documentos de Python python-mode, agregue la siguiente línea concisa a su ~/.vim/after/syntax/python.vimarchivo específico del usuario :

syntax match NoSpellUriPython '\w\+:\/\/[^[:space:]]\+' transparent contained containedin=pythonComment,python.*String contains=@NoSpell

Eso es. Crucialmente, tenga en cuenta que esto comprime lo que habrían sido doce líneas separadas en la respuesta de Martin en una sola línea. ¿Cómo? Elemental, mi querido Watson, basado en Vim. Añadimos:

  • La transparentpalabra clave, que indica a Vim que herede las propiedades resaltadas de esta sintaxis secundaria de su sintaxis principal (por ejemplo, comentarios, cadenas). Esto nos permite evitar el reinicio explícito highlight def linkde cada grupo de sintaxis secundaria.
  • La containedpalabra clave, que evita que esta sintaxis secundaria se extienda más allá de los límites de su sintaxis principal (por ejemplo, EOL para comentarios, delimitadores de cadena para cadenas).
  • Todos los grupos de sintaxis principal delimitados por comas a la containedinpalabra clave. El .*operador de expresiones regulares nos permite coincidir inteligentemente todos los grupos sintaxis de cadena de Python (es decir, pythonString, pythonUniString, pythonRawString, pythonUniRawString, pythonDocstring) con un mínimo de dolor y la compatibilidad hacia delante máxima.

Aunque técnicamente válido, el vimscript incrustado en la respuesta de Martin viola el principio DRY (No te repitas). Vea también esta respuesta similar para más detalles .

Cecil Curry
fuente
1
Me di cuenta de todo esto de resaltar la sintaxis de Vim mientras escribía las respuestas aquí. No siempre sabía lo que estaba haciendo para ser honesto, así que especialmente algunas de las respuestas anteriores pueden ser menos que óptimas 😅
Martin Tournoij hace