it-swarm.com.ru

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

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

712
Matt

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

:set list

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

:set listchars=...

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

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

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

:set list

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

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

:help listchars

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

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

:set list для включения.

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

240
Marcin

Начиная с патча 7.4.71 теперь вы можете установить символ для отображения вместо пробела с помощью списков символов!

:set listchars+=space:␣

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

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

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

232
Brett Y

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

:syntax on
:set syntax=whitespace

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

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

174
Eliot

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

86
Ether

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

: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 после установки схемы цветов.

73
mrucci

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

: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 autocommand. (Я не проверял, какой из них на самом деле работает).

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

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

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

45
Christian Brabandt

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

/\s
:set hlsearch

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

30
Benedikt Köppel

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

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

:%s/ /█/g

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

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

22
Randy Morris

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

/ <Пробел>

Заметки:

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

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

      /[<Пробел> <табуляция>]

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

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

  • 16
    vimmer

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

    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 на нескольких языках мешает отображению средней точки. Я не знаю (пока?), Как сделать это решение более надежным.

    14
    romainl

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

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

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

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

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

    11
    Wylie

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

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

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

    8
    chef

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

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

    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)
    • любой другой символ пробела выглядит красным
    5
    Kirill Bulygin
    :match CursorLine /\s\+/
    

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

    5
    ldrg

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

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

    vim-scripts/[email protected]

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

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

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

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

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

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

    :PluginInstall
    

    и там вы идете

    5
    albfan

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

    :set list
    

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

    4
    tangens

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

    :set hlsearch 
    

    в .vimrc то есть

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

    / \|\t\|\r
    

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

    /\s
    

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

    /\S
    

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

    /\s$
    
    3
    MichaelMoser

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

    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
    
    2
    Yordan Georgiev

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

    :%s/ /█/g
    

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

    1
    Federico Bucchi
    :se list
    :se nolist
    

    :se достаточно, :set не нужен.

    1
    sjas

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

    autocmd VimEnter * :syn match space /\s/
    autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black
    
    1
    jroot