Haz que Vim muestre TODOS los espacios en blanco como un personaje


772

No puedo encontrar una manera de hacer que Vim muestre todos los espacios en blanco como un personaje. Todo lo que encontré fue sobre pestañas, espacios finales, etc.


14
También estoy tratando de resolver exactamente este problema. Por favor, si te encuentras con esto, abstente de hacer otra respuesta que involucre :set list. Eso no responde nuestra pregunta. (Para otros interesados : la respuesta de mrucci a continuación es útil, aunque no es una solución real )
ELLIOTTCABLE

1
Para todos aquellos que dicen que los espacios son visibles listy listcharsconsideran que un espacio sigue directamente a una pestaña. Sería casi invisible en esta situación. Estoy de acuerdo en que puede atrapar la mayoría de las situaciones, pero sería bueno tener un resaltado adecuado de todos los espacios.
Kevin Cox

11
Para nuevos visitantes: ¡ Esto se resuelve en versiones más nuevas de vim! Ver la respuesta de brettanomyces a continuación .
ELLIOTTCABLE

1
Relacionado (pero pila de diferencias): vi.stackexchange.com/questions/422/…
Pureferret

Respuestas:


693

Como otros han dicho, podrías usar

:set list

que, en combinación con

:set listchars=...

Mostrar caracteres invisibles.
Ahora, no hay una opción explícita que pueda usar para mostrar espacios en blanco, pero en los cuadros de lista, puede establecer un carácter para que se muestre para TODO PERO espacios en blanco. Por ejemplo, el mío se ve así

:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<

entonces, ahora, después de usar

:set list

todo lo que no se muestra explícitamente como algo más, es entonces, realmente, un espacio en blanco simple.

Como de costumbre, para entender cómo listcharsfunciona, use la ayuda. Proporciona gran información sobre qué caracteres se pueden mostrar (como el espacio final, por ejemplo) y cómo hacerlo:

:help listchars

Puede ser útil agregarle un conmutador para que pueda ver los cambios a mitad de la edición fácilmente (fuente: VIM: set list! Como alternar en .vimrc ):

noremap <F5> :set list!<CR>
inoremap <F5> <C-o>:set list!<CR>
cnoremap <F5> <C-c>:set list!<CR>

44
¿"Todo lo que no se muestra explícitamente como algo más"? Pruebe espacios unicode del rango U + 2000..U + 200A. Si la fuente de ancho fijo los admite, se mostrarán como espacio 0x20 normal.
ZyX

2
@ZyX: no estaba tomando todo Unicode, sino el conjunto de caracteres bastante común en uso. Si no está satisfecho con la respuesta, no dude en sugerir mejoras.
Torre

20
@ckarbass -: set invlist
Rook

Gran consejo! Recomiendo poner la línea set listchars al .vimrcarchivo, para que esta bonita forma de mostrar caracteres invisibles se pueda habilitar fácilmente :set listen cualquier momento (sin volver a buscar en esta página).
Melebius

8
@ckarbass De la misma manera que alterna cualquier cosa en vim, ¡agregue un! hasta el final. Entonces se convierte en: ¡lista de espera!

275

¡A partir del parche 7.4.710 ahora puede configurar un personaje para que se muestre en lugar de espacio usando listchars!

:set listchars+=space:␣

Por lo tanto, para mostrar TODOS los espacios en blanco como caracteres, puede hacer lo siguiente:

:set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
:set list

Discusión sobre la lista de correo: https://groups.google.com/forum/?fromgroups#!topic/vim_dev/pjmW6wOZW_Q


2
Esto es bastante bueno, pero me pregunto por qué el personaje EOL no se colorea de manera diferente, a diferencia de los demás.
CMCDragonkai

3
Intenté esto y obtuve un error al principio. Resultó que "espacio" no era una opción válida en la versión un poco más antigua de gvim que estaba usando. Actualizar mi gvim resolvió mi problema. Para otros que reciben un error, escriba :help listcharspara verificar si "espacio" es una opción válida para "listchars". Si no es así, actualice su vim al parche @brettanomyces especificado. O simplemente deje "espacio" fuera del comando set si no le importa ver espacios.
Niko Bellic

