ละเว้น URL และที่อยู่อีเมลในไฟล์สะกด


12

มีวิธีที่จะเป็นกลุ่มไม่ได้ตั้งค่าสถานะ URL HTTP และที่อยู่อีเมลเป็นข้อผิดพลาดการสะกด? หรือโดยทั่วไปแล้ววิธีในการแสดงรายการ regexes ของการสะกดที่ถูกต้อง?

คำตอบ:


16

คุณสามารถเพิ่มกฎไวยากรณ์ที่กำหนดเองและให้@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=นี้จะบอกให้เป็นกลุ่มที่จะมองหา UrlNoSpellregex ภายในการ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)


3

มาร์ติน 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>

เป็นกลุ่มดีทดสอบโค้ดด้านล่างอย่างชาญฉลาดหลีกเลี่ยงการตรวจสอบการสะกดทั้งหมดต่อไปนี้ภายในความเห็นงูหลามและสตริง:

  • URI (ดังด้านบน)
  • CamelCase ตัวบ่งชี้
  • snake_case ตัวบ่งชี้
  • UPPERCASE ตัวบ่งชี้
  • @-prefixed identifier (เช่น, @muhdecorator)
  • "- คั่นชื่อไฟล์แบบไฟล์ (เช่น, "muh_module.py")
  • :substrings ที่มีการ จำกัด (เช่น:func:in: func: `re.sub`)
  • `-strated substrings (เช่นre.subin: 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 อาจอยู่กับคุณตลอดไป!


2
ฉันคิดว่าไวยากรณ์ของ Vim ทั้งหมดนี้เน้นสิ่งขณะที่เขียนคำตอบที่นี่ ฉันไม่เคยรู้ว่าสิ่งที่ฉันกำลังทำเพื่อความซื่อสัตย์เสมอโดยเฉพาะอย่างยิ่งคำตอบเก่าบางอย่างอาจน้อยกว่าที่เหมาะสม😅
Martin Tournoij

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