ฉันจะแก้ไขไฮไลต์ไวยากรณ์“ ที่หายไป” สำหรับคำหลัก Python เช่น“ ตนเอง” ได้อย่างไร


12

ฉันพยายามแก้ไขไฮไลต์ไวยากรณ์สำหรับหลาม สีของฉันแตกต่างจากภาพในหน้าจอที่ "ควร" มีลักษณะเหมือนในโทนสีที่ต่างกัน และคุณสามารถเห็นความแตกต่างในการเปรียบเทียบ. rb (ซึ่งแสดงอย่างถูกต้อง) กับ. py ซึ่งดูเหมือนว่าปิดอยู่:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างเช่นสังเกตว่าselfไม่มีการเน้นสี (นี่คือใน base16 แต่การเปรียบเทียบจะคล้ายกันในโทนสีอื่น ๆ ) โดยทั่วไปดูเหมือนว่าการเน้นไวยากรณ์วัตถุผิด

บางสิ่งที่ฉันได้ลอง:

  1. มองไปที่สคริปต์ไวยากรณ์เป็นกลุ่มโหลด; ความแตกต่างเพียงอย่างเดียวระหว่าง. py และ. rb ในตัวอย่างด้านล่างคือแน่นอนว่า ruby ​​ได้รับการเยื้อง / ruby.vim และ syntax / ruby.vim ขณะที่ python รับการเยื้อง / python.vim และ syntax / python.vim นี่คือไฟล์ที่มาพร้อมกับ homebrew vim
  2. การโหลดไฟล์เดียวกันใน macvim แทน terminal (iterm2) vim; ปัญหาเดียวกันไฟล์ดูตรงเหมือนในภาพ
  3. การเพิ่มไฟล์python.vim ใหม่ ไม่ได้แก้ปัญหาแม้ว่าจะใช้เป็น.vim/afterสคริปต์

ข้อเสนอแนะใด ๆ ยินดีต้อนรับ; ฉันต่อสู้กับสิ่งนี้เป็นเวลาหลายชั่วโมงและไม่สามารถเข้าใจได้ว่าเหตุใดการไฮไลต์จึงไม่ทำงานอย่างที่คาดไว้


โปรดทราบว่า Python ไม่มีสัญลักษณ์และฉันขอแนะนำให้คุณใช้ Python 3 ไวยากรณ์สำหรับรหัสใหม่
Martin Tournoij

คำตอบ:


12

การเน้นไวยากรณ์ทำงานอย่างไรโดยย่อ:

  • ในsyntax/<filetype>.vimกฎไวยากรณ์จะถูกกำหนดด้วย:syntaxคำสั่ง คำสั่งนี้นิยามไวยากรณ์ได้ดี มันบอกว่า "ถ้าข้อความตรงกับการแสดงออกปกตินี้มันเป็นสตริง" และอื่น ๆ ที่จะทำเช่นนั้นก็กำหนดกลุ่มไฮไลท์ มันไม่ได้พูดอะไรเกี่ยวกับสีเช่นนี้

  • :highlightพูดว่า "เน้นกลุ่มนี้ด้วยสีเหล่านี้" สิ่งนี้ทำในโครงร่างสีไม่ใช่ไฟล์ไวยากรณ์ มีพวงของกลุ่ม Highlight เริ่มต้นคือ ( String, Function, Specialและอื่น ๆ ) ซึ่งทุกโทนสีที่ควรกำหนด

    แม้ว่าคุณจะไม่ถูก จำกัด ให้ใช้กลุ่มเริ่มต้นเหล่านี้และคุณสามารถสร้างกลุ่มได้มากเท่าที่คุณต้องการ (แต่โดยทั่วไปไฟล์ไวยากรณ์เริ่มต้นจะไม่)

  • indent/<filetype>.vimไฟล์ควบคุมเยื้องอัตโนมัติ ตัวอย่างเช่นสำหรับ Ruby มันบอกว่า "สายหลังจากdefควรเพิ่มระดับการเยื้อง" และ "สายหลังจากendควรลดการเยื้องหนึ่งระดับ" มันไม่ได้ทำอะไรกับสีหรือการเน้นไวยากรณ์


เหตุใดภาษาการเขียนโปรแกรมที่แตกต่างกันจึงถูกเน้นให้แตกต่างกัน ส่วนหนึ่งเป็นเพราะความสวยงามส่วนบุคคลและความคิดเห็นของผู้ที่เขียนมัน ตัวอย่างเช่นใน Ruby Typeกลุ่มไฮไลต์ใช้สำหรับชื่อคลาส แต่มันอาจเป็นได้Functionหรืออย่างอื่น ทำไมถึงเป็นเช่นนั้นType? อาจเป็นเพราะผู้เขียนคิดว่ามันดูดีขึ้นในโทนสีของเขาหรือเธอ

แต่ที่สำคัญกว่านั้นภาษามีความหมายและความรู้สึกที่แตกต่างกัน ใน Ruby selfเป็นคำหลักพิเศษ คุณไม่สามารถทำหรือself = "foo" def self()นี่คือข้อผิดพลาด แต่นี่ไม่ใช่ใน Python มันเป็นเพียงตัวแปรอีกตัวที่ไม่มีคุณสมบัติพิเศษ การทำ:

x = Object()
x.foo()

Python แปลว่า "จริงๆ" เป็น:

Object.foo(x)

ชื่อselfนี้เป็นแบบแผน (เกือบจะเป็นที่ยอมรับทั่วโลก) แต่คุณสามารถตั้งชื่อมันได้ตามที่คุณต้องการ def x(this):หรือdef x(xxx):ถูกต้องเท่าเทียมกัน คุณยังสามารถใช้ชื่อselfได้ทุกที่ที่คุณต้องการ self = 'foo'และdef self():ดีอย่างสมบูรณ์

ฉันจะยืนยันว่าselfไม่ควรเน้นเนื่องจากไม่ใช่คำหลักพิเศษหรือตัวแปรที่กำหนดไว้ล่วงหน้า (เช่นstr) ไม่มีร่องรอยของคำselfในไฟล์ไวยากรณ์ดังนั้นดูเหมือนว่าผู้เขียนจะให้เหตุผลเดียวกัน :-)


หากคุณต้องการselfเน้นคุณจะต้องสร้างกฎไวยากรณ์สำหรับมัน:

:syn keyword pythonBuiltin self

pythonBuiltinชื่อกลุ่มถูกกำหนดไว้แล้วในแฟ้มไวยากรณ์เริ่มต้นและเชื่อมโยงกับFunctionกลุ่มไฮไลท์ หากต้องการใช้กลุ่มไฮไลต์ใหม่ให้ใช้สิ่งที่ชอบ:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

หากต้องการทำการเปลี่ยนแปลงเหล่านี้คุณจะต้องไม่ติดในไฟล์ vimrc ของคุณ ไฟล์ไวยากรณ์จะแทนที่มัน แต่คุณจะต้องเรียกใช้หลังจากโหลดไฟล์ไวยากรณ์ซึ่งคุณสามารถทำได้สองวิธี:

  1. ใช้FileTypeautocmd:

    augroup python
        autocmd!
        autocmd FileType python
                    \   syn keyword pythonSelf self
                    \ | highlight def link pythonSelf Special
    augroup end
    
  2. ใช้after-directory, ~/.vim/after/syntax/python.vim:

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

ทั้งสองวิธีมีประสิทธิภาพเหมือนกัน ใช้ตามที่คุณต้องการ

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