Заставить Vim показать ВСЕ пробелы как персонажа


772

Я не могу найти способ заставить Вима показать все пробелы как персонажа. Все, что я нашел, было о вкладках, пробелах и т. Д.


14
Я тоже пытаюсь решить именно эту проблему. Пожалуйста, если вы сталкиваетесь с этим, воздержитесь от повторного ответа :set list. Это не отвечает на наш вопрос. (Для других желающих: mrucci «s ответ ниже полезно, хотя и не вполне реальное решение .)
ELLIOTTCABLE

1
Для всех тех, кто говорит, что пробелы видны с, listи listcharsсчитает, что пробел идет сразу за вкладкой. Это было бы почти невидимым в этой ситуации. Я согласен, что вы можете поймать большинство ситуаций, но если было бы неплохо иметь правильное выделение всех пробелов.
Кевин Кокс

11
Для новых посетителей: это решается в новых версиях vim! См Brettanomyces «ы ответ ниже .
ELLIOTTCABLE

1
Связанный (но стек различий): vi.stackexchange.com/questions/422/…
Pureferret

Ответы:


693

Как уже говорили другие, вы могли бы использовать

:set list

который в сочетании с

:set listchars=...

отображать невидимые символы.
Теперь нет явной опции, которую вы можете использовать для отображения пробелов, но в списках символов вы можете настроить отображение символа для всего, НО пробелы. Например, мой выглядит так

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

так что теперь, после того, как вы используете

:set list

все, что явно не показано как что-то еще, на самом деле является простым старым пробелом.

Как обычно, чтобы понять, как listcharsработает, воспользуйтесь помощью. Он предоставляет отличную информацию о том, какие символы могут отображаться (например, конечный пробел) и как это сделать:

:help listchars

Возможно, было бы полезно добавить к нему переключатель, чтобы вы могли легко увидеть изменения в середине редактирования (источник: VIM: set list! Как переключатель в .vimrc ):

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

4
«Все, что явно не показано как что-то еще»? Попробуйте использовать юникодные пробелы из диапазона U + 2000..U + 200A. Если шрифт с фиксированной шириной поддерживает их, они будут отображаться как обычный пробел 0x20.
ZyX

2
@ZyX - я брал не весь Юникод, а довольно часто используемый набор символов. Если вы не удовлетворены ответом, не стесняйтесь предлагать улучшения.
Ладья

20
@ckarbass -: установить invlist
Ладья

Отличный совет! Я рекомендую поместить в файл строку set listchars.vimrc , чтобы можно было легко включить этот красивый способ отображения невидимых символов :set listв любое время (без повторного поиска этой страницы).
Мелебиус

8
@ckarbass Точно так же вы можете переключать что-либо в vim - добавляя! к концу. Так и получается: сет-лист!

275

Начиная с патча 7.4.710 , теперь вы можете установить символ для показа вместо пробела, используя listchars!

:set listchars+=space:␣

Таким образом, чтобы показать ВСЕ символы пробела в виде символа, вы можете сделать следующее:

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

Обсуждение в списке рассылки: https://groups.google.com/forum/?fromgroups#!topic/vim_dev/pjmW6wOZW_Q


2
Это довольно круто, но мне интересно, почему персонаж eol не окрашивается по-другому, в отличие от других.
CMCDragonkai

3
Я попробовал это и сначала получил ошибку. Оказалось, что «пробел» не был допустимым вариантом в немного более старой версии gvim, которую я использовал. Обновление моего gvim решило мою проблему. Для других, которые получают ошибку, напечатайте, :help listcharsчтобы проверить, является ли "пробел" допустимой опцией для "listchars". Если это не так, обновите vim до указанного патча @brettanomyces. Или просто оставьте «пробел» вне установленной команды, если вам не нужно видеть пробелы.
Нико Беллик

4
Я использую среднюю точку Unicode (U + 00B7) для пробела ( space:·), так как он выглядит как MS Word, Notepad ++ и т. Д.
Dinei,

