Я пытаюсь заставить 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