Як змусити Vim виділити символи, що не належать до "ascii"?


153

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

Відповіді:


291

Використовуючи діапазон у []класі символів у вашому пошуку, ви повинні мати можливість виключити шістнадцятковий діапазон символів ASCII, тому виділяючи (якщо ви hlsearchввімкнули) всі інші символи, що лежать поза діапазоном ASCII:

/[^\x00-\x7F]

Це призведе до негативного збігу (через [^]) для символів між ASCII 0x00та ASCII 0x7F(0-127), і, здається, працює в моєму простому тесті. Для розширеного ASCII, звичайно, розширити діапазон до, \xFFа не \x7Fвикористовувати /[^\x00-\xFF].

Ви також можете виразити це у десятковій формі за допомогою \d:

/[^\d0-\d127]

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


14
Десятково:/[^\d0-\d127]
— Бор

@Bohr Це приємне доповнення. Я відредагую це вище.
— Майкл Берковський

чудово! врятував день! один із відступів символу потрапив у мій код python, і помилка Unicode почала мене вбивати. важко було виявити серед того самого символу, який використовував плагін vim!
— kollery

36

Так, є основна функція, щоб зробити підсвічування для будь-яких відповідних рядків. Всередині Vim зробіть:

:help highlight
:help syn-match

syn-matchвизначає рядок, що збігається з групою. highlightвизначає колір, який використовується групою. Подумайте лише про підсвічування синтаксису для файлів vimrc.

Отже, ви можете використовувати команди нижче у файлі .vimrc:

syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2

вам не потрібно ставити :перед командами у своєму vimrc.
— FDinoff

termbgне здається, що це легальна команда у VIM 7.3, встановлений на Ubuntu Server 12.10.
— dotancohen

4
Тоді termbg, здається, не є юридичним параметром у VIM 7.3, встановленому на Ubuntu Server 12.10.
— dotancohen

Дійсно, звичайний термінал termне може мати колір фону, тоді як кольоровий термінал ctermможе.
— Діма Тиснек

видалено termbg, але ви можете додати ctermfg, guifg тощо, щоб також контролювати передній план.
— fatal_error

16

Для інших (відтепер менш нещасних) людей, які закінчуються тут за допомогою пошукової системи, і не вдається здійснити виділення символів, що не належать до ASCII, спробуйте це (вставте це у свій .vimrc):

highlight nonascii guibg=Red ctermbg=1 term=standout
au BufReadPost * syntax match nonascii "[^\u0000-\u007F]"

Це має додаткову перевагу в тому, що не стикаються з регулярними (синтаксисними) визначеннями синтаксису (тип файлу [розширення файлу]).


Я отримую E319: Sorry, the command is not available in this version: au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continueмонетний двір Linux 17.3
— Насер

3
Хоча зазначено, що мета не суперечить уже визначеним синтаксичним визначенням, якщо ви цього хочете, ви можете додати containedin=ALLїх до кінця останнього рядка au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL. Я знаходжу відволікання цінність його (коли юнікод дозволений), оригінальну відповідь тут нічого НЕ зловити такі речі, що не-ASCII код внутрішньої частини ifзаяви ...
— svenevs

1
Завжди безпечніше вкладати свої дані autocmd BufRead ....в автогрупу in vim, якщо у вас немає дуже вагомих причин не ...
— Cbhihe

6

Цей регекс також працює. Це був перший хіт google для "vim remove non-ascii символів" з briceolion.com і з :set hlsearchпідсвічуванням:

/[^[:alnum:][:punct:][:space:]]/

1
Питання полягає в тому, щоб попросити виділити символи, що не мають права , не видаляючи їх .
— чуцу

1
Дякую, що вказали на це, я відредагував свою відповідь. Не дуже сильно було бачити, що цей регулярний вираз також відповідає на питання таким чином, який відрізняється від інших відповідей. Моя оригінальна відповідь: :%s/[^[:alnum:][:punct:][:space:]]//gcяка спочатку висвітлює, а потім замінює.
— Грант Боуман

