Ответы:
Используя диапазон в []
классе символов в своем поиске, вы должны иметь возможность исключить шестнадцатеричный диапазон символов ASCII, поэтому выделите (при условии, что вы hlsearch
включили) все остальные символы, лежащие вне диапазона ASCII:
/[^\x00-\x7F]
Это даст отрицательное совпадение (через [^]
) для символов между ASCII 0x00
и ASCII 0x7F
(0-127), и, похоже, будет работать в моем простом тесте. Для расширенного ASCII, конечно, расширить диапазон до \xFF
вместо \x7F
использования /[^\x00-\xFF]
.
Вы также можете выразить это в десятичном виде через \d
:
/[^\d0-\d127]
Если вам нужно что-то более конкретное, например, исключение непечатаемых символов, вам необходимо добавить эти диапазоны в класс символов []
.
Да, есть встроенная функция подсветки для любых совпадающих строк. Внутри Vim сделайте:
:help highlight
:help syn-match
syn-match
определяет строку, которая совпадает попадают в группу.
highlight
определяет цвет, используемый группой. Просто подумайте о подсветке синтаксиса для ваших файлов vimrc.
Таким образом, вы можете использовать следующие команды в вашем файле .vimrc:
syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2
:
перед командами в вашем vimrc.
termbg
не кажется допустимой командой в VIM 7.3, установленной на Ubuntu Server 12.10.
termbg
, похоже, не является допустимым параметром в VIM 7.3, установленном на Ubuntu Server 12.10.
term
не может иметь цвет фона, в то время как цветной терминал cterm
может.
Для других (отныне менее несчастливых) людей, попавших сюда через поисковую систему и не способных выделять символы, не входящие в 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 Mint 17,3
containedin=ALL
в конце последней строки, что делает его au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL
. Я считаю, что отвлечение внимания стоит (когда разрешен юникод), оригинальный ответ здесь не улавливает такие вещи, как не-ascii-код внутри if
оператора ...
autocmd BufRead ....
группу в vim, если у вас нет веских причин не ...
Это регулярное выражение работает также. Это был первый хит Google для "vim удалить не-ascii персонажей" с briceolion.com, и он :set hlsearch
выделит:
/[^[:alnum:][:punct:][:space:]]/
:%s/[^[:alnum:][:punct:][:space:]]//gc
который выдвигает на первый план сначала, затем заменяет.
Если вас интересуют также непечатные символы, используйте этот:/[^\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
Основываясь на других ответах на эту тему и ответе, который я получил здесь, я добавил это к своему .vimrc
, чтобы я мог контролировать подсветку не-ascii, печатая <C-w>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>
Так или иначе ни один из вышеупомянутых ответов не работал для меня.
Так что я использовал :1,$ s/[^0-9a-zA-Z,-_\.]//g
Он хранит большинство персонажей, которые меня интересуют.
Кто-то уже ответил на вопрос. Однако для других, у которых все еще есть проблемы, здесь есть другое решение, чтобы выделить не-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
/[^\d0-\d127]