2008-09-26 22 views
10

Tôi quyết định tìm hiểu thêm về vim và làm nổi bật cú pháp của nó. Sử dụng các ví dụ cho người khác, tôi đang tạo tệp cú pháp của riêng mình cho Đánh dấu. Tôi đã thấy mkd.vim và nó cũng có vấn đề này. Sự cố của tôi nằm giữa các mục trong danh sách và làm nổi bật khối mã.Đánh dấu Vim Markdown (liệt kê các mục và xung đột khối mã)

Mã Khối definition:

  • dòng đầu tiên là trống
  • dòng thứ hai bắt đầu với ít nhất 4 chỗ hoặc 1 tab
  • khối được kết thúc với một dòng trống

Ví dụ:

Regular text 

    this is code, monospaced and left untouched by markdown 
    another line of code 

Regular Text 

cú pháp Vim của tôi cho khối mã:

syn match mkdCodeBlock /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock 

hi link mkdCodeBlock comment 

Danh sách Unorder mục definition:

  • dòng đầu tiên là trống
  • dòng thứ hai bắt đầu với một [- + *] theo sau là một không gian
  • danh sách được hoàn thành với một dòng trống thì một dòng bình thường (không có danh sách)
  • giữa các chi tiết đơn hàng bất kỳ số dòng trống nào có thể được thêm
  • một danh sách phụ được quy định bằng cách thụt lề (4 không gian hoặc 1 tab)
  • một dòng văn bản bình thường sau khi một mục danh sách là bao gồm như một sự tiếp nối của danh sách mục

Ví dụ:

Regular text 

- item 1 

    - sub item 1 
    - sub item 2 
- item 2 
this is part of item 2 
so is this 


- item 3, still in the same list 
    - sub item 1 
    - sub item 2 

Regular text, list ends above 

My Vim cú pháp cho định nghĩa danh sách unorder mục (tôi chỉ làm nổi bật [-+*]):

syn region mkdListItem start=/\s*[-*+]\s\+/ matchgroup=pdcListText end=".*" contained nextgroup=mkdListItem,mkdListSkipNL [email protected] skipnl 
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL skipnl 

hi link mkdListItem operator 

tôi không thể có được highli ghting để làm việc với hai quy tắc cuối cùng cho danh sách và với một khối mã.

Đây là một ví dụ mà phá vỡ làm nổi bật cú pháp của tôi:

Regular text 

- Item 1 
- Item 2 
part of item 2 

    - these 2 line should be highlighted as a list item 
    - but they are highlighted as a code block 

Tôi hiện không thể tìm ra cách để có được tô màu để làm việc theo cách tôi muốn nó quá


Quên để thêm một quy tắc cú pháp "toàn cầu" được sử dụng trong cả hai quy tắc được liệt kê bên dưới. Nó là để đảm bảo rằng họ bắt đầu với một dòng trống.

syn match mkdBlankLine /^\s*\n/ nextgroup=mkdCodeBlock,mkdListItem transparent 

LƯU: ​​Tôi cần phải có được rõ ràng hơn.Trong tập tin cú pháp của tôi, các quy tắc Danh sách xuất hiện trước các Quy Blockquote


+0

Tuyệt. Làm cho tôi cuối cùng cũng muốn học vim kịch bản. :) – jop

Trả lời

6

Chỉ cần chắc chắn rằng định nghĩa của mkdListItem là sau khi định nghĩa của mkdCodeBlock, như thế này:

syn match mkdCodeBlock /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock 
hi link mkdCodeBlock comment 

syn region mkdListItem start=/\s*[-*+]\s\+/ matchgroup=pdcListText end=".*" contained nextgroup=mkdListItem,mkdListSkipNL [email protected] skipnl 
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL skipnl 
hi link mkdListItem operator 

syn match mkdBlankLine /^\s*\n/ nextgroup=mkdCodeBlock,mkdListItem transparent 

tài liệu Vim nói trong :help :syn-define :

"Trong trường hợp có nhiều mục khớp với cùng một vị trí, thì một mục là được xác định thắng LAST. Vì vậy, bạn có thể ghi đè các mục cú pháp được xác định trước đó theo số bằng cách sử dụng i tem khớp với cùng một văn bản. Nhưng từ khóa luôn đi trước một kết hợp hoặc khu vực . Và một từ khóa với trường hợp khớp lệnh luôn luôn đi trước một từ khóa với bỏ qua trường hợp."

+0

Bạn đã đúng. Tôi đã cập nhật câu hỏi của tôi (dưới cùng), quy tắc danh sách của tôi là trước quy tắc chặn của tôi. Bạn có thể lật ví dụ của bạn xung quanh, vì vậy blockquote là trước khi danh sách. Sau đó, tôi có thể chấp nhận câu trả lời của bạn. –

+0

Bạn nói đúng, ban đầu tôi đã giải quyết "vấn đề ngược lại" :) – hcs42

1

hcs42 là đúng. Tôi nhớ đọc phần đó bây giờ, nhưng tôi quên mất nó cho đến khi hcs24 nhắc nhở tôi về điều đó.

đây là cú pháp cập nhật của tôi (vài tinh chỉnh khác) mà làm việc:

 
""""""""""""""""""""""""""""""""""""""" 
" Code Blocks: 

" Indent with at least 4 space or 1 tab 
" This rule must appear for mkdListItem, or highlighting gets messed up 
syn match mkdCodeBlock /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock 

""""""""""""""""""""""""""""""""""""""" 
" Lists: 

" These first two rules need to be first or the highlighting will be 
" incorrect 

" Continue a list on the current line or next line 
syn match mkdListCont /\s*[^-+*].*/ contained nextgroup=mkdListCont,mkdListItem,mkdListSkipNL [email protected] skipnl transparent 

" Skip empty lines 
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL 

" Unorder list 
syn match mkdListItem /\s*[-*+]\s\+/ contained nextgroup=mkdListSkipNL,mkdListCont skipnl 
0

Tao Zhyn, rằng có lẽ bao gồm trường hợp sử dụng của bạn, nhưng nó không bao gồm cú pháp Markdown Trong Markdown một mục danh sách có thể chứa một khối mã. Bạn có thể xem giải pháp của tôi here

TL; DR; vấn đề là vim không cho phép bạn nói điều gì đó như: một khối có cùng một thụt đầu dòng như vùng chứa + 4 dấu cách. Giải pháp duy nhất tôi tìm thấy là tạo quy tắc cho từng loại khối có thể chứa trong một mục danh sách cho mỗi cấp độ thụt đầu dòng (thực ra tôi hỗ trợ 42 mức thụt đầu dòng nhưng đó là số tùy ý)

Vì vậy, tôi có markdownCodeBlockInListItemAtLevel1 phải được chứa trong một markdownListItemAtLevel1 và nó cần phải có ít nhất 8 gian hàng đầu, một sau đó markdownCodeBlockInListItemAtLevel2 rằng phải được chứa trong một markdownListItemAtLevel2 phải được chứa trong một kiến ​​markdownListItemAtLevel1 cần phải có ít nhất 10 không gian hàng đầu, ecc. ..

Tôi biết rằng một vài năm đã trôi qua nhưng có thể ai đó sẽ cân nhắc là câu trả lời hữu ích vì tất cả cú pháp dựa trên thụt đầu dòng đều bị cùng một vấn đề

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