Cú pháp tô sáng vùng / từ khóa chồng chéo


7

Tôi đang cố gắng viết một tệp cú pháp cho các tập lệnh logrotate Linux.

Thông thường chúng chứa các định nghĩa nội tuyến của các tập lệnh sẽ được chạy trước hoặc sau hành động xoay.

Một ví dụ ( cups-daemontập lệnh logrotate được cung cấp bởi Ubuntu 14.04):

    prerotate
            if [ -e /var/run/cups/cupsd.pid ]; then
                    invoke-rc.d --quiet cups stop > /dev/null
                    touch /var/run/cups/cupsd.stopped
            fi
    endscript
    postrotate
            if [ -e /var/run/cups/cupsd.stopped ]; then
                    rm /var/run/cups/cupsd.stopped
                    invoke-rc.d --quiet cups start > /dev/null
                    sleep 10
            fi
    endscript

Có cách nào cho cả hai:

  • đánh dấu prerotatepostrotatelàm từ khóa, và
  • làm nổi bật tất cả ở giữa như là một khu vực?

Tôi có thể định nghĩa tô sáng thích hợp cho một trong hai, nhưng dường như không phải cho cả hai.

" this works
syntax keyword LogrotateKeyword prerotate postrotate endscript

" this also works
syntax region LogrotateScript start=/prerotate/ms=e+1 end=/endscript/me=s-1

Bây giờ cả hai trong cùng một tệp cú pháp đều chỉ làm nổi bật các từ khóa, bất kể thứ tự quy tắc được sử dụng.

Tôi đã thử match(với \zs/ \zehoặc lookahead / lookbehinds) thay vì regionquá. Tôi cũng đã thử sử dụng matchcho cả từ khóa và tập lệnh nội tuyến, hy vọng nó sẽ không làm cho các định nghĩa trùng lặp, kết quả dường như giống nhau.

Tôi có thể giữ màu mặc định cho tập lệnh nội tuyến, nhưng rõ ràng thường thì nội dung chứa các từ khóa logrotate khác, có thể gây nhầm lẫn.

Rất có thể không liên quan đến vấn đề này: Vim 7.4 với các bản vá 1-1529 (pi-rho PPA) và Ubuntu 14.04.


Nếu bạn hoàn thành tệp cú pháp logrotate, vui lòng chia sẻ. Nó sẽ là tốt đẹp để có.
muru

@muru Đây rồi. Cảm ơn câu trả lời tuyệt vời của bạn :)
ukasz Górski

Câu trả lời:


5

Sau một số thử nghiệm, đây là một cái gì đó hoạt động:

syntax keyword LogrotateKeyword prerotate postrotate endscript contained
syntax region LogrotateScript start=/\v^\s*(pre|post)rotate\s*$/rs=e+1 end=/^\s*endscript\s*$/re=s-1 keepend contains=LogrotateKeyword

Để có được một syntaxbộ hợp tác với một bộ khác chồng chéo, chúng ta có thể chứa kết quả hẹp hơn trong phạm vi khớp rộng hơn.

Trong trường hợp này:

  • Tôi đánh dấu các từ khóa là containedvà khu vực có chứa các từ khóa. Đánh dấu các từ khóa là không cần thiết, nhưng, xem xét bản chất của các từ khóa này, chúng sẽ luôn đi kèm với khu vực này trong trường hợp hợp lệ.
  • Tôi đã phải sử dụng keependsao cho trận đấu cho từ khóa không làm lu mờ trận đấu ở cuối khu vực.
  • Tôi đã chọn các biểu thức chính quy rộng hơn bao trùm toàn bộ dòng, để việc tô sáng không mở rộng ra các dòng này (hoặc nếu bạn đặt nền màu, nó sẽ trông rất kỳ lạ).

Kết hợp với tô sáng cú pháp shell shell của Vim:

syntax include @sh syntax/sh.vim
syntax keyword LogrotateKeyword prerotate postrotate endscript contained
syntax region LogrotateScript start=/\v^\s*(pre|post)rotate\s*$/rs=e+1 end=/^\s*endscript\s*$/re=s-1 keepend contains=LogrotateKeyword,@sh
highlight LogrotateKeyword ctermfg=yellow 

Tôi có:

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

Lưu ý rằng tôi đã sử dụng rersthay vì ms/ hs, me/ he. Với các tùy chọn khác, việc kết hợp các từ khóa với cú pháp shell script không hoạt động, mặc dù tôi không biết tại sao.


Sau đây sẽ tốt hơn:

syntax region LogrotateScript matchgroup=LogrotateKeyword start=/\v(pre|post)rotate/ end=/endscript/ contains=@sh

Trong trường hợp này, tôi tận dụng matchgroup:

                                                        :syn-matchgroup
        "matchgroup" can be used to highlight the start and/or end pattern
        differently than the body of the region.  Example: 
  :syntax region String matchgroup=Quote start=+"+  skip=+\\"+  end=+"+
       This will highlight the quotes with the "Quote" group, and the text in
        between with the "String" group.

Nhìn lại, matchgroupcó nghĩa là để giải quyết chính xác vấn đề này. Chúng ta không cần liệt kê riêng các từ khóa phân định, vì matchgrougchúng ta hãy làm nổi bật các dấu phân cách riêng biệt.


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.