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

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

변경 시도 enc에 fenc. 기본 인코딩은 (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.