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 todo
sẽ 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 :execute
lệ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()
và 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à :sign
lệ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 :nohlsearch
vô 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.
TODO
bình luận đã được gỡ bỏ?