Зробити Vim показати ВСІ білі пробіли як персонаж


772

Я не можу знайти спосіб змусити Віма показати всі пробіли як персонаж. Все, що я знайшов, було про вкладки, пробіли тощо.


14
Я також намагаюся вирішити саме цю проблему. Якщо ви натрапите на це, утримайтеся від чергової відповіді :set list. Це не відповідає на наше запитання. (Іншим бажаючим: відповідь mrucci нижче корисна, хоча і не зовсім реальне рішення .)
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: встановити список! Як перемикання у .vimrc ):

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

4
"Все, що явно не відображається як щось інше"? Спробуйте простори Unicode з діапазону U + 2000..U + 200A. Якщо шрифт фіксованої ширини підтримує їх, вони відображатимуться як звичайний простір 0x20.
ZyX

2
@ZyX - Я брав не весь Unicode, а досить поширений набір символів. Якщо ви не задоволені відповіддю, не соромтеся запропонувати поліпшення.
Грак

20
@ckarbass -: встановити запрошений список
Rook

Чудова порада! Я рекомендую помістити у файл рядок встановлених списків.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
Це досить круто, але мені цікаво, чому персонаж еолу не розфарбовується інакше, на відміну від інших.
CMCDragonkai

3
Я спробував це і спершу отримав помилку. Виявилося, що "пробіл" не був дійсним варіантом у трохи старшій версії gvim, яку я використовував. Оновлення мого gvim вирішило мою проблему. Для інших, хто отримує помилку, введіть, :help listcharsщоб перевірити, чи "пробіл" є дійсним параметром для "списків". Якщо це не так, оновіть vim до вказаного патча @brettanomyces. Або просто залиште "пробіл" поза встановленою командою, якщо вам не байдуже бачити пробіли.
Ніко Белік

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

1
@ user5359531 спробуйте <ctrl-v> u2334 ввести символ відкритого поля unicode (␣). Дивіться sanctum.geek.nz/arabesque/special-characters-in-vim для більш детальної інформації
Brett 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

187

Я думаю, що інші відповіді тут є більш вичерпними, але я подумав, що поділюсь трюком, який зазвичай використовую для візуальної диференціації вкладок і пробілів:

:syntax on
:set syntax=whitespace

Це правила виділення синтаксису для мови програмування Whitespace - вкладки відображаються зеленим кольором, а пробіли - червоним кольором. :)

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


7
Мені подобається цей, він досить розумний і почуває себе якось краще, ніж більшість інших відповідей. Насправді це рішення, яке не можна використовувати весь час, хоча.
ComputerDruid

4
Я віддаю перевагу більш звичайним методам, але я + 1'ю це для винахідливості.
Sietse van der Molen

27
Я знав, що мова для чогось буде корисною .
Ден Бешард

1
Ви не проти посилання на файл синтаксису .vim, який ви використовуєте для виділення
SeldomNeedy

2
@SeldomNeedy вам не потрібно буде нічого завантажувати, правила виділення пробілів пропускаються з Vim роками. Вони по суті повинні бути вбудованими, якщо ви не використовуєте дивну або справді стару версію Vim.
Еліот

91

:set listпокаже всі пробіли як персонаж. Все, крім простору, буде виглядати інакше, ніж його звичайний стан, а це означає, що якщо ви все-таки бачите звичайний старий простір, це справді звичайний простір. :)


35
Вимкніть це назад:set nolist
Грег К

6
Що робити, якщо ви хочете бачити пробільний символ, як, наприклад, у Sublime Text 2 із "указом пробілів"? Я вважаю це дійсно корисним.
Оликал

Не те, за що я прийшов сюди, але дуже корисний. Дякую.
harperville

4
Також !в кінці можна змінити параметри з не :set list!
лисини

Я використовую :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>

Примітка: Визначте функцію vimrc після встановлення схеми кольорів.


1
Ну, це трохи хак, але це ближче, ніж усе інше до цих пір. Бонус нагороджений! : D
ELLIOTTCABLE

45

Залежно від ваших правил синтаксису для поточного буфера, щось подібне може працювати:

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

Для цього потрібен vim 7.3 з функцією + приховати

