इस फ़ंक्शन का प्रयास करें:
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
अब कमांड लाइन पर फ़ंक्शन को कॉल करें:
:call SignKeyword()
या ~/.vimrc
इसे कॉल करने के लिए अपने मानचित्रण में जोड़ें :
nnoremap <your mapping> :call SignKeyword()<cr>
या एक ऑटोकैमड जोड़ें। उदाहरण के लिए, यदि आप चाहते हैं कि किसी फ़ाइल को खोलने के दौरान फ़ंक्शन को स्वचालित रूप से कॉल किया जाए जिसका फ़ाइल मार्क मार्कडाउन है:
autocmd FileType markdown call SignKeyword()
फ़ंक्शन की पहली पंक्ति silent! sign undefine todo
साइन टूडू को हटा देती है यदि यह पहले से मौजूद है, ताकि यदि आपके सिग्नल एक लाइन को हटाने या जोड़ने के बाद गलत हो जाते हैं, तो आप उन्हें तुरंत ठीक करने के लिए फ़ंक्शन को याद कर सकते हैं।
दूसरी पंक्ति एक संकेत को परिभाषित करती है जिसका नाम टूडू है, जिसका पाठ है >>
(आप इसे अपनी वरीयताओं के अनुरूप बदल सकते हैं) और जो खोज हाइलाइटिंग समूह (एक ही चीज़) का उपयोग करता है।
तीसरी पंक्ति वैश्विक कमांड का उपयोग करती है:
:g/pattern/command
वैश्विक कमांड प्रत्येक लाइन पर एक कमांड निष्पादित करता है जो एक पैटर्न से मेल खाता है।
यहाँ पैटर्न है \v\C(<TODO>|<FIXME>)
, जिसका अर्थ है TODO या FIXME शब्द से युक्त कोई भी रेखा ।
रेगेक्स में परमाणु शामिल है \C
ताकि खोज मामले का सम्मान करे (कोई फर्क नहीं पड़ता कि आपका 'अज्ञानता' विकल्प क्या है)। यदि आप चाहते हैं कि खोज मामले का सम्मान न करे, तो उसे बदल दें \c
।
जब भी इस तरह की रेखा को पाया जाता है, तो निम्नलिखित पंक्ति को कार्य द्वारा निष्पादित किया जाता है:
execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
यह :execute
निम्नलिखित कमांड की सामग्री को निष्पादित करता है ( कमांड के साथ ):
"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')
स्ट्रिंग में दो विम अंतर्निर्मित कार्य शामिल हैं: line()
और bufnr()
।
line('.')
जब कोई मेल वैश्विक कमांड द्वारा पाया जाता है, तो वर्तमान लाइन bufnr('.')
की संख्या देता है , और वर्तमान बफर की संख्या देता है।
उदाहरण के लिए, यदि वैश्विक कमांड बफर 5 में लाइन 10 पर एक मैच पाता है, तो यह देगा:
"sign place 9999 line=" . 10 . " name=todo buffer=" . 5
डॉट्स स्ट्रिंग्स को समेटते हैं, और इसलिए यह अंत में मूल्यांकन करेगा:
"sign place 9999 line=10 name=todo buffer=5"
जो कि :sign
कमांड को बफर 10 में लाइन 10 पर साइन रखने वाला है।
9999 साइन के लिए रैंडम आईडी है (आप दूसरे को चुन सकते हैं)।
फ़ंक्शन की चौथी पंक्ति :nohlsearch
मिलान किए गए पैटर्न के हाइलाइटिंग को अक्षम करती है।
संपादित करें: मैंने regex को ठीक किया, मूल गलत था। मैंने लिखा ^[TODO|FIXME]
लेकिन इसके बजाय मुझे लगता है कि यह होना चाहिए \v\C(<TODO>|<FIXME>)
। असुविधा के लिए क्षमा करें, मैं अभी भी vimscript सीख रहा हूं।
TODO
टिप्पणी हटाने के बाद साइन को कैसे हटाया जाए?