44
Uso el punto medio de Unicode (U + 00B7) para el carácter de espacio ( space:·), ya que parece MS Word, Notepad ++, etc.
Dinei

1
@ user5359531 intente <ctrl-v> u2334 para ingresar el carácter de cuadro abierto Unicode (␣). Ver sanctum.geek.nz/arabesque/special-characters-in-vim para más detalles
Brett Y

3
Escriba <C-K>.Mvim para ·. Ver :h digraphpara más detalles.
johnchen902

252

:set list para permitir.

:set nolist deshabilitar.


11
Gracias por mostrarnos cómo alternar entre modos. Uno pensaría que otras respuestas avanzadas enseñarían eso.
Jonathan Komar

1
Sí, esto es útil. Desearía que fuera la respuesta principal, ya que encontré esta respuesta solo para descubrir que ya estaba en el sitio, solo fuera de la vista.
Ejoso

8
: set list!es mejor :)
skippr

@Skippr ¿En qué medida? Es mismo número de pulsaciones de teclas, excepto que Shifty !son tanto más difíciles de escribir que no. Si lo está poniendo en su .vimrc, estoy de acuerdo en que el formulario de exclamación es más fácil de leer.
Dan Bechard

77
@Dan Si está buscando alternar esto en un tiempo relativamente corto, :set list!lo hará sin necesidad de ingresar nolist. El !simplemente hace lo contrario de lo que esté configurado actualmente. Lo uso todo el tiempo, especialmente cuando estoy con :set paste!. Odio presionar la tecla de flecha para encontrar :set pasteo :set nopastejajaja
skippr

188

Creo que otras respuestas aquí son más completas, pero pensé en compartir un truco que suelo usar para diferenciar visualmente las pestañas y los espacios:

:syntax on
:set syntax=whitespace

Estas son reglas de resaltado de sintaxis para el lenguaje de programación de espacios en blanco: las pestañas se muestran en verde y los espacios en rojo. :)

Se puede combinar con :set listlo mencionado por muchas otras respuestas, aunque las pestañas se mostrarán como ^ I sin un resaltado verde, pero los espacios se mostrarán en rojo.


77
Me gusta esta, es bastante inteligente y se siente de alguna manera mejor que la mayoría de las otras respuestas. Sin embargo, no es realmente una solución que se pueda usar todo el tiempo.
ComputerDruid

44
Prefiero métodos más convencionales, pero estoy haciendo +1 por inventiva.
Sietse van der Molen

28
Sabía que el lenguaje sería útil para algo .
Dan Bechard

1
¿Te importa vincular al archivo de sintaxis .vim que estás usando para resaltar
SeldomNeedy

2
@SeldomNeedy no debería necesitar descargar nada, las reglas de resaltado de espacios en blanco se han enviado con Vim durante años. Esencialmente, deberían estar integrados a menos que esté utilizando una versión extraña o muy antigua de Vim.
Eliot

91

:set listmostrará todos los espacios en blanco como un personaje. Todo menos un espacio se verá diferente de su estado normal, lo que significa que si todavía ve un espacio antiguo simple, es realmente un espacio antiguo simple. :)


35
Desactive esto con:set nolist
Greg K

66
¿Qué sucede si desea ver el carácter de espacio, como en Sublime Text 2 con "show whitespace" activado? Lo encontré realmente útil.
Olical

No es para lo que vine aquí pero es muy útil. Gracias.
Harperville

44
También las opciones con no se podían activar !al final:set list!
calvas

Yo uso un forro, :se hls | /\_spara esto. Obtiene todo mientras set listignora los espacios. De nuevo con :se nohls. Detalles al respecto en esta publicación: albertech.blogspot.com/2015/02/…
jar

73

Si configura:

:highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none