4

Якщо вас також цікавлять символи, що не друкуються, використовуйте цей:/[^\x00-\xff]/

Я використовую його у функції:

 function! NonPrintable()
   setlocal enc=utf8
   if search('[^\x00-\xff]') != 0
     call matchadd('Error', '[^\x00-\xff]')
     echo 'Non printable characters in text'
   else
     setlocal enc=latin1
     echo 'All characters are printable'
   endif
 endfunction

Ваша функція не працює тут, вона не виділяється, і вона також порушує кодування. Чому ви змінюєте локальне кодування?
— Вернер

Спробуйте змінити encна fenc. Я змінив кодування, тому що моє кодування за замовчуванням є (було в 2013 році) latin1. Функція не виділяє символи, що не друкуються, якщо набір символів є латинським1. Занадто бачити підсвічування, ви повинні мати ключ ERRORу вашому файлі синтаксису кольорів. Це моє:hi Error guifg=Black guibg=Orange
— Реман

2

Виходячи з інших відповідей на цю тему та відповіді, яку я отримав тут, я додав це до свого .vimrc, щоб я міг керувати виділенням без ассізії, набравши текст <C-w>1. Він також показує внутрішні коментарі, хоча вам потрібно буде додати групу коментарів до кожного використовуваного вами синтаксису файлів. Тобто, якщо ви відредагуєте zsh-файл, вам потрібно буде додати zshCommentдо рядка

au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment

в іншому випадку він не відображатиме символи, що не містять ascii (ви також можете встановити містити = ALL, якщо ви хочете бути впевненим, щоб показувати символи non-ascii у всіх групах). Щоб перевірити, як викликається коментар іншого типу файлу, відкрийте файл потрібного типу та введіть :syvim, а потім шукайте коментарі у синтаксисі.

function HighlightNonAsciiOff()
  echom "Setting non-ascii highlight off"
  syn clear nonascii
  let g:is_non_ascii_on=0
  augroup HighlightUnicode
  autocmd!
  augroup end
endfunction

function HighlightNonAsciiOn()
  echom "Setting non-ascii highlight on"
  augroup HighlightUnicode
  autocmd!
  autocmd ColorScheme *
        \ syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment |
        \ highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline
  augroup end
  silent doautocmd HighlightUnicode ColorScheme
  let g:is_non_ascii_on=1
endfunction

function ToggleHighlightNonascii()
  if g:is_non_ascii_on == 1
    call HighlightNonAsciiOff()
  else
    call HighlightNonAsciiOn()
  endif
endfunction

silent! call HighlightNonAsciiOn()
nnoremap <C-w>1 :call ToggleHighlightNonascii()<CR>

1

Якось жоден із вищезазначених відповідей не працював на мене.

Так я і використовував :1,$ s/[^0-9a-zA-Z,-_\.]//g

Він зберігає більшість персонажів, які мене цікавлять.


1
Це видаляє символи, де оператор вимагає виділення .
— Бернхард Вагнер

ви не маєте на увазі [^ 0-9a-zA-Z, \ -_ \.], тобто \ -?
— ben26941

0

Хтось уже відповів на питання. Однак для інших, у яких все ще виникають проблеми, тут є ще одне рішення для виділення символів, які не належать до коментарів (або будь-якої групи синтаксису в питанні). Це не найкраще, але це тимчасове виправлення.

Можна спробувати:

:syntax match nonascii "[^\u0000-\u007F]" containedin=ALL contained |
            \ highlight nonascii ctermfg=yellow guifg=yellow

Це суміш деталей з інших розчинів. Ви можете видалити contained, але, з документації, може виникнути потенційна проблема повторного повторення (наскільки я розумію). Щоб переглянути інші визначені шаблони, syn-containsрозділ міститиме його.

:help syn-containedin
:help syn-contains 

Повторне питання з: Встановіть елемент на вищий пріоритет підкреслення на vim

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.