Як змусити 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.