Как заставить Vim выделить символы без ascii?

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

Ответ 1

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

/[^\x00-\x7F]

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

Вы также можете выразить его в десятичном формате через \d:

/[^\d0-\d127]

Если вам нужно что-то более конкретное, например исключение непечатаемых символов, вам нужно будет добавить эти диапазоны в класс символов [].

Ответ 2

Да, есть встроенная функция для выделения выделенных строк. Внутри Vim выполните:

:help highlight
:help syn-match

syn-match определяет строку, которая соответствует падению в группу. highlight определяет цвет, используемый группой. Просто подумайте о подсветке синтаксиса для ваших файлов vimrc.

Поэтому вы можете использовать команды ниже в файле .vimrc:

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

Ответ 3

Для других (отныне менее неудачливых) людей, попадающих сюда с помощью поисковой системы и не могут выполнить выделение символов, отличных от ASCII, попробуйте это (поместите это в свой .vimrc):

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

Это имеет дополнительное преимущество: не сталкиваться с регулярными определениями синтаксиса на основе типа файла [file extension].

Ответ 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

Ответ 5

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

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

Ответ 6

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

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

в противном случае он не будет отображать символы, отличные от ascii (вы также можете установить в составеinsin = ALL, если вы хотите, чтобы символы, не входящие в ascii, отображались во всех группах). Чтобы проверить, как комментарий вызывается для файла другого типа, откройте файл нужного типа и введите :sy в vim, затем выполните поиск по элементам синтаксиса для комментария.

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>

Ответ 7

Как-то ни один из вышеперечисленных ответов не работал у меня.

Итак, я использовал :1,$ s/[^0-9a-zA-Z,-_\.]//g

Он хранит большинство моих персонажей.

Ответ 8

Кто-то уже ответил на вопрос. Тем не менее, для других, у которых все еще есть проблемы, вот еще одно решение выделить не-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