เป็นไปได้ไหมที่จะกำหนดสัญลักษณ์ให้กลุ่ม "Todo"


9

เป็นไปได้ไหมที่จะเพิ่มเครื่องหมายที่จะแสดงในคอลัมน์สัญญาณเมื่อใดก็ตามที่บรรทัดมีกลุ่มสิ่งที่ต้องทำ (ToDo, FIXME ... )

ปรับเปลี่ยนสีของฉันฉันเปลี่ยนไฮไลต์ของกลุ่มสิ่งที่ต้องทำ แต่ต้องการมีตัวบ่งชี้ในคอลัมน์สัญญาณเช่นข้อผิดพลาดและคำเตือนของ Syntastic

คำตอบ:


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 ตัวอย่างเช่นหากคุณต้องการให้เรียกใช้ฟังก์ชันโดยอัตโนมัติเมื่อเปิดไฟล์ที่มีไฟล์ประเภท markdown:

autocmd FileType markdown call SignKeyword()

บรรทัดแรกของฟังก์ชั่นsilent! sign undefine todoจะลบเครื่องหมาย todo หากมีอยู่แล้วดังนั้นหากสัญญาณของคุณถูกวางผิดที่หลังจากลบหรือเพิ่มบรรทัดคุณสามารถเรียกคืนฟังก์ชันเพื่อแก้ไขได้ทันที


บรรทัดที่สองกำหนดสัญลักษณ์ที่มีชื่อเป็นสิ่งที่ต้องทำซึ่งข้อความคือ>>(คุณสามารถเปลี่ยนให้เหมาะกับความต้องการของคุณ) และใช้กลุ่มค้นหาไฮไลต์ (สิ่งเดียวกัน)


บรรทัดที่สามใช้คำสั่งโกลบอล:

:g/pattern/command

คำสั่งส่วนกลางดำเนินการคำสั่งในทุกบรรทัดที่ตรงกับรูปแบบ

นี่คือรูปแบบ\v\C(<TODO>|<FIXME>)ซึ่งหมายความว่าเส้นใด ๆ ที่มีทั้งคำว่าสิ่งที่ต้องทำหรือFIXME
regex มีอะตอม\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('.')

ตัวอย่างเช่นหากคำสั่งโกลบอลพบการจับคู่บนบรรทัดที่ 10 ในบัฟเฟอร์ 5 คำสั่งนั้นจะให้:

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

จุดต่อกันสตริงและในที่สุดมันก็จะประเมินว่า:

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

ซึ่งเป็น:signคำสั่งที่วางเครื่องหมายบนบรรทัดที่ 10 ในบัฟเฟอร์ 5
9999 เป็นรหัสสุ่มที่เลือกสำหรับสัญญาณ (คุณสามารถเลือกอีกอันได้)


บรรทัดที่สี่ของฟังก์ชั่น:nohlsearchปิดใช้งานการเน้นของรูปแบบที่ตรงกัน

แก้ไข: ฉันแก้ไข regex ต้นฉบับผิด ผมเขียนแต่ผมคิดว่ามันควรจะเป็น^[TODO|FIXME] \v\C(<TODO>|<FIXME>)ขออภัยในความไม่สะดวกฉันยังคงเรียนรู้ vimscript


1
จะลบสัญลักษณ์ได้อย่างไรเมื่อTODOความคิดเห็นถูกลบไปแล้ว?

1
นั่นไม่ใช่สิ่งที่ฉันคาดหวังเพราะนั่นลบtodoสัญญาณทั้งหมดแต่เพียงแค่สังเกตเห็นว่าการลบเส้นที่มีการลบเครื่องหมายดังนั้นก็โอเค

1
silent! sign undefine todoตกลงฉันได้เพิ่มบรรทัดนี้ที่จุดเริ่มต้นของการทำงาน: มันลบเครื่องหมายสิ่งที่ต้องทำถ้ามันมีอยู่แล้วเพื่อให้ถ้าสัญญาณของคุณถูกวางผิดที่หลังจากลบบรรทัดที่มีคำหลักที่ต้องทำหรือ FIXME คุณสามารถเรียกคืนฟังก์ชั่นเพื่อแก้ไขได้ทันที
saginaw

2
regex ผิดผมพิมพ์แต่มันควรจะได้รับ^[TODO|FIXME] \v(TODO|FIXME)regex ใหม่จะตรงกับสายที่มีหนึ่งในคำหลัก some code # FIXME this line needs to be fixedแต่ไม่เริ่มต้นของบรรทัดเนื่องจากผมคิดว่าสายอาจมีรหัสบางอย่างก่อนที่ความคิดเห็นสำหรับตัวอย่างเช่นนี้ regex ก่อนหน้านี้เป็นความผิดพลาดอย่างสมบูรณ์ขอโทษสำหรับความไม่สะดวกที่ฉันยังคงเรียนรู้ vimscript ...
นอว์

1
ปัญหาของวิธีนี้คือมันจะหลุดจากการซิงค์อย่างรวดเร็วหากคุณปรับเปลี่ยนบัฟเฟอร์เช่นเพิ่มอีกบรรทัดเหนือบรรทัด TODO
Christian Brabandt

6

คุณสามารถใช้ปลั๊กอินDynamicSignsของฉัน สิ่งนี้อนุญาตให้เรียกว่า "SignExpression" ซึ่งคล้ายกับนิพจน์การพับ

ดังนั้นคุณสามารถทำได้ :SignExpression getline(v:lnum)=~'TODO'?'Warning':0

อ่านความช่วยเหลือสำหรับตัวอย่างเพิ่มเติมของสิ่งที่เป็นไปได้

ข้อได้เปรียบของการใช้ปลั๊กอินของฉันคือมันจะติดตามการเปลี่ยนแปลงของบัฟเฟอร์และปรับสัญญาณตาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.