มีวิธีที่จะเป็นกลุ่มไม่ได้ตั้งค่าสถานะ URL HTTP และที่อยู่อีเมลเป็นข้อผิดพลาดการสะกด? หรือโดยทั่วไปแล้ววิธีในการแสดงรายการ regexes ของการสะกดที่ถูกต้อง?
มีวิธีที่จะเป็นกลุ่มไม่ได้ตั้งค่าสถานะ URL HTTP และที่อยู่อีเมลเป็นข้อผิดพลาดการสะกด? หรือโดยทั่วไปแล้ววิธีในการแสดงรายการ regexes ของการสะกดที่ถูกต้อง?
คำตอบ:
คุณสามารถเพิ่มกฎไวยากรณ์ที่กำหนดเองและให้@nospell
คำหลักแก่พวกเขา
นี่จะบอกเป็นกลุ่มว่าจะไม่ใช้การตรวจสอบการสะกดกับการจับคู่ไวยากรณ์นี้ ตัวอย่างเช่น:
:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell
ด้านบนจะใช้งานได้กับไฟล์ข้อความและไฟล์บางไฟล์ (เช่น markdown) แต่ไม่เหมาะสำหรับประเภทไฟล์ทั้งหมด
โปรดทราบว่าฉันใช้ regex ง่าย ๆ ที่นี่; ดูฉันจะแยก URL จากข้อความสำหรับตัวเลือกอื่นได้อย่างไร
สำหรับประเภทไฟล์อื่น ๆ คุณต้องทำงานเพิ่มอีกนิด ตัวอย่างเช่นสำหรับpython
ไฟล์ความคิดเห็นมีอยู่ในpythonComment
กลุ่มจาก/usr/share/vim/vim74/syntax/python.vim
:
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
หากต้องการลบล้างสิ่งนี้เราต้องทำ:
:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment
เคล็ดลับคือการเพิ่มรายการของการจับคู่ไวยากรณ์ก่อนหน้านี้ที่ตรงกับไวยากรณ์ที่กำหนดเองของเราอาจจะมีอยู่ในcontainedin=
นี้จะบอกให้เป็นกลุ่มที่จะมองหา
UrlNoSpell
regex ภายในการpythonComment
แข่งขัน
เราจำเป็นต้องใช้highlight
เพื่อตั้งค่าสีที่ถูกต้องเนื่องจากสิ่งเหล่านี้ไม่ได้รับการสืบทอด
คุณต้องทำสิ่งนี้หลายแห่งตัวอย่างเช่นสำหรับสตริง Python:
:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String
เราต้องการกลุ่มจับคู่ไวยากรณ์ที่แตกต่างกัน 2 กลุ่มเพื่อให้เราสามารถใช้การเน้นไวยากรณ์ที่ถูกต้องได้
แน่นอนว่าสำหรับ filestypes อื่น ๆ คุณต้องใช้การcontainedin=
จับคู่ไวยากรณ์อื่น ๆ... นั่นคือ AFAIK ไม่มีวิธีแก้ปัญหา "สากล" แต่การค้นหาสิ่งที่ถูกต้อง/usr/share/vim/vim74/syntax/*.vim
ไม่ควรยากเกินไป
โปรดทราบว่าคำสั่งข้างต้นทั้งหมดจะต้องดำเนินการหลังจากไฟล์ไวยากรณ์; มี 2 วิธีในการทำสิ่งนี้:
จากคำสั่งหรือการจับคู่คีย์จะต้องเรียกใช้ด้วยตนเองทุกครั้ง เช่น
fun! NoUrlSpell()
if &filetype == 'python'
:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment
:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String
elseif &filetype == 'ruby'
" ...
else
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
endif
endfun
command NoUrlSpell :call NoUrlSpell()
~/.vim/after/syntax/[filetype].vim
ใส่คำสั่งในใน เป็นกลุ่มจะรับไฟล์เหล่านี้และดำเนินการได้หลังจากที่ไฟล์ไวยากรณ์เริ่มต้น (ดู:
:help after-directory
)
มาร์ติน Tournoij 's คำตอบที่ดีเยี่ยมเป็นอย่างอื่นไม่สามารถทำงานตามที่คาดหวังสำหรับฉัน - อาจเป็นเพราะการใช้ประโยชน์ของฉันdiraolของปรากฎการณ์python-mode
ปลั๊กอินมากกว่าไฟล์ไวยากรณ์ที่เป็นกลุ่มของการเริ่มต้นสำหรับงูหลาม
ในการหลีกเลี่ยงการเน้น URIs ในความคิดเห็น Python สตริงหรือเอกสารภายใต้python-mode
ให้เพิ่มหนึ่งซับใน~/.vim/after/syntax/python.vim
ไฟล์ที่ระบุเฉพาะผู้ใช้ของคุณ:
syntax match NoSpellUriPython '\w\+:\/\/[^[:space:]]\+' transparent contained containedin=pythonComment,python.*String contains=@NoSpell
แค่นั้นแหละ. โปรดทราบว่าสิ่งนี้บีบอัดสิ่งที่น่าจะเป็นสิบสองบรรทัดแยกกันในคำตอบของ Martin ในบรรทัดเดียว อย่างไร? ขั้นต้นวัตสันที่รัก Vim ของฉัน เราเพิ่ม:
transparent
คำหลักที่สอนเป็นกลุ่มที่จะสืบทอดคุณสมบัติเน้นไวยากรณ์เด็กคนนี้จากไวยากรณ์แม่ (เช่นความคิดเห็นสตริง) สิ่งนี้ช่วยให้เราหลีกเลี่ยงการเรียกคืนhighlight def link
กลุ่มไวยากรณ์แต่ละกลุ่มอย่างชัดเจนcontained
คำหลักไวยากรณ์การป้องกันไม่ให้เด็กคนนี้จากการขยายขอบเขตของการที่ผ่านมาแม่ของไวยากรณ์ (เช่น EOL สำหรับความเห็นคั่นสตริงสำหรับสตริง)containedin
คำหลัก .*
ประกอบ regex ช่วยให้เราสามารถชาญฉลาดตรงกับทุกกลุ่มไวยากรณ์สตริงหลาม (เช่นpythonString
, pythonUniString
, pythonRawString
, pythonUniRawString
, pythonDocstring
) ที่มีอาการปวดน้อยที่สุดและความเข้ากันได้สูงสุดถึงแม้ว่าจะใช้ได้ในทางเทคนิคแล้ว vimscript ที่ฝังอยู่ในคำตอบของ Martin นั้นละเมิดหลักการ DRY (อย่าทำซ้ำตัวเอง) ดูเพิ่มเติมคำตอบที่คล้ายกันนี้สำหรับรายละเอียดเพิ่มเติม
แต่เดี๋ยวก่อน ... มีอีกมาก
ฉันรำคาญพอสมควรโดยทั้งสองเป็นกลุ่มของไร้เดียงสาเกินไปตรวจสอบการสะกดเริ่มต้นและบุคคลที่สามปลั๊กอิน (เช่นspelunkerซึ่งไม่มีเงื่อนไขสะกดตรวจสอบบัฟเฟอร์ทั้งหมดมากกว่าเพียงความเห็นรหัสและสตริง) ที่ฉันได้ตัดสินใจที่ ... ที่จริงการทำอะไรบางอย่าง เกี่ยวกับสิ่งนั้น. </gasp>
เป็นกลุ่มดีทดสอบโค้ดด้านล่างอย่างชาญฉลาดหลีกเลี่ยงการตรวจสอบการสะกดทั้งหมดต่อไปนี้ภายในความเห็นงูหลามและสตริง:
CamelCase
ตัวบ่งชี้snake_case
ตัวบ่งชี้UPPERCASE
ตัวบ่งชี้@
-prefixed identifier (เช่น, @muhdecorator
)"
- คั่นชื่อไฟล์แบบไฟล์ (เช่น, "muh_module.py"
):
substrings ที่มีการ จำกัด (เช่น:func:
in: func: `re.sub`)re.sub
in: func:` re.sub`)เพิ่มบางส่วนหรือทั้งหมดต่อไปนี้ลงใน~/.vim/after/syntax/python.vim
ไฟล์เฉพาะผู้ใช้ของคุณและอ้าปากค้างด้วยความดีใจเนื่องจาก Vim จะทำการตรวจสอบ RightStuff ™ครั้งเดียว:
" Avoid spell checking URIs.
syntax match NoSpellPythonUri /\v\w+:\/\/[^[:space:]]+/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking both CamelCase-formatted identifiers and uppercase
" identifiers. Since most languages (excluding Raku) prohibit Unicode in
" identifiers, these matches are intentionally confined to ASCII codepoints
" (e.g., "[A-Z]" rather than "[[:upper:]]").
syntax match NoSpellPythonCaps /\v<[A-Z]([A-Z0-9]{-1,}|[a-z0-9]+[A-Z0-9].{-})>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking snake_case-formatted identifiers.
syntax match NoSpellPythonSnake /\v<\w+_.{-1,}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking "@"-prefixed identifiers.
syntax match NoSpellPythonDecorator /\v\@[a-zA-Z].{-}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking ":"-delimited substrings.
syntax match NoSpellPythonColons /\v:[^:]+:/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking "`"-delimited substrings.
syntax match NoSpellPythonTicks /\v`[^`]+`/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking '"'-delimited filetyped filenames matched as a
" double-quoted substring containing a filename prefix, a period, and one to
" four characters comprising a filetype.
syntax match NoSpellPythonPath /\v"[^"]+.[^"]{1,4}"/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
แน่นอนทั้งหมดข้างต้นสามารถ (และอาจจะ) ลดลงเป็นหนึ่งซับที่ตรงกับการแสดงออกปกติก็อดซิลล่าหนึ่งที่ไม่มีใครรวมทั้งตัวฉันเองจะสามารถที่จะรักษาหรือแม้กระทั่งการอ่าน สำหรับความมีสติของทุกคนฉันไม่ได้ทำอย่างนั้น
หากใครบางคนที่ไม่ใช่ฉันต้องการที่จะสร้างปลั๊กอิน Vim ที่โฮสต์โดย GitHub ซึ่งขยายภาษาดังกล่าวข้างต้นไปยังภาษายอดนิยมอื่น ๆ นั่นจะยอดเยี่ยมมาก การตรวจสอบการสะกดคำผิดปกติของ Vim นั้นอยู่ที่นั่นเกือบทุกคน มันแค่ต้องการความช่วยเหลือจากชุมชนโอเพนซอร์ส
จนกว่าจะถึงตอนนั้น StackOverflow อาจอยู่กับคุณตลอดไป!