วิธีรับ Vim เพื่อไฮไลต์อักขระที่ไม่ใช่ ASCII?


153

ฉันพยายามรับ Vim เพื่อเน้นอักขระที่ไม่ใช่ ASCII มีการตั้งค่ารูปแบบการค้นหา regex หรือปลั๊กอินที่ใช้ได้หรือไม่

คำตอบ:


291

การใช้ช่วงใน[]คลาสอักขระในการค้นหาของคุณคุณควรจะสามารถยกเว้นช่วงอักขระเลขฐานสิบหก ASCII ดังนั้นการเน้น (สมมติว่าคุณhlsearchเปิดใช้งาน) อักขระอื่นทั้งหมดที่อยู่นอกช่วง ASCII:

/[^\x00-\x7F]

สิ่งนี้จะทำการจับคู่เชิงลบ (ผ่าน[^]) สำหรับตัวละครระหว่าง ASCII 0x00และ ASCII 0x7F(0-127) และดูเหมือนจะทำงานในการทดสอบอย่างง่ายของฉัน สำหรับการขยาย ASCII ของหลักสูตรขยายช่วงขึ้นไป\xFFแทนการใช้\x7F/[^\x00-\xFF]

คุณสามารถแสดงเป็นทศนิยมผ่านทาง\d:

/[^\d0-\d127]

[]ถ้าคุณต้องการบางสิ่งบางอย่างที่เฉพาะเจาะจงมากขึ้นเช่นการยกเว้นของตัวละครที่ไม่สามารถพิมพ์คุณจะต้องเพิ่มช่วงที่เป็นตัวอักษรชั้นเรียน


14
ในรูปทศนิยม:/[^\d0-\d127]
Bohr

@Bohr นั่นเป็นส่วนเสริมที่ดี ฉันจะแก้ไขด้านบน
Michael Berkowski

ที่ดี! บันทึกวัน! ตัวละครเยื้องตัวหนึ่งวางลงในไพ ธ อนโค้ดของฉันและข้อผิดพลาดยูนิโคดเริ่มที่จะฆ่าฉัน ยากที่จะตรวจจับในหมู่ตัวละครเดียวกันกับที่ใช้โดยกลุ่มปลั๊กอิน!
kollery

36

ใช่มีฟีเจอร์เนทีฟที่จะทำการเน้นสำหรับสตริงที่ตรงกัน ภายในเป็นกลุ่มให้ทำ:

:help highlight
:help syn-match

syn-matchกำหนดสตริงที่ตรงกับตกอยู่ในกลุ่ม highlightกำหนดสีที่ใช้โดยกลุ่ม แค่คิดเกี่ยวกับการเน้นไวยากรณ์สำหรับไฟล์ vimrc ของคุณ

ดังนั้นคุณสามารถใช้คำสั่งด้านล่างในไฟล์. vimrc ของคุณ:

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

คุณไม่จำเป็นต้องใส่:คำสั่งด้านหน้าไว้ใน vimrc ของคุณ
FDinoff

termbgดูเหมือนจะไม่ใช่คำสั่งทางกฎหมายใน VIM 7.3 ที่ติดตั้งบน Ubuntu Server 12.10
dotancohen

4
จากนั้นtermbgดูเหมือนจะไม่เป็นพารามิเตอร์กฎหมายใน VIM 7.3 เป็นที่ติดตั้งบนเซิร์ฟเวอร์ Ubuntu 12.10
dotancohen

แท้จริงเทอร์มินัลปกติtermไม่สามารถมีสีพื้นหลังในขณะที่เทอร์มินัลสีctermสามารถ
Dima Tisnek

ลบ termbg แต่คุณสามารถเพิ่ม ctermfg, guifg, etc เพื่อควบคุมส่วนหน้าได้
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 continueLinux มิ้นต์ 17.3
Nasser

3
แม้ว่าเป้าหมายคือที่ระบุไว้ไม่ได้ขัดแย้งกับคำจำกัดความไวยากรณ์กำหนดไว้แล้วถ้าคุณต้องการให้คุณสามารถเพิ่มไปยังจุดสิ้นสุดของเส้นสุดท้ายที่ทำให้มันcontainedin=ALL au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALLผมพบว่ามูลค่าความฟุ้งซ่านมัน (เมื่อ Unicode ที่ได้รับอนุญาต) คำตอบที่เดิมนี่ไม่ได้จับสิ่งต่างๆเช่นไม่ใช่ ASCII ภายในรหัสของifคำสั่ง ...
svenevs

1
มันปลอดภัยกว่าเสมอที่จะรวมกลุ่มของคุณautocmd BufRead ....ไว้ในกลุ่มออโต้ในกลุ่มเว้นแต่คุณจะมีเหตุผลที่ดีมากที่จะไม่ ...
Cbhihe

6

regex นี้ทำงานเช่นกัน มันเป็น google hit ครั้งแรกสำหรับ "vim remove อักขระที่ไม่ใช่ ASCII" จากbriceolion.comและ:set hlsearchจะเน้น:

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

1
คำถามคือขอให้เน้นตัวละครที่ไม่ใช่ ASCII ไม่ลบพวกเขา
chutsu

1
ขอบคุณสำหรับการชี้ให้เห็นว่าฉันได้แก้ไขคำตอบของฉัน ไม่มากนักเมื่อเห็นว่า regex นี้ยังตอบคำถามด้วยวิธีที่แตกต่างจากคำตอบอื่น ๆ คำตอบเดิมของฉันคือ:%s/[^[:alnum:][:punct:][:space:]]//gcไฮไลต์แรกจากนั้นแทนที่
Grant Bowman

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 (คุณยังสามารถตั้งค่า containin = ALL ได้หากคุณต้องการให้แสดงอักขระที่ไม่ใช่ ASCII ในทุกกลุ่ม) หากต้องการตรวจสอบว่ามีการเรียกความคิดเห็นในประเภทไฟล์อื่นอย่างไรให้เปิดไฟล์ประเภทที่ต้องการและป้อน:syเป็นกลุ่มจากนั้นค้นหารายการไวยากรณ์สำหรับความคิดเห็น

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
นี้จะลบตัวละครที่สหกรณ์ขอเน้น
Bernhard Wagner

คุณไม่ได้หมายถึง [^ 0-9a-zA-Z, \ -_ \.], เช่น \ -?
ben26941

0

มีคนตอบคำถามแล้ว อย่างไรก็ตามสำหรับผู้อื่นที่ยังคงมีปัญหาอยู่นี่เป็นอีกวิธีการหนึ่งในการเน้นอักขระที่ไม่ใช่ ASCII ในความคิดเห็น (หรือกลุ่มไวยากรณ์ใด ๆ ในเรื่อง) มันไม่ได้ดีที่สุด แต่เป็นการแก้ไขชั่วคราว

อาจลอง:

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

สิ่งนี้มีการผสมผสานบางส่วนจากโซลูชันอื่น ๆ คุณอาจลบcontainedแต่จากเอกสารอาจมีปัญหาที่อาจเกิดขึ้นจากการเรียกซ้ำตัวเอง (ตามที่ฉันเข้าใจ) หากต้องการดูรูปแบบที่กำหนดอื่น ๆ syn-containsส่วนจะมี

:help syn-containedin
:help syn-contains 

ปัญหาที่ซ้ำกันจาก: ตั้งค่ารายการเป็นลำดับความสำคัญที่เน้นมากขึ้นในกลุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.