Có thể gán một dấu hiệu cho nhóm Tod Todo?


9

Có thể thêm một dấu hiệu được hiển thị trong cột dấu hiệu bất cứ khi nào dòng có nhóm ToDo (ToDo, FIXME ...).

Tinh chỉnh màu sắc của tôi, tôi đã thay đổi điểm nổi bật của nhóm Todo, nhưng muốn có một chỉ báo trong cột dấu hiệu, như lỗi Syntastic và cảnh báo.

Câu trả lời:


9

Hãy thử chức năng này:

function! SignKeyword()

    silent! sign undefine todo

    sign define todo text=>> texthl=Search

    g/\v\C(<TODO>|<FIXME>)/execute "sign place 9999 line=" . line('.')
    \ . " name=todo buffer=" . bufnr('')

    nohlsearch

endfunction

Bây giờ gọi hàm trên dòng lệnh:

:call SignKeyword()

Hoặc thêm một ánh xạ trong của bạn ~/.vimrcđể gọi nó:

nnoremap <your mapping> :call SignKeyword()<cr>

Hoặc thêm một autocmd. Ví dụ: nếu bạn muốn hàm được gọi tự động khi mở tệp có kiểu tệp được đánh dấu:

autocmd FileType markdown call SignKeyword()

Dòng đầu tiên của hàm silent! sign undefine todosẽ xóa dấu hiệu cần làm nếu nó đã tồn tại, để nếu các dấu hiệu của bạn bị thất lạc sau khi xóa hoặc thêm một dòng, bạn có thể gọi lại hàm để sửa chúng ngay lập tức.


Dòng thứ hai xác định một dấu hiệu có tên là việc cần làm, có văn bản >>(bạn có thể thay đổi nó cho phù hợp với sở thích của bạn) và sử dụng nhóm tô sáng Tìm kiếm (cùng một thứ).


Dòng thứ ba sử dụng lệnh toàn cầu:

:g/pattern/command

Lệnh toàn cầu thực thi một lệnh trên mỗi dòng khớp với một mẫu.

Đây là mẫu \v\C(<TODO>|<FIXME>), có nghĩa là bất kỳ dòng nào có chứa từ TODO hoặc FIXME .
Regex bao gồm nguyên tử \Cđể tìm kiếm tôn trọng trường hợp (bất kể tùy chọn 'ignorecase' của bạn là gì). Nếu bạn muốn tìm kiếm không tôn trọng trường hợp, thay đổi nó thành \c.

Bất cứ khi nào một dòng như vậy được tìm thấy, dòng sau đây được thực hiện bởi hàm:

execute "sign place 9999 line=" . line('.')
    \ . " name=todo buffer=" . bufnr('')

Nó thực thi (với :executelệnh) nội dung của chuỗi sau:

"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')

Chuỗi bao gồm hai hàm dựng sẵn vim: line()bufnr().
line('.')trả về số lượng dòng hiện tại khi lệnh toàn cầu được tìm thấy và bufnr('.')trả về số lượng bộ đệm hiện tại.

Vì vậy, ví dụ, nếu lệnh toàn cầu tìm thấy kết quả khớp trên dòng 10 trong bộ đệm 5, nó sẽ đưa ra:

"sign place 9999 line=" . 10 . " name=todo buffer=" . 5

Các dấu chấm nối các chuỗi, và do đó cuối cùng nó sẽ đánh giá:

"sign place 9999 line=10 name=todo buffer=5"

Đó là :signlệnh đặt một dấu hiệu trên dòng 10 trong bộ đệm 5.
9999 là một id ngẫu nhiên được chọn cho dấu hiệu (bạn có thể chọn một dấu hiệu khác).


Dòng thứ tư của chức năng :nohlsearchvô hiệu hóa việc làm nổi bật các mẫu phù hợp.

Chỉnh sửa: Tôi đã sửa regex, bản gốc đã sai. Tôi đã viết ^[TODO|FIXME]nhưng thay vào đó tôi nghĩ rằng nó nên được \v\C(<TODO>|<FIXME>). Xin lỗi vì sự bất tiện này, tôi vẫn đang học vimscript.


1
Làm thế nào để loại bỏ các dấu hiệu một khi TODObình luận đã được gỡ bỏ?

1
đó không phải là điều tôi mong đợi, bởi vì điều đó đã loại bỏ tất cả các tododấu hiệu, tuy nhiên chỉ cần lưu ý rằng việc xóa dòng dấu hiệu đã bị xóa, vì vậy điều đó ổn

1
Ok, tôi đã thêm dòng này vào đầu hàm : silent! sign undefine todo. Nó xóa dấu hiệu cần làm nếu nó đã tồn tại, để nếu các dấu hiệu của bạn bị thất lạc sau khi xóa một dòng có chứa từ khóa TODO hoặc FIXME, bạn có thể gọi lại hàm để sửa chúng ngay lập tức.
saginaw

2
Regex đã sai, tôi đã gõ ^[TODO|FIXME]nhưng thay vào đó nó phải như vậy \v(TODO|FIXME). Regex mới sẽ khớp với một dòng chứa một trong những từ khóa nhưng không phải là đầu dòng, vì tôi cho rằng một dòng có thể chứa một số mã trước khi nhận xét như thế này some code # FIXME this line needs to be fixed. Regex trước đó là hoàn toàn sai, xin lỗi vì sự bất tiện này, tôi vẫn đang học vimscript ...
saginaw

1
Vấn đề với cách tiếp cận này là, nó sẽ không đồng bộ hóa, nếu bạn sửa đổi bộ đệm, ví dụ: thêm một dòng khác phía trên một dòng TODO.
Christian Brabandt

6

Bạn có thể sử dụng plugin DynamicSigns của tôi . Điều này cho phép cái gọi là "SignExpression" tương tự như biểu thức gấp.

Vì vậy, bạn có thể chỉ cần làm :SignExpression getline(v:lnum)=~'TODO'?'Warning':0

Đọc trợ giúp cho nhiều ví dụ về những gì có thể.

Ưu điểm của việc sử dụng plugin của tôi là, nó theo dõi các thay đổi của bộ đệm và điều chỉnh các dấu hiệu phù hợp.

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.