क्या "टोडो" समूह को एक संकेत निर्दिष्ट करना संभव है?


9

जब भी लाइन में ToDo Group (ToDo, FIXME) हो, तो क्या साइन कॉलम में प्रदर्शित किया जा सकता है।

अपने रंग-रूप को छोटा करते हुए मैंने टोडो समूह के मुख्य आकर्षण को बदल दिया, लेकिन सिंटैस्टिक त्रुटियों और चेतावनियों की तरह संकेत स्तंभ में एक संकेतक रखना चाहेंगे।

जवाबों:


9

इस फ़ंक्शन का प्रयास करें:

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 सीख रहा हूं।


1
TODOटिप्पणी हटाने के बाद साइन को कैसे हटाया जाए?

1
यही कारण है कि मुझे उम्मीद नहीं थी, क्योंकि यह सभी todoसंकेतों को हटा देता है, लेकिन फिर भी बस ध्यान दिया जाता है कि रेखा को हटाने से संकेत हटा दिया जाता है, इसलिए यह ठीक है

1
ठीक है, मैंने इस लाइन को फंक्शन की शुरुआत में जोड़ा है silent! sign undefine todo:। यदि यह पहले से ही मौजूद है, तो यह साइन टूडू को हटा देता है, ताकि यदि कीवर्ड TODO या FIXME वाली लाइन को हटाने के बाद आपके संकेत गलत हैं, तो आप उन्हें तुरंत ठीक करने के लिए फ़ंक्शन को याद कर सकते हैं।
सागिनॉ

2
रेगेक्स गलत था, मैंने टाइप किया ^[TODO|FIXME]लेकिन इसके बजाय यह होना चाहिए था \v(TODO|FIXME)। नया रेगेक्स एक पंक्ति से मेल खाएगा जिसमें एक कीवर्ड होगा लेकिन लाइन की शुरुआत नहीं, क्योंकि मुझे लगता है कि एक लाइन इस तरह के उदाहरण के लिए एक टिप्पणी से पहले कुछ कोड शामिल कर सकती है some code # FIXME this line needs to be fixed। पिछला रेगेक्स पूरी तरह से गलत था, असुविधा के लिए खेद है, मैं अभी भी vimscript सीख रहा हूं ...
saginaw

1
इस दृष्टिकोण के साथ समस्या यह है कि यह सिंक से बाहर निकलेगा, यदि आप बफर को संशोधित करते हैं, उदाहरण के लिए TODO रेखा के ऊपर एक और पंक्ति जोड़ते हैं।
क्रिश्चियन ब्रेबांट

6

आप मेरे डायनामिकसाइन प्लग इन का उपयोग कर सकते हैं । यह तथाकथित "साइनएक्सप्रेशन" के लिए अनुमति देता है जो गुना अभिव्यक्ति के समान हैं।

तो आप बस कर सकते हैं :SignExpression getline(v:lnum)=~'TODO'?'Warning':0

जो संभव है उसके अधिक उदाहरणों के लिए सहायता पढ़ें।

मेरे प्लगइन का उपयोग करने का लाभ यह है कि यह बफर के परिवर्तनों को ट्रैक करता है और तदनुसार संकेतों को समायोजित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.