2010-11-04 25 views
32

Trong vim, FIXME và TODO được đánh dấu, nhưng tôi không thể nhận được FIXME: và TODO: (lưu ý dấu hai chấm sau từ khóa) để làm nổi bật? Tôi nên đặt cái gì vào trong .vimrc để làm điều này xảy ra?Trong vim, làm cách nào để làm nổi bật TODO: và FIXME :?

+1

Thật kỳ quặc; mỏ nổi bật có hoặc không có dấu hai chấm. Làm nổi bật cú pháp được định nghĩa trong các cú pháp riêng lẻ, tôi nghĩ - điều này có xảy ra trong một số loại tệp cụ thể không? – Cascabel

+0

@Jefromi: Tôi nghĩ điều đó xảy ra ở mọi loại tệp. –

+2

những gì hiện ': verbose set iskeyword?' Cho biết? – Benoit

Trả lời

46

Vâng, bạn đã tìm thấy sự cố, nhưng đây là lý do tại sao.

Có ba loại đối sánh cú pháp cơ bản: từ khóa, kết quả phù hợp và vùng. Từ khóa là các chuỗi cố định, thường được sử dụng cho các từ khóa ngôn ngữ cơ bản (int, double, ...) và trong trường hợp của bạn, đối với FIXME và TODO. Tôi thực sự có nghĩa là chuỗi cố định; chúng phải chính xác và toàn bộ các từ, không giống như các đối sánh và vùng, sử dụng regex. Ví dụ: từ cú pháp C:

syn keyword cTodo contained TODO FIXME XXX 

Dường như trong tất cả các định nghĩa cú pháp dựng sẵn, chỉ với các tên nhóm khác nhau (cTodo).

iskeyword cho biết liệu một ký tự cụ thể có thể là một phần của từ khóa hay không. Theo mặc định, nó không bao gồm dấu hai chấm, vì vậy khi tìm kiếm từ khóa, vim thấy "FIXME:" là "FIXME" và bỏ qua dấu hai chấm. Nếu bạn tack vào dấu hai chấm (set iskeyword+=:), bây giờ bạn có thể xác định một chút thêm nổi bật:

syn keyword myTodo contained TODO: FIXME: 

Đó là tùy thuộc vào bạn như thế nào bạn muốn làm việc đó thành các nhóm cú pháp/highlight hiện có. Nếu chỉ cho một loại tệp, bạn có thể thêm nó vào nhóm cần làm của cú pháp (ví dụ: cTodo). Nếu bạn muốn nó ở khắp mọi nơi, bạn có thể làm "myTodo" như tôi đề nghị, sau đó liên kết nó thẳng đến nhóm làm nổi bật Todo (hi def link myTodo Todo).

Ngoài ra, bạn có thể để lại một mình iskeyword (tôi có lẽ muốn khuyên này), và chỉ cần sử dụng một trận đấu:

syn match myTodo contained "\<\(TODO\|FIXME\):" 
hi def link myTodo Todo 
+0

+1 @Jefromi, tuy nhiên, tôi không nghĩ rằng kết hợp đồng bộ hóa này hoạt động. Tôi tát nó vào .vimrc của tôi và nếu tôi thay đổi FIXME thành cái gì khác thì nó không được đánh dấu. – g33kz0r

+2

@ G33kx0r: Đó không phải là lỗi của trận đấu này; nó hoạt động nếu nó vẫn tồn tại. Tôi nghi ngờ bạn đang kích hoạt cú pháp (một cách này hay cách khác) * sau * các dòng trong vimrc của bạn chạy, và khi cú pháp được kích hoạt, trước tiên nó sẽ xóa cú pháp cũ rồi tải cú pháp thích hợp. Bạn có thể kiểm tra xem liệu khớp đó có còn đúng chỗ không bằng cách sử dụng ': syn list myTodo'. Xem thêm ': help-loading'. – Cascabel

+0

Đặt 'cú pháp bật' đầu tiên và sau đó' syn khớp với myTodo chứa "\ <\ (TODO \ | FIXME \):" 'trong tệp' vimrc' của tôi và 'hi! def liên kết myTodo Todo' không làm việc cho tôi. Mặt khác, nếu tôi làm, ví dụ, 'au BufNewFile, BufRead * .tex syn khớp với texTodo" \ <\ (TODO \ | FIXME \): "' tệp 'tex' kết quả được đánh dấu đúng. Có giải pháp chung nào không? – petobens

1

Nếu bạn thực hiện môi trường của riêng mình, make syntax file (not .vimrc)

  • cú pháp toàn cầu tệp nằm trong thư mục vim (ví dụ: /usr/share/vim/vim72/syntax/c.vim)

  • và nếu yo u làm ~/.vim/syntax/c.vim, sau đó bạn có thể thêm cú pháp cho số của riêng bạn. (ghi đè)

Chỉ cần thêm cú pháp bổ sung vào tệp đó. (Đường @Jefromi không)

8
augroup vimrc_todo 
    au! 
    au Syntax * syn match MyTodo /\v<(FIXME|NOTE|TODO|OPTIMIZE|XXX):/ 
      \ containedin=.*Comment,vimCommentTitle 
augroup END 
hi def link MyTodo Todo 

Các containedin sẽ thêm nó vào tất cả các nhóm kết thúc bằng "Comment", cộng với vimCommentTitle, nơi " TODO: foo sẽ không có được tô đậm như MyTodo khác.

+0

Ghi chú sử dụng: bạn có thể thêm ghi chú này vào .vimrc của bạn và xóa dấu hai chấm (':') nếu bạn chỉ muốn từ được đánh dấu và không phải dấu hai chấm theo sau. Tôi thích đánh dấu để đọc _NOTE_ :, không _NOTE: _. Tôi cũng đôi khi viết CHÚ Ý hoặc TODO không theo sau bởi dấu hai chấm. – Ari

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