2011-11-23 30 views
5

Tôi đang thực hiện trên vim một tập tin cú pháp để làm nổi bật một hệ thống phân cấp như thế nàyVim cú pháp tô sáng cho một trận đấu trên nhiều dòng

| text at level 1 
| | text at level 2 
| | text at level 2 
| | | text at level 3 
| text at level 1 

Ví dụ tôi sử dụng

syn match myMatch +^\(| \)\++ 

để làm nổi bật các chỉ số mức độ. Tuy nhiên, tôi cũng muốn làm nổi bật các mẫu sai như thế này

| text at level 1 
| | | text at level 3 

làm tăng cấp độ nhiều hơn một. Tôi đã viết cú pháp sau khớp với

syn match myWrongMatch +^\(\(| \)*\)\(\n\|[^|].*\n\)\1\(| \)\{2,}+ 

Nó có thể không tối ưu nhưng thực hiện công việc. Vấn đề là các trận đấu được kiểm tra bởi vim trên dòng đang được chỉnh sửa để nếu tôi sửa lỗi bằng cách xóa một cấp trên dòng thứ hai, nó sẽ dừng làm nổi bật dòng thứ hai nhưng vẫn đánh dấu dòng đầu tiên cho đến khi tôi chỉnh sửa nó (như xóa và viết lại một ký tự).

Vấn đề này là tôi chỉ có thể đối sánh với một dòng sử dụng thông tin dòng tiếp theo chứ không phải ngược lại. Bởi vì điều này dường như không thể với một trận đấu regex, tôi muốn biết nếu có thể hỏi vim để kiểm tra các trận đấu trong cả hai dòng hiện đang được chỉnh sửa và trước đó (hoặc một bối cảnh rộng hơn)? Một giải pháp khác có thể là để thực hiện điều này bằng một khu vực kiểm tra ngữ cảnh nhưng tôi đã không thành công với điều đó cho đến nay.

EDIT: Câu trả lời thực sự là trợ giúp vim tại: syn-sync-linebreaks (cảm ơn Herbert Sitz đã chỉ cho tôi đến phần bên phải).

Khi sử dụng mẫu phù hợp với nhiều dòng, thay đổi trong một dòng có thể làm cho mẫu không còn khớp với dòng trước đó nữa. Điều này có nghĩa là phải bắt đầu ở trên nơi thực hiện thay đổi. Có thể chỉ định bao nhiêu dòng với đối số "linebreaks" là . Ví dụ, khi một mô hình có thể bao gồm một dòng nghỉ sử dụng này:

:syntax sync linebreaks=1 

Kết quả là vẽ lại luôn bắt đầu ít nhất một dòng trước khi hợp do thay đổi đã được thực hiện. Giá trị mặc định cho "linebreaks" là 0. Thông thường, giá trị cho "minlines" lớn hơn "linebreaks".

Điều này hoạt động hoàn hảo.

Trả lời

2

Bạn có thể thử tự động hóa thao tác đồng bộ hóa cú pháp. Ví dụ: thử đặt giá trị này vào autocmd ChènEnter, sẽ đồng bộ hóa cú pháp bất cứ khi nào bạn thoát chế độ chèn:

au InsertLeave * syntax synch minlines=50 

Không phải là giải pháp hoàn hảo. Có thể thêm nhiều autocmds sẽ giúp ích. Nó phụ thuộc một phần vào những gì các tài liệu của bạn sẽ trông như thế nào, chúng lớn như thế nào, cách bạn đang chỉnh sửa.

Để được trợ giúp đọc thêm về đồng bộ hóa cú pháp: :h syn-sync Đây không phải là cách sử dụng đồng bộ điển hình, vì mục đích chính, như tôi hiểu, là tự động tìm kiếm các dòng đã chỉnh sửa khi chúng ở vùng cú pháp.Bạn không sử dụng các vùng, vì vậy bạn cần phải bắt đầu đồng bộ hóa bằng cách sử dụng autocmd. Có lẽ bạn có thể xác định một khu vực chỉ nhằm mục đích đảm bảo đồng bộ cú pháp xác định lại cú pháp trên nhóm các dòng - mà không cần autocmd - ngay cả khi vùng đó sẽ không được sử dụng để làm nổi bật.

+0

Cảm ơn bạn đã tham khảo, tôi đã tìm thấy chính xác những gì tôi muốn trong đồng bộ hóa đồng bộ hóa: h. Tôi không biết phần này. Các autocmds cũng có vẻ khá mạnh mẽ, tôi sẽ xem xét chúng khi tôi sẽ muốn một cái gì đó mà chưa được thực hiện (nếu nó bao giờ xảy ra). Đó là câu hỏi đầu tiên của tôi vì vậy tôi không có đủ danh tiếng để upvote bạn trả lời xin lỗi. – udscbt

+0

@ user1061133 - Ha, không sao cả. Tốt cho tôi để tìm hiểu về tùy chọn đồng bộ-linebreak. Nó có vẻ là một đối tác của minlines. Tức là, trong khi 'minlines' đặt số dòng để kiểm tra lại khi thay đổi được thực hiện trong vùng cú pháp, các tùy chọn' linebreak' sẽ đặt các dòng để kiểm tra lại khi thay đổi được thực hiện trong kết hợp cú pháp. Chính xác những gì bạn đang tìm kiếm. . . –

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