Làm cách nào để Vim làm nổi bật các nhân vật không phải là ascii?


152

Tôi đang cố gắng để Vim làm nổi bật các ký tự không phải ASCII. Có một cài đặt có sẵn, mẫu tìm kiếm regex hoặc plugin để làm như vậy không?

Câu trả lời:


290

Sử dụng phạm vi trong một []lớp ký tự trong tìm kiếm của bạn, bạn phải loại trừ phạm vi ký tự thập lục phân ASCII, do đó, đánh dấu (giả sử bạn đã hlsearchbật) tất cả các ký tự khác nằm ngoài phạm vi ASCII:

/[^\x00-\x7F]

Điều này sẽ thực hiện một kết hợp phủ định (thông qua [^]) cho các ký tự giữa ASCII 0x00và ASCII 0x7F(0-127) và dường như hoạt động trong thử nghiệm đơn giản của tôi. Tất nhiên, đối với ASCII mở rộng, mở rộng phạm vi lên \xFFthay vì \x7Fsử dụng /[^\x00-\xFF].

Bạn cũng có thể biểu thị nó dưới dạng thập phân qua \d:

/[^\d0-\d127]

Nếu bạn cần một cái gì đó cụ thể hơn, như loại trừ các ký tự không in được, bạn sẽ cần thêm các phạm vi đó vào lớp ký tự [].


14
Trong phần thập phân:/[^\d0-\d127]
Bohr

@Bohr Đó là một bổ sung tốt đẹp. Tôi sẽ chỉnh sửa nó ở trên.
Michael Berkowski

tuyệt quá! Đã cứu sống ngày! một trong những nhân vật thụt đầu dòng đã dán vào mã trăn của tôi và lỗi unicode bắt đầu giết chết tôi. thật khó để phát hiện trong số các nhân vật được sử dụng bởi vim plugin!
kollery

36

Có, có một tính năng gốc để làm nổi bật cho bất kỳ chuỗi phù hợp. Bên trong Vim, làm:

:help highlight
:help syn-match

syn-matchđịnh nghĩa một chuỗi khớp với một nhóm. highlightxác định màu sắc được sử dụng bởi nhóm. Chỉ cần nghĩ về đánh dấu cú pháp cho các tệp vimrc của bạn.

Vì vậy, bạn có thể sử dụng các lệnh dưới đây trong tệp .vimrc của mình:

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

bạn không cần đặt :trước các lệnh trong vimrc của mình.
FDinoff

termbgdường như không phải là một lệnh hợp pháp trong VIM 7.3 như được cài đặt trên Ubuntu Server 12.10.
dotancohen

4
Sau đó, termbgdường như không phải là một tham số hợp pháp trong VIM 7.3 như được cài đặt trên Ubuntu Server 12.10.
dotancohen

Thật vậy, thiết bị đầu cuối thông thường termkhông thể có màu nền, trong khi thiết bị đầu cuối màu ctermcó thể.
Dima Tisnek

đã loại bỏ termbg nhưng bạn có thể thêm ctermfg, guifg, v.v để kiểm soát tiền cảnh.
fatal_error

16

Đối với những người khác (từ bây giờ trở nên ít may mắn hơn) kết thúc ở đây thông qua một công cụ tìm kiếm và không thể thực hiện làm nổi bật các ký tự không phải ASCII, hãy thử điều này (đưa điều này vào .vimrc của bạn):

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

Điều này có thêm lợi ích của việc không va chạm với các định nghĩa cú pháp thông thường (filetype [phần mở rộng tệp]).


Tôi nhận được E319: Sorry, the command is not available in this version: au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continueLinux mint 17.3
Nasser

3
Mặc dù mục tiêu được tuyên bố là không xung đột với các định nghĩa cú pháp đã được xác định, nhưng nếu bạn muốn nó, bạn có thể thêm containedin=ALLvào cuối dòng cuối cùng, thực hiện nó au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL. Tôi thấy sự mất tập trung đáng giá (khi unicode được cho phép), câu trả lời ban đầu ở đây không bắt được những thứ như mã không phải mã ascii bên trong một iftuyên bố ...
svenevs