y luego realice una búsqueda de un espacio, cada carácter de espacio se mostrará como un carácter subrayado.

Puede usar este comando en una función práctica que alterna el "subrayado" de espacios.

set hls
let g:HLSpace = 1
let g:HLColorScheme = g:colors_name
function ToggleSpaceUnderscoring()
    if g:HLSpace
        highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none
        let @/ = " "
    else
        highlight clear
        silent colorscheme "".g:HLColorScheme
        let @/ = ""
    endif
    let g:HLSpace = !g:HLSpace
endfunction

Asigne la función a una tecla de acceso directo con:

nmap <silent> <F3> <Esc>:call ToggleSpaceUnderscoring()<CR>

Nota: defina la función en vimrc después de que se haya configurado el esquema de colores.


1
Bueno, es un truco, pero hasta ahora está más cerca que cualquier otra cosa. ¡Recompensa otorgada! : D
ELLIOTTCABLE

45

Dependiendo de sus reglas de sintaxis para el búfer actual, algo como esto podría funcionar:

:syn match WhiteSpace / / containedin=ALL conceal cchar=Æ
:setl conceallevel=2 concealcursor=nv

Esto necesita un vim 7.3 con + función de ocultación

Actualización 24/10/2014 Para ampliar un poco sobre eso. Por supuesto, es posible definir algunos resaltados para los caracteres encerrados.

  • Puede configurar cómo se ven los caracteres ocultos. Para resaltar, tendría que configurar al menos una vez el grupo de resaltado 'Ocultar' (consulte la ayuda en :h hl-ConcealEsto se puede hacer en su esquema de colores y luego no necesita volver a configurarlo nuevamente. Pero esto afecta a todos los caracteres ocultos (por ejemplo, si su el script de sintaxis oculta algunos elementos más, se mostrarán como caracteres de espacio en blanco).

    :hi Conceal ctermfg=7 ctermbg=NONE guifg=LightGrey guibg=NONE

  • Parece existir una particularidad de que Vim no resaltará espacios, si el script de sintaxis usa la skipwhitepalabra clave. No habrá forma de evitarlo (tal vez esto se arregle, publiqué un parche )

  • Parece que hay un parche flotando, que permitirá personalizar cómo se verán los espacios en el listmodo. El último en el momento de escribir parece ser este . (Esto significa que necesita construir su propio Vim para usar esto).
  • El conceallevelyconcealcursor son ventana de opciones locales. Eso significa que pueden ser diferentes en diferentes ventanas (y posiblemente también se establecerán mediante complementos de tipo de archivo u otros scripts de complementos).
  • Los grupos de resaltado de sintaxis deben ejecutarse cada vez que se vuelve a cargar un archivo de definición de sintaxis. Esto podría hacerse usando un BufWinEntero posiblemente también un Syntaxo inclusoFileType autocomando. (No he probado cuál funciona realmente).

Los dos últimos elementos significan que tendría que configurar algunos comandos automáticos que restablecen las reglas de sintaxis y las opciones de respuesta correspondientes. Para el primero, es posible que desee configurar el resaltado utilizando unColorScheme comando automático (para que los caracteres ocultos siempre se vean iguales, independientemente de lo que configure realmente un esquema de color). Para una solución completa, busque en la respuesta romana, que debería darle un comienzo. Si configura una función, puede configurar fácilmente un comando de alternar para activar o desactivar la visualización de resaltado especial.

Actualización 26/10/2014 Hice un complemento de esta pregunta.

Actualización 22/04/2015 Se ha incluido un parche en Vim que lo hace posible mediante la listopción. Simplemente configure set list listchars+=space:␣ Esto funciona a partir de Vim 7.4.711


¡Esto funciona muy bien! ¿Cómo se puede agregar esto .vimrc?
Eric Martindale

1
Dado que esto funciona en el búfer actual, probablemente necesite envolverlo en un comando automático. BufEnter o incluso Syntax autocommand podrían funcionar para usted:
Christian Brabandt

3
Æes una extraña elección de personaje para esto, ¿por qué no ·?
Marius Gedminas

1
Esta es realmente la respuesta correcta. ¿Alguna idea sobre cómo agregar resaltado de sintaxis adecuada a este personaje? Yo prefiero que si se tratara de una muy descolorida ·
ataque aéreo

@ChristianBrabandt, tienes un montón de archivos relacionados con nrrwrgn que contaminan tu repositorio.
romainl

31

yo uso esto

/\s
:set hlsearch

para resaltar espacios en blanco. Busca todos los espacios en blanco y luego habilita el resaltado para que salgan. Sin embargo, no imprime un carácter especial.


La solución más simple en mi humilde opinión. Excelente emparejado con un comando para borrar la búsqueda (uso nnoremap <leader><space> :noh<cr>)
Lenna

24

Si por espacios en blanco te refieres al carácter '', mi sugerencia sería solo una búsqueda / reemplazo. Como los demás han insinuado, set listcambia los caracteres que no se imprimen a un carácter visible que está configurado en listchars.

Para mostrar explícitamente espacios como algún otro personaje, algo similar a lo siguiente debería ser el truco:

:%s/ /█/g

Luego solo deshaga el cambio para volver de nuevo.

(Para obtener el █ Presioné esta secuencia de teclas exacta: :%s/ /CTRL-KFB/g)


2
Me gusta esto mejor que otras respuestas, esto me parece inverso :set list, cambiando el carácter visible ('espacio') a uno no prismático (??). Me pregunto si uno puede usar esta combinación interna, por ejemplo, :match MyBlackBlockChar "appropriate_regexeso debería funcionar, ¿no?
Sudhi

Las otras respuestas son útiles, pero esta es la primera que realmente responde la pregunta de OP +1
Alexx Roche

1
O :%s/\s/█/gpara todos los espacios en blanco. Además, :set hlsearchplus :&s/\s//gnpodría ser útil.

16

Para resaltar espacios, solo búscalo:

/ <espacio>

Notas:

  • <espacio> significa simplemente escribir el carácter de espacio.
  • Habilite el resaltado de los resultados de búsqueda con: establecer hlsearch

    Para resaltar espacios y pestañas:

    / [<space> <tab>]

    Una forma rápida de eliminar los resaltados es buscar cualquier otra cosa: / asdf

    (simplemente escriba cualquier lista corta de caracteres aleatorios)


  • 1
    Esto es lo mismo que la respuesta publicada 3 años antes. Además, noh es más rápido que / asdf para resaltar texto. O incluso podría configurar f1 en: no, dado que probablemente lo usará con frecuencia.

    @DrEval Suponiendo que usted se refiere a la respuesta de Benedikt Köppel en realidad es sutilmente diferente /<space>vs /\s. Creo que no es obvio y más rápido usar la sugerencia aquí.
    icc97

    14

    El siguiente código se basa en la respuesta de Christian Brabandt y parece hacer lo que quiere el OP:

    function! Whitespace()
        if !exists('b:ws')
            highlight Conceal ctermbg=NONE ctermfg=240 cterm=NONE guibg=NONE guifg=#585858 gui=NONE
            highlight link Whitespace Conceal
            let b:ws = 1
        endif
    
        syntax clear Whitespace
        syntax match Whitespace / / containedin=ALL conceal cchar=·
        setlocal conceallevel=2 concealcursor=c
    endfunction
    
    augroup Whitespace
        autocmd!
        autocmd BufEnter,WinEnter * call Whitespace()
    augroup END
    

    Agregue esas líneas a su ~/.vimrce inicie una nueva sesión de Vim para ver cómo sucede la magia aún imperfecta .

    Siéntase libre de editar los colores predeterminados y ocultar el carácter.


    Advertencia: algo en el *FuncBodygrupo de sintaxis en varios idiomas impide que se muestre el punto medio. No sé (¿todavía?) Cómo hacer que esa solución sea más confiable.


    Eso es lo que quise decir con "dependiendo del grupo de sintaxis" Sospecho que este es un problema con las palabras clave de sincronización en combinación con la bandera skipwhite.
    Christian Brabandt

    @ChristianBrabandt, sí, no podría ir más allá de lo que ya hiciste además de hacerlo "automático".
    romainl

    1
    Sí, es el skipwhiteargumento en las reglas de sintaxis, lo que evita que el grupo de sintaxis coincida (aunque debería permitirse que esté contenido en todos los grupos).
    Christian Brabandt

    ¿Hay alguna manera de hacer que esto funcione bien con Indent Guides , que agrega antecedentes a la sangría? Sospecho que es cuestión de lograr que esto no anule el color de fondo, pero esto parece no ser trivial.
    Mike

    ¿Cómo deshabilitar lo mismo cuando no se requiere resaltar el espacio en blanco? Buscando una especie de comando de alternar corto.
    yuvaeasy

    11

    Estaba frustrado con todas las otras respuestas a esta pregunta, porque ninguna de ellas resalta el carácter espacial de una manera útil. Mostrar espacios como caracteres sería particularmente útil para los idiomas con formato de espacios en blanco, donde mezclar pestañas y espacios es perjudicial.

    Mi solución es mostrar pestañas y subrayar múltiples espacios. Toma prestado de la respuesta de mrucci y de este tutorial . Debido a que utiliza el resaltado de sintaxis, es persistente:

    set list listchars=tab:\|\ 
    highlight Whitespace cterm=underline gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    autocmd ColorScheme * highlight Whitespace gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    match Whitespace /  \+/
    

    Con esto, las pestañas se muestran como |y los espacios como_ , lo que hace que sea muy fácil saber cuándo estoy mezclando estilos de código.

    El único inconveniente que he encontrado es que este fragmento no ajusta el color de fondo para que coincida con el contexto (como en un comentario).


    8

    todas las respuestas anteriores intentan hacer espacios visibles desde vim. Si realmente insiste en tener espacios visibles como puntos, hay otro enfoque ...

    Si no se puede hacer en vim, cambie su fuente por completo. Copié la fuente Ubuntu One Mono y la edité usando FontForge. Recuerde cambiar el nombre completo de la fuente, la familia, la familia preferida, la compatibilidad completa (en FontFoge está bajo los nombres TTF en la información de la fuente), para tenerla como una fuente separada. Simplemente edite el carácter de espacio para tener un punto en el medio y guarde la fuente en ~ / .fonts. Ahora puede usarlo para su gvim o la terminal completa ... Copié el "!" carácter, eliminó la línea y movió el punto al centro. Tomó un poco más de 5 minutos ...

    Nota: cambiar el carácter de espacio (0x20) resulta en el inconveniente de tener puntos en toda la pantalla vim ... (pero separará los espacios de las pestañas ...)


    2
    Esto sonaba como un enfoque realmente bueno hasta que leí la nota sobre cómo llenar toda la pantalla con puntos. : /
    friederbluemle

    3
    ¡Puntos para la creatividad! :-)
    jpaugh

    7

    No encontré exactamente lo que quería de las respuestas existentes. El siguiente código resaltará todos los espacios finales de color rojo brillante. Simplemente agregue lo siguiente a su.vimrc

    highlight ExtraWhitespace ctermbg=red guibg=red
    match ExtraWhitespace /\s\+$/
    autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
    autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
    autocmd InsertLeave * match ExtraWhitespace /\s\+$/
    autocmd BufWinLeave * call clearmatches()
    

    5
    :match CursorLine /\s\+/
    

    evita el bit "tienes que buscar espacios para que aparezcan", pero un hecho no se puede configurar para hacer cosas que no sean de resaltado en los espacios. CursorLine puede ser cualquier grupo de resaltado y en el tema predeterminado es un subrayado simple.


    No puedo distinguir la diferencia entre pestañas y espacios usando este método, lo cual es una lástima, pero me encanta que sea un trazador de líneas.
    Rustavore

    5

    Me gusta usar caracteres especiales para mostrar espacios en blanco, es más claro. Incluso un mapa para alternar es una característica clave, para una verificación rápida.

    Puede encontrar estas características en un antiguo script vim no actualizado desde 2004:

    vim-scripts/cream-showinvisibles@vim.org

    Gracias al proyecto vim-scripts y vundle puedes revivir este complemento

    vim-scripts / cream-showinvisibles @ github

    Aún mejor, mis dos centavos en esto es agregar un acceso directo configurable (en lugar de predefinido F4)

    así que agregue esto a ~ / .vimrc

    Plugin 'albfan/cream-invisibles'
    
    let g:creamInvisibleShortCut = "<F5>" "for my F4 goto next error
    

    instalar el complemento en vim

    :PluginInstall
    

    y ahí vas


    5

    Para cubrir los caracteres de espacio en blanco Unicode:

    set list
    set listchars=tab:│\ ,nbsp:·
    highlight StrangeWhitespace guibg=Red ctermbg=Red
    " The list is from https://stackoverflow.com/a/37903645 (with `\t`, `\n`, ` `, `\xa0` removed):
    call matchadd('StrangeWhitespace', '[\x0b\x0c\r\x1c\x1d\x1e\x1f\x85\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]')
    

    El resultado:

    • solo el espacio ordinal (U + 0020) se parece a un espacio (" ")
    • la pestaña (U + 0009) se ve como " │ " (dos caracteres: una tubería larga y luego un espacio ordinal; son grises encolorscheme murphy )
    • el espacio normal que no se rompe (U + 00A0) se ve como " ·" (un carácter; es gris colorscheme murphy)
    • cualquier otro carácter de espacio en blanco parece rojo " "

    1
    Editado para agregar "ctermbg = Red" para que mi terminal funcione para la coloración. Personalmente utilicé set listchars=tab:»\ ,space:·para su referencia.
    Johnny Wong

    @JohnnyWong Gracias por la actualización. Inicialmente fue rechazado por los revisores, pero he comprobado el código, y (como era de esperar) funciona para gvimy vim.
    Kirill Bulygin

    1
    Respuesta brillante, esto es exactamente lo que necesitaba para capturar espacios estrechos que no se rompen (Hex 202f) que no se procesan en Safari y Firefox.
    Chris Kobrzak

    4

    Podrías usar

    :set list
    

    para ver realmente la estructura de una línea. Verá pestañas y nuevas líneas explícitamente. Cuando ves un espacio en blanco, es realmente un espacio en blanco.


    3

    resaltar búsqueda

    :set hlsearch 
    

    en .vimrc eso es

    y busque pestañas espaciales y retornos de carro

    / \|\t\|\r
    

    o buscar todos los espacios en blanco

    /\s
    

    de búsqueda de todos los caracteres que no sean espacios en blanco (no se muestran los espacios en blanco, por lo que puede ver los espacios en blanco entre palabras, pero no los caracteres en blanco)

    /\S
    

    para mostrar todos los caracteres de espacio en blanco al final de la línea

    /\s$
    

    3

    Mantenga esos hacks en .vimrc como comentarios, así que en el shell, simplemente:

    echo '
      " how-to see the non-visible while spaces
      " :set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
      " set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
      " :set list
      " but hei how-to unset the visible tabs ?!
      " :set nolist
      ' >> ~/.vimrc
    

    1
    :se list
    :se nolist
    

    :sees suficiente, :setno es necesario


    1

    También puede resaltar los espacios (reemplazando los espacios con un bloque):

    :%s/ /█/g
    

    (antes de escribir deshacerlo)


    1

    Agregar esto a mi .vimrc funciona para mí. Solo asegúrate de no tener nada más conflictivo.

    autocmd VimEnter * :syn match space /\s/
    autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black
    
    Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
    Licensed under cc by-sa 3.0 with attribution required.