2010-10-08 28 views
9

Tôi muốn viết một hàm trong vimscript tìm thấy dấu ngoặc đơn hoặc dấu ngoặc mở cuối cùng trong một dòng. Đây không hẳn là một vấn đề dễ dàng, bởi vì nó cần để có thể xử lý tất cả các nội dung sau:Vimscript: tìm parenthese mở cuối cùng hoặc khung

function(abc 
function(abc, [def 
function(abc, [def], "string(" 
function(abc, [def], "string(", ghi(

Như bạn thấy, lồng ngoặc, biểu tượng khác nhau, và chuỗi mã thông báo tất cả cần phải được xử lý một cách thông minh. Điều này thậm chí có thể? Có các công cụ với các regexes vimscript để thực hiện các tìm kiếm theo ngữ cảnh có biết sự khác biệt giữa các dấu ngoặc đơn và dấu ngoặc đơn không khép kín trong các chuỗi không?

Cho rằng bạn có thể làm nổi bật cú pháp khung không cân bằng, bạn có thể tìm thấy dấu ngoặc đơn/dấu ngoặc đơn cuối cùng trên một dòng. Điều này có thể giải quyết như thế nào?

+1

Một nửa cặp dấu ngoặc đơn được gọi là dấu ngoặc đơn. –

+0

Nếu ý định là để giúp làm nổi bật, hãy lưu ý câu hỏi và câu trả lời tại đây: http://superuser.com/questions/545278/how-to-have-vim-show-unclosed-parenthesis. Plugin 'vim-matchopen' làm nổi bật dấu ngoặc đơn, khung và dấu ngoặc đơn cuối cùng liên quan đến con trỏ (cho dù đã đóng hay chưa được đóng). –

Trả lời

4

Vì vậy, về cơ bản, bạn phải tìm parenthese cuối cùng không có trong nhận xét và không có trong chuỗi.

Tôi không chắc chắn những gì cú pháp này là vì vậy tôi đặt những dòng trong một bộ đệm và đã

:set ft=javascript 

để có được chuỗi làm nổi bật

function(abc 
function(abc, [def 
function(abc, [def], "string(" 
function(abc, [def], "string(", ghi(

Bây giờ đưa con trỏ chuột vào dòng thứ 3 parenthese mở và đưa ra lệnh sau:

:echo synIDattr(synID(line('.'), col('.'), 0), 'name') =~? '\(Comment\|String\)' 

Nó sẽ lặp lại bạn '1' và điều đó có nghĩa là c haracter dưới con trỏ là trong bình luận hoặc trong một chuỗi.

Nếu bạn đặt con trỏ tới cột cuối cùng của dòng cuối cùng và thực hiện lệnh tương tự, bạn sẽ nhận được '0'.

Bây giờ bạn có thể lặp ngược lại trên dấu ngoặc đơn và kiểm tra chúng dựa trên 'nhận xét' và 'chuỗi' và nhận được phần tử cha mẹ mở cuối cùng.

Bạn có thể kiểm tra this archive of "LISP: Balance unmatched parentheses in Vim" để xem cách đóng dấu ngoặc đơn chưa khớp bằng cách sử dụng vimscript.

+0

Cảm ơn!Nó vẫn phức tạp hơn một chút (xem xét một dòng kết thúc bằng "function (abc, def(), write", parenthese cuối cùng không phải là parenthese chưa từng có cuối cùng), nhưng synIDattr chính xác là những gì tôi cần để có thể thực hiện phần còn lại của công việc. – So8res

1

Tôi không có bất kỳ câu trả lời trực tiếp nào cho bạn, nhưng bạn có thể muốn kiểm tra mã trong plugin matchparen.vim, một plugin chuẩn được bao gồm trong cài đặt Vim (trong thư mục plugin). Plugin đó là plugin được sử dụng để làm nổi bật các dấu ngoặc phù hợp, nếu bạn đã bật chức năng đó. Mã này tổng quát hơn những gì bạn cần, vì nó khớp với các dòng, nhưng bạn có thể làm việc với nó và kiểm tra xem nó có khớp với cùng một dòng hay ít nhất là lấy một số ý tưởng từ mã của nó.

4

Sử dụng [(]):

[(   go to [count] previous unmatched '('. 
])   go to [count] next unmatched ')'. 

Đối với dấu ngoặc nhọn: [{[}.

+1

Thú vị. Điều này được thực hiện như thế nào? Có tương đương với việc tìm các dấu ngoặc vuông chưa được so khớp không? Có cách nào dễ dàng tôi có thể sử dụng điều này trong một chức năng vimscript mà không thực sự di chuyển con trỏ? – So8res

+3

Tra cứu 'searchpair()' trong phần trợ giúp/tài liệu. – Jeet

Các vấn đề liên quan