Как заставить 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]
Бор

@ Бор Это хорошее дополнение. Я отредактирую это выше.
Майкл Берковски

здорово! спас день! один из символов отступа был вставлен в мой код Python, и ошибка Юникода начала убивать меня. было трудно обнаружить среди того же персонажа, что и плагин vim!
коллеры

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может.
Дима Тиснек

удален термин, но вы можете добавить 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 continueLinux Mint 17,3
Насер

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

1
Всегда безопаснее заключить вашу autocmd BufRead ....группу в vim, если у вас нет веских причин не ...
Cbhihe

6

Это регулярное выражение работает также. Это был первый хит Google для "vim удалить не-ascii персонажей" с briceolion.com, и он :set hlsearchвыделит:

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

1
Вопрос состоит в том, чтобы выделить не-ascii символы, а не удалять их .
Чуцу

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. Функция не выделяет непечатаемые символы, если набор символов - латинский. Чтобы увидеть выделение, у вас должен быть ключ ERRORв файле цветового синтаксиса. Это мое:hi Error guifg=Black guibg=Orange
Реман

2

Основываясь на других ответах на эту тему и ответе, который я получил здесь, я добавил это к своему .vimrc, чтобы я мог контролировать подсветку не-ascii, печатая <C-w>1. Он также показывает внутренние комментарии, хотя вам нужно будет добавить группу комментариев для каждого синтаксиса файла, который вы будете использовать. То есть, если вы отредактируете файл zsh, вам нужно будет добавить zshCommentв строку

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

в противном случае он не будет отображать символы, отличные от ascii (вы также можете установить в составеinsin = ALL, если вы хотите, чтобы символы, не входящие в 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

Кто-то уже ответил на вопрос. Однако для других, у которых все еще есть проблемы, здесь есть другое решение, чтобы выделить не-ascii символы в комментариях (или любую синтаксическую группу в этом вопросе). Это не самое лучшее, но это временное исправление.

Можно попробовать:

: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.