Versuchen Sie diese Funktion:
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
Rufen Sie nun die Funktion in der Kommandozeile auf:
:call SignKeyword()
Oder fügen Sie eine Zuordnung hinzu ~/.vimrc
, um sie aufzurufen:
nnoremap <your mapping> :call SignKeyword()<cr>
Oder fügen Sie ein Autocmd hinzu. Wenn Sie beispielsweise möchten, dass die Funktion beim Öffnen einer Datei, deren Dateityp Markdown ist, automatisch aufgerufen wird:
autocmd FileType markdown call SignKeyword()
In der ersten Zeile der Funktion wird silent! sign undefine todo
das Zeichen todo gelöscht, falls es bereits vorhanden ist. Wenn Ihre Zeichen nach dem Löschen oder Hinzufügen einer Zeile falsch platziert werden, können Sie die Funktion aufrufen, um sie sofort zu beheben.
In der zweiten Zeile wird ein Zeichen definiert, dessen Name todo lautet, dessen Text lautet >>
(Sie können ihn nach Ihren Wünschen ändern) und das die Suchmarkierungsgruppe verwendet (dasselbe).
Die dritte Zeile verwendet den globalen Befehl:
:g/pattern/command
Der globale Befehl führt in jeder Zeile einen Befehl aus, der einem Muster entspricht.
Hier ist das Muster \v\C(<TODO>|<FIXME>)
, was bedeutet, dass jede Zeile entweder das Wort TODO oder FIXME enthält .
Die Regex enthält das Atom, \C
sodass die Suche den Fall berücksichtigt (unabhängig davon, welche Option "Ignorieren" ist). Wenn Sie möchten, dass die Suche den Fall nicht berücksichtigt, ändern Sie ihn in \c
.
Immer wenn eine solche Zeile gefunden wird, wird die folgende Zeile von der Funktion ausgeführt:
execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
Es führt (mit dem :execute
Befehl) den Inhalt der folgenden Zeichenfolge aus:
"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')
Die Zeichenfolge enthält zwei in vim integrierte Funktionen: line()
und bufnr()
.
line('.')
Gibt die Nummer der aktuellen Zeile zurück, wenn der globale Befehl eine Übereinstimmung findet, und bufnr('.')
gibt die Nummer des aktuellen Puffers zurück.
Wenn der globale Befehl beispielsweise in Zeile 10 im Puffer 5 eine Übereinstimmung findet, gibt er Folgendes aus:
"sign place 9999 line=" . 10 . " name=todo buffer=" . 5
Die Punkte verketten die Zeichenfolgen und werden schließlich ausgewertet:
"sign place 9999 line=10 name=todo buffer=5"
Mit diesem :sign
Befehl wird ein Zeichen in Zeile 10 in Puffer 5 platziert.
9999 ist eine zufällige ID, die für das Zeichen ausgewählt wurde (Sie können eine andere auswählen).
Die vierte Zeile der Funktion :nohlsearch
deaktiviert die Hervorhebung der übereinstimmenden Muster.
Bearbeiten: Ich habe den regulären Ausdruck behoben, das Original war falsch. Ich schrieb, ^[TODO|FIXME]
aber stattdessen denke ich, dass es sein sollte \v\C(<TODO>|<FIXME>)
. Entschuldigung für die Unannehmlichkeiten, ich lerne immer noch Vimscript.
TODO
Kommentar entfernt wurde?