Mẫu cú pháp Vim để làm nổi bật đối số từ khóa python


17

Tôi đang vật lộn với việc học các biểu thức vim (tôi cũng không biết rõ về bất kỳ biểu thức chính quy nào khác), vì vậy vấn đề chính là xác định biểu thức chính quy phù hợp

some_function_call(simple_value, keyword=value)

từ khóa trong ví dụ này.

Vì vậy, nó phải khớp với một từ nếu nó nằm trong parens và có dấu bằng sau nó.

Vấn đề tiếp theo là làm thế nào để xác định các tệp cú pháp trong vim. Tôi sẽ đánh giá cao sự giúp đỡ với điều đó, nhưng nó không khó để học, vì vậy tôi có thể tự mình làm điều đó.

EDIT dựa trên câu trả lời Tôi đã giúp người viết kịch bản cú pháp của riêng tôi cho python. Hãy thử nó. nhập mô tả liên kết ở đây


Có một vấn đề mở trên Github để làm nổi bật từ khóa được bao gồm trong tệp cú pháp Python cập nhật nhất mà tôi biết: github.com/hdima/python-syntax/issues/44 Bạn có thể muốn kiểm tra sau. Nếu bạn tìm ra cách thực hiện, vui lòng cho những người ở đó biết (hoặc nhắn tin cho tôi để tôi có thể tạo yêu cầu kéo) để tính năng này có sẵn cho mọi người.
cbaumhardt

1
Vâng, tôi là người đã mở nó.
dùng1685095

Câu trả lời:


12

Với các cài đặt sau:

syn region FCall start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow

Tôi có:

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

Đây:

  1. Tôi xác định một vùng cú pháp trong đó có thể tìm thấy các đối số từ khóa, đó sẽ là lệnh gọi hàm. Các containstùy chọn cho phép tôi tổ chức năng cuộc gọi.
  2. Trong khu vực đó, tôi khớp với bất kỳ chuỗi nào được tạo từ các ký tự định danh hợp lệ ( \i*) theo sau =, nhưng không ==, để các phép kiểm tra đẳng thức không khớp.

Bằng cách sử dụng các vùng, tôi có thể lồng các trận đấu nhiều như tôi cần, điều này sẽ rất phức tạp (không thể?) Nếu tôi đi chỉ matchvới một biểu thức thông thường.

Tôi tin rằng các biểu thức chính quy được sử dụng để khớp lệnh gọi hàm và từ khóa có thể được tinh chỉnh, nhưng xem xét những gì hợp lệ trong Python 3 , đó không phải là nhiệm vụ tôi sẵn sàng thực hiện.

Tùy chọn, tôi nghĩ bạn có thể sử dụng điều này để làm nổi bật các cuộc gọi chức năng, sử dụng matchgroup:

syn region FCall matchgroup=FName start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow
hi FName ctermfg=blue

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


Tôi có lẽ nên tạo một câu hỏi khác, nhưng bạn có ý tưởng về cách làm nổi bật chỉ các hàm dựng sẵn không?
dùng1685095

@ user1685095 Hàm dựng sẵn được liệt kê trong pythonBuiltinnhóm cú pháp theo mặc định syntax/python.vim. Tuy nhiên, nó không phân biệt giữa chức năng và các biến được xây dựng trong ( True, FalseNonecũng trong pythonBuiltin). Bạn có thể có thể sao chép các định nghĩa cho việc sử dụng của bạn.
muru

Chà, tôi đã sử dụng cú pháp tinh chỉnh hơn rồi vim mặc định như hdima / python và vim-polyglot. Tất cả đều định nghĩa các hàm dựng sẵn giống như một từ khóa có kết quả quan trọng. Không chỉ các hàm dựng sẵn được tô sáng, mà chỉ biến có cùng tên và hàm trong các mô-đun khác có cùng tên được tô sáng. Giống như query(...).***filter***()bộ lọc được tô sáng trong khi nó không liên quan gì đến các chức năng của bộ lọc dựng sẵn.
dùng1685095

@ user1685095 mặc định syntax.vimlàm cho chúng từ khóa. Xem github.com/vim/vim/blob/master/r nb
syntax / python.vim