Оновіть 24.10.2014, щоб трохи розширити це. Звичайно, можна визначити деяке виділення для конізованих символів.

  • Ви можете налаштувати, як виглядають приховані символи. Для виділення вам доведеться хоча б раз налаштувати групу виділення "Conceal" (Дивіться довідку за адресою :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, що забруднюють ваше репо.
romainl

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що має робити трюк, чи не так?
Суді

Інші відповіді корисні, але це перша, яка насправді відповідає на питання ОП +1
Alexx Roche

1
Або :%s/\s/█/gдля всього пробілу. Також :set hlsearchплюс :&s/\s//gnможе бути корисним.

16

Щоб виділити пробіли, просто знайдіть його:

/ <пробіл>

Примітки:

  • <пробіл> означає просто ввести пробільний символ.
  • Увімкніть підсвічування результатів пошуку за допомогою: встановити hlsearch

    Щоб виділити пробіли та вкладки:

    / [<pace> <tab>]

    Швидкий спосіб усунути основні моменти - це пошук будь-чого іншого: / asdf

    (просто введіть будь-який короткий список випадкових символів)


  • 1
    Це те саме, що відповідь, опублікована 3 роками раніше. Також: noh швидше, ніж / asdf для неяскравого освітлення тексту. Або ви навіть можете встановити для f1 значення: ні, враховуючи, що ви, ймовірно, будете ним часто користуватися.

    @DrEval Припускаючи, що ви маєте на увазі відповідь Бенедікт Кьоппель, це насправді тонко інше /<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, щоб побачити, як все ще відбувається недосконала магія.

    Не соромтесь редагувати кольори за замовчуванням та приховувати характер.


    Caveat: щось із *FuncBodyгрупи синтаксису кількома мовами заважає показувати середню крапку. Я не знаю (ще?), Як зробити це рішення більш надійним.


    Це те, що я мав на увазі під "залежно від групи синтаксису", я підозрюю, що це проблема із синхронними ключовими словами в поєднанні зі прапором skipwhite.
    Крістіан Брабандт

    @ChristianBrabandt, так, я не міг вийти за рамки того, що ви вже робили, окрім того, щоб зробити його "автоматичним".
    romainl

    1
    Так, саме skipwhiteаргумент у синтаксичних правилах перешкоджає збігу синтаксичної групи (хоча слід дозволити містити її у всіх групах).
    Крістіан Брабандт

    Чи є спосіб зробити цю роботу чудово за допомогою посібників з відступами, що додає тло відступу? Я підозрюю, що справа в тому, щоб це не змінило колір фону, але це здається нетривіальним.
    Майк

    Як відключити те саме, коли виділення білого простору не потрібно? Шукаєте якусь коротку команду перемикання.
    yuvaeasy

    11

    Я був розчарований усіма іншими відповідями на це питання, тому що жодна з них корисно не висвітлює космічний персонаж. Показ пробілів як символів особливо допоможе для мов, що форматують пробіли, де змішування вкладок та пробілів є шкідливим.

    Моє рішення - показати вкладки та підкреслити кілька пробілів. Він запозичує відповідь mrucci і цей підручник . Оскільки він використовує підсвічування синтаксису, він є стійким:

    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 Names в інформації про шрифт), щоб мати його як окремий шрифт. Просто відредагуйте пробіл, щоб мати крапку посередині, і зберегти шрифт у ~ / .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 може бути будь-якою групою hilighting, і в темі за замовчуванням це просте підкреслення.


    Я не можу визначити різницю між вкладками та пробілами за допомогою цього методу, що дуже погано, але мені подобається, що це один вкладиш.
    Rustavore

    5

    Мені подобається використовувати спеціальні символи для показу пробілів, це більш зрозуміло. Навіть карта для перемикання - ключова особливість, для швидкої перевірки.

    Ви можете знайти ці функції в старому скрипті vim, не оновленому з 2004 року:

    vim-scripts/cream-showinvisibles@vim.org

    Завдяки проектним vim-скриптам і vundle ви зможете оживити цей плагін

    vim-script / cream-showinvisibles @ github

    Ще краще, мої два центи на цьому - додати налаштований ярлик (замість попередньо визначеного F4)

    тому додайте це до ~ / .vimrc

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

    встановити плагін на vim

    :PluginInstall
    

    і там ти йдеш


    5

    Щоб охопити символи пробілів 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]')
    

    Результат:

    • тільки порядковий простір (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$
    

    2

    Залишайте ці хаки в .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.