¿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?
¿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?
Puede agregar reglas de sintaxis personalizadas y asignarles la
@nospell
palabra 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 python
archivos, 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
UrlNoSpell
expresión regular dentro de las pythonComment
coincidencias.
También necesitamos usar highlight
para 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/*.vim
no 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
.
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.vim
archivo 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:
transparent
palabra 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 link
de cada grupo de sintaxis secundaria.contained
palabra 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).containedin
palabra 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 .