1
@ user1685095 lẻ. Tôi không có syntax/python.vimtệp bổ sung (chỉ mặc định và tôi không thấy hành vi bạn làm: i.stack.imgur.com/LgF6F.png và tôi đồng ý với định nghĩa từ khóa - đó là cách phù hợp nhất và tôi đừng nghĩ các từ khóa được khớp trong các trường hợp như nonkeyword.keyword. Đối với các biến, hãy lưu ý rằng các nội dung này là các biến, chúng là các biến chứa các đối tượng hàm và có thể được gán giống như bất kỳ biến nào khác. Không có gì ngăn cản bạn làm sorted = filtervà sau đó sử dụng sortednhư filter.
muru

8

Đây là nơi bạn có thể bắt đầu từ:

/([^,]\+,\s\(\w\+\)=.*)

Đang phân hủy:

/(       start matching a (
[^,]\+   match multiple characters that are not ,
,\s      match a , and a space
\(       start a matching group
\w\+     match word characters
\)       end the matching group
=.*)      match an = and anything until the closing )

Điều này cần cải tiến nhưng cung cấp cho bạn một cái nhìn tổng quan về cách bạn có thể làm điều đó.


6

Ngoài câu trả lời @ Nobe4, bạn có thể làm như sau:

  • Tạo tập tin ~/.vim/after/syntax/python.vim
  • Đặt dòng luận án trong tệp:

    syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
    hi PythonArg guibg=blue
    
  • Điều chỉnh cái thứ hai với các giá trị ưa thích của bạn.

Điều này sẽ tạo một tệp cú pháp sẽ thêm một cú pháp khớp cho các đối số của bạn theo sau là a =và đặt kiểu để sử dụng. Chủ đề này :h mysyntaxfile-addsẽ thú vị cho bạn.

Ngoài ra, tôi đã sử dụng một regex khác với câu trả lời khác, đây là chi tiết (tôi không biết cái nào hoạt động tốt hơn nên có lẽ bạn sẽ phải thử):

(      Begin the pattern with a bracket
.*,    Look for any number of any character before a ,
\s*    Zero or more white spaces after the ,
\zs    Start the matching group (what will be highlighted)
\w\+   Match one or more word characters
\ze    End the matching group
\s*    Zero or more white spaces between your argument and the = sign
=      A literal = sign after your argument
.*)    Any number of any characters between your = sign and the closing bracket

Cảm ơn bạn đã giúp đỡ. Tôi không biết rằng tôi có thể thêm cú pháp tùy chỉnh của mình mà không sửa đổi các quy tắc hiện có. Mẫu của bạn không khớp với đối số từ khóa nếu đó là đối số đầu tiên trong hàm. Tôi sẽ cố gắng tự khắc phục điều đó (Tôi đang học regexps ngay bây giờ để làm điều đó). Ngay sau khi tôi học cách làm điều đó tôi sẽ đăng một bình luận.
dùng1685095

Tôi đang thử regrec này thông qua tìm kiếm vim và tôi nghĩ rằng nó chỉ khớp với một từ khóa trong lệnh gọi hàm. Tôi cần nó để phù hợp với tất cả chúng '
user1685095

@ user1685095: Yep bạn đúng mẫu của tôi không tốt. Tôi sẽ cố gắng cải thiện nó và chỉnh sửa câu trả lời của tôi.
statox

3

Tôi thấy rằng câu trả lời của @ Wolfie ghi lại việc mở ra một tuple như một từ khóa và nó cũng gặp khó khăn khi nắm bắt các đối số từ khóa bị ngắt dòng.

Lấy cảm hứng từ regex của anh ấy, tôi đã đưa ra những điều sau đây để đưa vào python.vimtập tin cú pháp của mình . (Hãy nhớ rằng ban đầu tôi đang sử dụng python.vimtệp cú pháp từ sheerun / vim-polyglot )

syn match pythonFunctionKeyword "\v\s{-}\zs\w+\ze\=(\=)@!(\_s)@!" display
syn cluster pythonExpression add=pythonFunctionKeyword
syn region pythonFunctionKwargs start=+(+ end=+)+ contains=@pythonExpression

Và phân tích biểu thức chính quy rất giống với câu trả lời của @ Wolfie :

\v      set to very magic mode
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\=      one single equal sign
(\=)@!  ...not followed by another equal sign
(\_s)@! ...not followed by any whitespace or newline character

Lưu ý rằng điều này sẽ không tô màu một đối số từ khóa được viết là : key = value. Điều mà tôi cho là một điều tốt, vì điều đó đi ngược lại với khuyến nghị về khoảng trắng PEP-8 chính thức cho các đối số từ khóa .


2

Như-of-viết câu trả lời được chấp nhận đã phá vỡ phần tô sáng cho các chuỗi bên trong danh sách đối số chức năng đối với tôi (theo giả kim thuật mà tôi không biết), vì vậy đây là phiên bản an toàn hơn, dựa trên Statox .

syntax match PythonArg "\v[\(\,]\s{-}\zs\w+\ze\s{-}\=(\=)@!"
hi PythonArg ctermfg = 214 guifg = #ffaf00

ctermfg dành cho thiết bị đầu cuối giao diện điều khiển, guifg là cho gui. Tất nhiên, bạn có thể tự do thay đổi màu sắc thành bất cứ thứ gì bạn thấy lạ mắt. Đây là một danh sách tiện dụng .

Như mọi khi, bạn làm tốt nhất để đặt bên trong này ~/.vim/after/syntax/python.vim

Đối với một sự cố regex, ở đây bạn đi:

\v      set to very magic mode
[\(\,]  capture either a ( or a ,
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\s{-}   once again, capture whitespace.
\=      one single equal sign
(\=)@!  ...not followed by another equal sign

Việc kiểm tra cuối cùng dừng việc tô sáng từ các điều kiện tô màu. Bạn có thể loại bỏ nếu nó muốn.


Xin lỗi, bạn đến muộn. Tôi có tệp cú pháp người giúp việc cho chính mình.
dùng1685095

Tốt rồi; nếu ai đó gặp phải vấn đề tương tự tôi đã làm thì họ có thể xem qua ở đây với hy vọng.
Wolfie
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.