Câu trả lời:
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 đã hlsearch
bậ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 0x00
và 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 \xFF
thay vì \x7F
sử 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ự []
.
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.
highlight
xá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
:
trước các lệnh trong vimrc của mình.
termbg
dườ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.
termbg
dườ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.
term
không thể có màu nền, trong khi thiết bị đầu cuối màu cterm
có thể.
Đố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]).
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
và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 if
tuyên bố ...
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 ...
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:]]/
:%s/[^[:alnum:][:punct:][:space:]]//gc
cái nổi bật đầu tiên, sau đó thay thế.
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
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 ERROR
trong tệp cú pháp màu của bạn. Đây là của tôi:hi Error guifg=Black guibg=Orange
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 zshComment
và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 :sy
và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>
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.
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-contains
phầ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
/[^\d0-\d127]