Vim이 ASCII가 아닌 문자를 강조 표시하는 방법?


153

Vim이 ASCII가 아닌 문자를 강조 표시하도록하려고합니다. 사용 가능한 설정, 정규식 검색 패턴 또는 플러그인이 있습니까?

답변:


291

[]검색에서 문자 클래스의 범위를 사용 하면 ASCII 16 진 문자 범위 를 제외 할 수 있어야 하므로 ASCII 범위 밖에 있는 hlsearch다른 모든 문자를 강조 표시 ( 활성화 한 것으로 가정 )해야 합니다.

/[^\x00-\x7F]

이것은 ASCII 와 ASCII (0-127) 사이의 문자에 대해 (-를 통해 ) 음의 일치 를 수행하며 간단한 테스트에서 작동하는 것으로 보입니다. 물론 확장 ASCII의 경우을 사용 하는 대신 범위를 확장하십시오 .[^]0x000x7F\xFF\x7F/[^\x00-\xFF]

다음을 통해 십진수로 표현할 수도 있습니다 \d.

/[^\d0-\d127]

인쇄 할 수없는 문자 제외와 같이보다 구체적인 내용이 필요한 경우 해당 범위를 문자 클래스에 추가해야합니다 [].


14
십진수 :/[^\d0-\d127]
Bohr

@Bohr 멋진 추가 기능입니다. 위에서 편집하겠습니다.
Michael Berkowski

큰! 하루를 구했다! 들여 쓰기 문자 중 하나가 내 파이썬 코드에 붙여졌고 유니 코드 오류가 나를 죽이기 시작합니다. 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 2016 년

termbgUbuntu Server 12.10에 설치된 VIM 7.3에서는 올바른 명령으로 보이지 않습니다.
dotancohen 2016 년

4
그런 다음 termbgUbuntu Server 12.10에 설치된 VIM 7.3에서 올바른 매개 변수가 아닌 것 같습니다.
dotancohen

실제로 일반 터미널 term은 배경색을 가질 수 없지만 컬러 터미널 cterm은 배경색을 가질 수 없습니다 .
Dima Tisnek

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리눅스 민트 17.3
나세르

3
목표는 이미 정의 된 구문 정의와 충돌 하지 않는 것으로 명시되어 있지만 원하는 경우 containedin=ALL마지막 줄의 끝에 추가 하여 만들 수 au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL있습니다. 나는 (유니 코드이 허용되는) 신연 가치가 원래의 대답은 여기 않는 것을 발견 하지 이러한 비 아스키 코드 내부와 같은 것들을 잡아 if... 문
svenevs

1
autocmd BufRead ....아주 좋은 이유가 없다면 vim에서 자동 그룹 으로 묶는 것이 항상 더 안전합니다 .
Cbhihe

6

이 정규식도 작동합니다. 그것은 briceolion.com 에서 "비 ASCII 문자를 제거하는 Vim 제거"에 대한 Google의 첫 번째 히트 였으며 다음 과 같이 :set hlsearch강조 표시됩니다.

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

1
문제는 비 ASCII 문자 를 강조 표시하고 지우지 말고 강조 하는 것 입니다.
chutsu

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

귀하의 기능은 여기에서 작동하지 않으며 강조 표시되지 않으며 인코딩도 엉망입니다. 로컬 인코딩을 변경하는 이유는 무엇입니까?
베르너

변경 시도 encfenc. 기본 인코딩은 (2013 년) latin1이므로 인코딩을 변경했습니다. 문자 집합이 latin1 인 경우이 기능은 인쇄 할 수없는 문자를 강조 표시하지 않습니다. ERROR색상 구문 파일에 키 가 있어야 강조 표시가 너무 보입니다 . 이것은 나의 것입니다 :hi Error guifg=Black guibg=Orange
Reman

2

이 주제에 대한 다른 답변과 여기에 얻은 답변을 기반으로 이것을 내에 추가 .vimrc했으므로을 입력하여 비 ASCII 강조 표시를 제어 할 수 있습니다 <C-w>1. 사용할 각 파일 구문에 대해 주석 그룹을 추가해야하지만 내부 주석도 표시됩니다. 즉, zsh 파일을 편집 zshComment하려면 줄 에 추가 해야합니다.

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

그렇지 않으면 ASCII가 아닌 문자가 표시되지 않습니다 (모든 그룹에 ASCII가 아닌 문자를 표시하려면 containsin = ALL을 설정할 수도 있음). 다른 파일 유형에서 주석이 호출되는 방식을 확인하려면 원하는 유형의 파일을 열고 :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
그러면 op가 강조 표시 하도록 요청한 문자가 삭제됩니다 .
베른 하르트 바그너

[^ 0-9a-zA-Z, \ -_ \.], 즉 \-?
ben26941

0

누군가 이미 질문에 대답했습니다. 그러나 여전히 문제가있는 다른 사람들을 위해 주석에 ASCII가 아닌 문자를 강조 표시하는 다른 솔루션이 있습니다 (또는 문제의 구문 그룹). 최고는 아니지만 일시적인 수정입니다.

시도해 볼 수 있습니다 :

:syntax match nonascii "[^\u0000-\u007F]" containedin=ALL contained |
            \ highlight nonascii ctermfg=yellow guifg=yellow

여기에는 다른 솔루션의 혼합 부품이 있습니다. 을 제거 할 수는 contained있지만 문서에서 재발의 잠재적 인 문제가있을 수 있습니다 (내가 이해하는 것처럼). 정의 된 다른 패턴을 보려면 syn-containssection에 해당 패턴 이 포함됩니다.

:help syn-containedin
:help syn-contains 

vim 에서 복제 된 문제 : vim에서 항목을 높은 우선 순위로 설정

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.