1
Sẽ luôn an toàn hơn khi gửi bạn autocmd BufRead ....trong một nhóm tự động trong vim, trừ khi bạn có lý do rất chính đáng để không ...
Cbhihe

6

Regex này hoạt động là tốt. Đó là lần truy cập google đầu tiên cho "vim xóa các ký tự không phải ascii" khỏi briceolion.com và với :set hlsearchý chí nổi bật:

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

1
Câu hỏi là yêu cầu làm nổi bật các ký tự không phải ascii, không loại bỏ chúng .
chutsu

1
Cảm ơn đã chỉ ra rằng, tôi đã chỉnh sửa câu trả lời của mình. Thật khó để thấy rằng regex này cũng trả lời câu hỏi theo cách khác với các câu trả lời khác. Câu trả lời ban đầu của tôi là :%s/[^[:alnum:][:punct:][:space:]]//gccái nổi bật đầu tiên, sau đó thay thế.
Grant Bowman

4

Nếu bạn cũng quan tâm đến các ký tự không in được, hãy sử dụng ký tự này:/[^\x00-\xff]/

Tôi sử dụng nó trong một chức năng:

 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

Chức năng của bạn không hoạt động ở đây, nó không làm nổi bật và nó cũng làm rối mã hóa. Tại sao bạn thay đổi mã hóa cục bộ?
Werner

Hãy cố gắng thay đổi encđể fenc. Tôi đã thay đổi mã hóa vì mã hóa mặc định của tôi là (là vào năm 2013) latin1. Hàm không làm nổi bật các ký tự không in được nếu ký tự là latin1. Quá thấy phần tô sáng bạn phải có khóa ERRORtrong tệp cú pháp màu của bạn. Đây là của tôi:hi Error guifg=Black guibg=Orange
Reman

2

Dựa trên các câu trả lời khác về chủ đề này và câu trả lời tôi nhận được ở đây, tôi đã thêm nó vào đây .vimrc, để tôi có thể kiểm soát phần tô sáng không phải bằng cách gõ <C-w>1. Nó cũng hiển thị bên trong các bình luận, mặc dù bạn sẽ cần thêm nhóm bình luận cho mỗi cú pháp tệp bạn sẽ sử dụng. Đó là, nếu bạn sẽ chỉnh sửa tệp zsh, bạn sẽ cần thêm zshCommentvào dòng

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

nếu không, nó sẽ không hiển thị ký tự không phải mã ascii (bạn cũng có thể đặt chứainin = TẤT CẢ nếu bạn muốn chắc chắn hiển thị các ký tự không phải mã ascii trong tất cả các nhóm). Để kiểm tra cách nhận xét được gọi trên một loại tệp khác, hãy mở tệp thuộc loại mong muốn và nhập :syvào vim, sau đó tìm kiếm trên các mục cú pháp cho nhận xét.

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

Bằng cách nào đó không có câu trả lời trên làm việc cho tôi.

Vì vậy, tôi đã sử dụng :1,$ s/[^0-9a-zA-Z,-_\.]//g

Nó giữ hầu hết các nhân vật tôi quan tâm.


1
Điều này xóa các ký tự, trong đó op yêu cầu làm nổi bật .
Bernhard Wagner

ý bạn không phải là [^ 0-9a-zA-Z, \ -_ \.], tức là \ -?
ben26941

0

Ai đó đã trả lời câu hỏi. Tuy nhiên, đối với những người khác vẫn đang gặp vấn đề, đây là một giải pháp khác để làm nổi bật các ký tự không phải là ascii trong các bình luận (hoặc bất kỳ nhóm cú pháp nào trong vấn đề này). Nó không phải là tốt nhất, nhưng nó là một sửa chữa tạm thời.

Người ta có thể thử:

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

Điều này có các phần trộn từ các giải pháp khác. Bạn có thể loại bỏ contained, nhưng, từ tài liệu, có thể có vấn đề tiềm ẩn về việc đệ quy chính nó (theo tôi hiểu). Để xem các mẫu được xác định khác, syn-containsphần sẽ chứa nó.

:help syn-containedin
:help syn-contains 

Vấn đề được nhân rộng từ: Đặt mục thành mức độ ưu tiên nổi bật cao hơn trên vim

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.