1
@ user5359531 попробуйте <ctrl-v> u2334, чтобы ввести символ открытого поля Юникод (␣). См. Sanctum.geek.nz/arabesque/special-characters-in-vim для получения более подробной информации
Бретт Y

3
Введите <C-K>.MVIM для ·. Смотрите :h digraphподробности.
johnchen902

252

:set list включить.

:set nolist отключить.


11
Спасибо, что показали нам, как переключаться между режимами. Вы могли бы подумать, что другие продвинутые ответы научат этому.
Джонатан Комар

1
да, это полезно Хотелось бы, чтобы это был лучший ответ, так как я нашел этот ответ сам, только чтобы обнаружить, что он уже был на сайте, просто вне поля зрения.
Ejoso

8
: set list!лучше :)
Skippr

@Skippr По какой мере? Это же количество нажатий клавиш, за исключением того, что Shiftи !оба сложнее , чем набрать no. Если вы помещаете это в свой .vimrc, я согласен, что форму с восклицательным знаком легче читать.
Дэн

7
@Dan Если вы хотите включить или выключить это устройство за относительно короткое время, :set list!вы сделаете это без необходимости входа nolist. !Просто делает противоположное тому, что бы ни в настоящее время устанавливается. Я использую это все время, особенно когда с :set paste!. Я ненавижу нажимать клавиши со стрелками, чтобы найти :set pasteили :set nopasteLOL
Skippr

188

Я думаю, что другие ответы здесь более полны, но я подумал, что поделюсь трюком, который я обычно использую для визуальной разграничения табуляции и пробелов:

:syntax on
:set syntax=whitespace

Это правила подсветки синтаксиса для языка программирования Whitespace - вкладки отображаются зеленым цветом, а пробелы - красным. :)

Может сочетаться с тем, :set listчто упоминалось во многих других ответах, хотя вкладки будут отображаться как ^ I без зеленого выделения, но пробелы будут отображаться красным цветом.


7
Мне нравится этот, он довольно умный, и чувствует себя как-то лучше, чем большинство других ответов. Хотя это не совсем то решение, которое можно использовать постоянно.
ComputerDruid

4
Я предпочитаю более общепринятые методы, но я добавляю +1 для изобретательности.
Сиэтс ван дер Молен

28
Я знал, что язык будет полезен для чего-то .
Дэн Бешард

1
Не возражаете против ссылки на файл синтаксиса .vim, который вы используете для выделения
SeldomNeedy

2
@SeldomNeedy Вам не нужно ничего скачивать, правила выделения пробелов поставляются с Vim уже много лет. По сути, они должны быть встроенными, если вы не используете странную или действительно старую версию Vim.
Элиот

91

:set listпокажет все пробелы как символ. Все, кроме пробела, будет выглядеть иначе, чем его нормальное состояние, а это означает, что если вы все еще видите простое старое пространство, это действительно простое старое пространство. :)


35
Отключите это с:set nolist
Грег K

6
Что если вы хотите увидеть символ пробела, как в Sublime Text 2 с включенным «показом пробела»? Я нашел это действительно полезным.
Olical

Не то, что я пришел сюда, но очень полезно. Спасибо.
Harperville

4
Также !в конце можно переключать опции без :set list!
baldrs

Я использую один лайнер, :se hls | /\_sдля этого. Получает все, тогда как set listигнорирует пробелы. Выкл снова с :se nohls. Подробности об этом в этом посте: albertech.blogspot.com/2015/02/…
jar

73

Если вы установите:

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

и затем выполните поиск пробела, каждый символ пробела будет показан как символ подчеркивания.

Вы можете использовать эту команду в удобной функции, которая переключает «подчеркивание» пробелов.

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

Сопоставьте функцию с сочетанием клавиш с помощью:

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

NB. Определите функцию в vimrc после того, как была установлена ​​схема цветов.


1
Ну, это что-то вроде хака, но пока оно ближе, чем все остальное. Награда присуждается! : D
ELLIOTTCABLE

45

В зависимости от ваших правил синтаксиса для текущего буфера, что-то вроде этого может работать:

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

Для этого нужен vim 7.3 с функцией + hide

