Làm cách nào tôi có thể sửa lỗi tô sáng cú pháp bị thiếu trong các từ khóa Python như từ khóa của bản thân?


11

Tôi đang cố gắng sửa lỗi tô sáng cú pháp cho python; màu sắc của tôi khác với màu sắc trong ảnh chụp màn hình về những gì nó "nên" trông giống như trong các phối màu vim khác nhau. Và bạn có thể thấy sự khác biệt khi so sánh .rb (hiển thị chính xác) với .py, có vẻ như nó bị tắt:

nhập mô tả hình ảnh ở đây

Ví dụ: chú ý cách selfkhông được tô sáng. (Đây là trong cơ sở 16, nhưng so sánh sẽ tương tự trong các bảng màu khác). Nói chung, có vẻ như đánh dấu cú pháp đối tượng là sai.

Một số điều tôi đã thử:

  1. Nhìn vào các tập lệnh cú pháp tải vim; sự khác biệt duy nhất giữa .py và .rb trong ví dụ dưới đây là, dĩ ​​nhiên, ruby ​​bị thụt lề / ruby.vim và cú pháp / ruby.vim trong khi python bị thụt lề / python.vim và cú pháp / python.vim. Đây là những tập tin đi kèm với vim homebrew.
  2. Tải cùng một tệp trong macvim chứ không phải terminal (iterm2) vim; cùng một vấn đề, các tập tin trông giống hệt như trong hình.
  3. Thêm tệp python.vim mới . Không giải quyết vấn đề, ngay cả khi được sử dụng như một .vim/aftertập lệnh.

Mọi đề nghị đều được chào đón; Tôi đã đập đầu vào điều này trong nhiều giờ và không thể hiểu tại sao việc tô sáng không hoạt động như mong đợi.


Lưu ý rằng Python không có ký hiệu và tôi thực sự khuyên bạn nên sử dụng cú pháp Python 3 cho mã mới.
Martin Tournoij

Câu trả lời:


12

Cách đánh dấu cú pháp hoạt động ngắn gọn:

  • Trong syntax/<filetype>.vimcác quy tắc cú pháp được xác định với :syntaxlệnh. Lệnh này xác định, tốt, cú pháp. Nó nói "nếu văn bản khớp với biểu thức chính quy này, thì đó là một chuỗi", v.v. Để làm như vậy, nó chỉ định một nhóm nổi bật . Nó không nói bất cứ điều gì về màu sắc như vậy.

  • :highlightnói "làm nổi bật nhóm này với những màu này". Điều này được thực hiện trong bảng màu , không phải tệp cú pháp. Có một loạt các nhóm Highlight mặc định ( String, Function, Special, và vv) mà tất cả các tông màu cần xác định.

    Tuy nhiên, bạn không bị giới hạn trong các nhóm mặc định này và bạn có thể tạo bao nhiêu nhóm tùy thích (nhưng các tệp cú pháp mặc định thường không có).

  • Các indent/<filetype>.vimtập tin điều khiển thụt tự động. Ví dụ, đối với Ruby, nó nói "dòng sau defnên tăng mức thụt dòng" và "dòng sau endnên giảm mức thụt một cấp". Nó không làm gì với màu sắc hoặc cú pháp tô sáng.


Tại sao các ngôn ngữ lập trình khác nhau được làm nổi bật khác nhau? Một phần vì thẩm mỹ cá nhân và ý kiến ​​của bất cứ ai đã viết nó. Ví dụ, trong Ruby, Typenhóm tô sáng được sử dụng cho tên lớp. Nhưng nó cũng có thể là Functionmột cái gì đó khác. Tại sao vậy Type? Có lẽ bởi vì tác giả nghĩ rằng nó trông đẹp hơn trong cách phối màu của mình.

Nhưng quan trọng hơn, các ngôn ngữ có ngữ nghĩa và độ nhạy cảm khác nhau. Trong Ruby, selflà một từ khóa đặc biệt. Bạn không thể làm self = "foo"hoặc def self(). Đây là những lỗi. Nhưng đây không phải là trường hợp của Python. Nó chỉ là một biến khác mà không có thuộc tính đặc biệt. Đang làm:

x = Object()
x.foo()

thực sự được "dịch" bởi Python sang:

Object.foo(x)

Tên selfchỉ là quy ước (gần như được áp dụng phổ biến) nhưng bạn có thể đặt tên cho bất cứ điều gì bạn thích; def x(this):hoặc def x(xxx):có giá trị như nhau. Bạn cũng có thể sử dụng tên selfbất cứ nơi nào bạn thích; self = 'foo'def self():hoàn toàn tốt

Tôi sẽ lập luận rằng selfkhông nên làm nổi bật, vì đó không phải là một từ khóa đặc biệt, cũng không phải là một biến được xác định trước (như str). Không có dấu vết của từ selftrong tệp cú pháp, vì vậy có vẻ như tác giả của từ này có cùng lý do :-)


Nếu bạn muốn selftô sáng, bạn phải tạo quy tắc cú pháp cho nó:

:syn keyword pythonBuiltin self

Tên pythonBuiltinnhóm đã được xác định trong tệp cú pháp mặc định và được liên kết với Functionnhóm tô sáng. Để sử dụng nhóm đánh dấu mới, hãy sử dụng một cái gì đó như:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

Để thực hiện những thay đổi này, bạn không thể chỉ dán chúng vào tệp vimrc của mình. Các tập tin cú pháp sẽ ghi đè lên nó. Thay vào đó, bạn sẽ cần chạy nó sau khi tải tệp cú pháp, bạn có thể thực hiện theo hai cách:

  1. Sử dụng một FileTypeautocmd:

    augroup python
        autocmd!
        autocmd FileType python
                    \   syn keyword pythonSelf self
                    \ | highlight def link pythonSelf Special
    augroup end
    
  2. Sử dụng after-directory, ~/.vim/after/syntax/python.vim:

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

Cả hai phương pháp đều có hiệu quả như nhau. Sử dụng bất cứ điều gì bạn thích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.