Обновление 24.10.2014 Чтобы немного рассказать об этом. Конечно, можно определить выделение для скрытых символов.

  • Вы можете настроить, как выглядят скрытые символы. Для выделения вам нужно будет хотя бы один раз настроить группу подсветки «Скрыть» (см. Справку в разделе « :h hl-ConcealЭто можно сделать в вашей цветовой схеме», и тогда вам не нужно заново настраивать ее. Но это влияет на все скрытые символы (например, если ваш Синтаксический скрипт скрывает еще несколько элементов, они будут отображаться как символы пробела. Это может выглядеть так:

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

  • Кажется, есть особенность, что Vim не будет выделять пробелы, если синтаксический скрипт использует skipwhiteключевое слово. Обхода не будет (возможно, это будет исправлено, я выложил патч )

  • Кажется, что вокруг плавающий патч, который позволит настроить внешний вид пространства в listрежиме. Последний на момент написания, кажется, это . (Это означает, что вам нужно создать свой собственный Vim, чтобы использовать это).
  • conceallevelИ concealcursorявляются окна локальных параметров. Это означает, что они могут быть разными в разных окнах (и, возможно, будут также устанавливаться плагинами типов файлов или другими скриптами плагинов).
  • Группы подсветки синтаксиса должны выполняться всякий раз, когда файл определения синтаксиса перезагружается. Это может быть сделано с использованием BufWinEnterили, возможно, также Syntaxили даже FileTypeавтокоманды. (Я не проверял, какой из них на самом деле работает).

Два последних пункта означают, что вам нужно настроить некоторые автокоманды, которые сбрасывают правила синтаксиса и соответствующие опции. Для первого можно настроить подсветку с помощью ColorSchemeавтокоманды (чтобы скрытые символы всегда выглядели одинаково, независимо от того, какую цветовую схему на самом деле настраивает). Для полного решения посмотрите ответ romainl, который должен дать вам старт. Если вы настраиваете функцию, вы можете легко настроить команду переключения, чтобы включить или выключить отображение специальной подсветки.

Обновление 26.10.2014 Я сделал плагин из этого вопроса.

Обновление 22.04.2015 В Vim был включен патч, который делает это возможным с помощью этой listопции. Просто установите set list listchars+=space:␣ Это работает с Vim 7.4.711


Это прекрасно работает! Как это можно добавить .vimrc?
Эрик Мартиндейл

1
Так как это работает с текущим буфером, вам, вероятно, нужно обернуть это в автокоманду. BufEnter или даже синтаксическая автокоманда могут работать на вас:
Кристиан Брабандт

3
Æстранный выбор персонажа для этого, почему бы и нет ·?
Мариус Гедминас

1
Это на самом деле правильный ответ. Любые идеи о том, как добавить правильную подсветку синтаксиса для этого символа? Я бы предпочел, чтобы это было очень блекло ·
авиаудар

@ChristianBrabandt, у вас есть куча конечных файлов, связанных с nrrwrgn, загрязняющих ваше репо.
Ромен

31

Я использую это

/\s
:set hlsearch

выделить пробелы. Он ищет все пробелы, а затем позволяет выделению выделить их. Тем не менее, он не печатает специальный символ.


Самое простое решение imho. Великолепно в паре с командой очистить поиск (я пользуюсь nnoremap <leader><space> :noh<cr>)
Ленна

24

Если под пробелами вы подразумеваете символ '', мое предложение будет просто поиск / замена. Как другие намекают, set listизменения не являющихся печати символов на видимый символ , который настроен в listchars.

Чтобы явно показать пробелы как некоторые другие символы, нужно выполнить что-то похожее на приведенное ниже:

:%s/ /█/g

Затем просто отмените изменения, чтобы вернуться снова.

(чтобы получить █ я нажал эту точную последовательность клавиш: :%s/ /CTRL-KFB/g)


2
Мне нравится это лучше, чем другие ответы, это похоже на обратную :set list, меняя видимый символ («пробел») на _non priting_ (??). Интересно, можно ли использовать это внутри матча, например, :match MyBlackBlockChar "appropriate_regexэто должно сработать, не так ли?
Судхи

Другие ответы полезны, но это первый ответ, который на самом деле отвечает на вопрос OP +1
Alexx Roche

1
Или :%s/\s/█/gдля всего пробела. Кроме того, :set hlsearchплюс :&s/\s//gnможет быть полезным.

16

Чтобы выделить пробелы, просто найдите его:

/ <Пробел>

Ноты:

  • <пробел> означает просто ввести пробел.
  • Включить подсветку результатов поиска с помощью: set hlsearch

    Чтобы выделить пробелы и вкладки:

    / [<пробел> <tab>]

    Быстрый способ удалить блики - это поискать что-нибудь еще: / asdf

    (просто введите любой короткий список случайных символов)


  • 1
    Это так же, как ответ, опубликованный 3 года назад. Также: noh быстрее / asdf для невыделенного текста. Или вы можете даже установить f1 на: noh, учитывая, что вы, вероятно, будете часто его использовать.

    @DrEval Предполагая , что вы имеете в виду ответ BENEDIKT Коппел это на самом деле немного отличается /<space>против /\s. Я думаю, что это не очевидно и быстрее использовать предложение здесь.
    icc97

    14

    Код ниже основан на ответе Кристиана Брабандта и, кажется, делает то, что хочет ОП:

    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
    

    Добавьте эти строки к себе ~/.vimrcи начните новый сеанс Vim, чтобы увидеть все еще несовершенную магию.

    Не стесняйтесь редактировать цвета по умолчанию и скрывать персонажа.


    Предостережение: что-то в группе *FuncBodyсинтаксиса на нескольких языках мешает отображению средней точки. Я не знаю (пока?), Как сделать это решение более надежным.


    Вот что я имел в виду под «в зависимости от группы синтаксиса». Я подозреваю, что это проблема с ключевыми словами syn в сочетании с флагом skipwhite.
    Кристиан Брабандт

    @ChristianBrabandt, да, я не мог выйти за рамки того, что вы уже сделали, кроме как сделать это "автоматическим".
    Ромен

    1
    Да, это skipwhiteаргумент в правилах синтаксиса, который запрещает совпадение синтаксической группы (хотя она должна быть разрешена во всех группах).
    Кристиан Брабандт

    Есть ли способ сделать это хорошо с помощью Indent Guides , который добавляет фон для отступа? Я подозреваю, что это вопрос того, чтобы это не перекрывало цвет фона, но это, кажется, нетривиально.
    Майк

    Как отключить то же самое, когда подсветка пробелов не требуется? Ищете вид короткой команды переключения.
    yuvaeasy

    11

    Я был разочарован всеми другими ответами на этот вопрос, потому что ни один из них не выделяет символ пробела в полезной форме. Отображение пробелов в виде символов особенно полезно для языков с пробельными символами, где смешивание табуляции и пробелов вредно.

    Мое решение состоит в том, чтобы показать вкладки и подчеркнуть несколько пробелов. Он заимствован из ответа Мруччи и этого урока . Поскольку он использует подсветку синтаксиса, он постоянен:

    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 /  \+/
    

    Используя это, вкладки отображаются как |и пробелы как _, что позволяет очень легко определить, когда я смешиваю стили кода.

    Единственный недостаток, который я обнаружил, это то, что этот фрагмент не регулирует цвет фона в соответствии с контекстом (как в комментарии).


    8

    все ответы выше пытаются сделать пробелы видимыми изнутри vim. Если вы действительно настаиваете на наличии видимых пространств в виде точек, есть другой подход ...

    Если это невозможно сделать в vim, полностью измените ваш шрифт. Я скопировал шрифт Ubuntu One Mono и отредактировал его с помощью FontForge. Не забудьте изменить полное имя шрифта, семейство, предпочитаемое семейство, совместимое полное (в FontFoge оно находится под именами TTF в информации о шрифте), чтобы иметь его в качестве отдельного шрифта. Просто отредактируйте символ пробела, чтобы точка находилась посередине, и сохраните шрифт в ~ / .fonts. Теперь вы можете использовать его для своего gvim или всего терминала ... Я скопировал "!" символ, удалил линию и переместил точку в середину. Прошло чуть больше 5 минут ...

    Примечание: изменение символа пробела (0x20) приводит к неудобству наличия точек на всем экране vim ... (но это отделит пробелы от вкладок ...)


    2
    Это звучало как действительно хороший подход, пока я не прочитал заметку о заполнении всего экрана точками. : /
    Friederbluemle

    3
    Очки для творчества! :-)
    jpaugh

    7

    Я не нашел точно, что я хотел от существующих ответов. Код ниже выделит все пробелы ярко-красным. Просто добавьте следующее к вашему.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\+/
    

    избегает "вы должны искать пробелы, чтобы заставить их появляться", но afaict не может быть настроен на то, чтобы делать незаметные вещи с пробелами. CursorLine может быть любой выделенной группой, а в теме по умолчанию это обычное подчеркивание.


    Я не могу определить разницу между символами табуляции и пробелами, используя этот метод, что очень плохо, но мне нравится, что это одна строка.
    Руставоре

    5

    Мне нравится использовать специальные символы для отображения пробелов, это более понятно. Даже карта для переключения является ключевой функцией для быстрой проверки.

    Вы можете найти эти функции в старом скрипте vim, который не обновлялся с 2004 года:

    vim-scripts/cream-showinvisibles@vim.org

    Благодаря проекту vim-scripts и vundle вы можете оживить этот плагин

    ВИМ-скрипты / крем-showinvisibles @ GitHub

    Более того, мои два цента на этом - добавить настраиваемый ярлык (вместо предопределенного F4)

    так что добавьте это в ~ / .vimrc

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

    установить плагин на vim

    :PluginInstall
    

    и там вы идете


    5

    Чтобы покрыть пробельные символы Юникода:

    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]')
    

    Результат:

    • только ординальное пространство (U + 0020) выглядит как пробел (" ")
    • вкладка (U + 0009) выглядит как " │ " (два символа: длинная труба, а затем порядковый номер; они серого цвета colorscheme murphy)
    • нормальный неразрывный пробел (U + 00A0) выглядит как " ·" (один символ; он серого цвета colorscheme murphy)
    • любой другой символ пробела выглядит как красный " "

    1
    Отредактировано, чтобы добавить "ctermbg = Red", чтобы мой терминал работал на раскраску. Лично я использовал set listchars=tab:»\ ,space:·для вашей справки.
    Джонни Вонг

    @JohnnyWong Спасибо за обновление. Первоначально он был отклонен рецензентами, но я проверил код, и это (неудивительно) работает как для, так gvimи для vim.
    Кирилл Булыгин

    1
    Блестящий ответ, это именно то, что мне нужно для захвата узких неразрывных пробелов (Hex 202f), которые не отображаются в Safari и Firefox.
    Крис Кобжак,

    4

    Вы могли бы использовать

    :set list
    

    чтобы действительно увидеть структуру линии. Вы увидите вкладки и новые строки в явном виде. Когда вы видите пробел, это действительно пробел.


    3

    выделить поиск

    :set hlsearch 
    

    в .vimrcтом, что

    и искать пробелы и возврат каретки

    / \|\t\|\r
    

    или поиск всех пробельных символов

    /\s
    

    поиска всех непробельных символов (пробельные символы не отображаются, поэтому вы видите пробельные символы между словами, но не завершающие пробельные символы)

    /\S
    

    показать все завершающие пробелы - в конце строки

    /\s$
    

    3

    Сохраните эти хаки в .vimrc как комментарии, так что в оболочке просто:

    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

    Вы также можете выделить пробелы (заменив пробелы блоком):

    :%s/ /█/g
    

    (прежде чем писать отменить это)


    1

    Добавление этого в мой .vimrc работает для меня. Просто убедитесь, что у вас больше ничего не конфликтует ..

    autocmd VimEnter * :syn match space /\s/
    autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black
    
    Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
    Licensed under cc by-sa 3.0 with attribution required.