行にToDoグループ(ToDo、FIXME ...)がある場合は常に、signs列に表示される記号を追加できますか?
カラースキームを調整して、Todoグループのハイライトを変更しましたが、Syntasticのエラーや警告などの標識列にインジケーターを表示したいと考えています。
行にToDoグループ(ToDo、FIXME ...)がある場合は常に、signs列に表示される記号を追加できますか?
カラースキームを調整して、Todoグループのハイライトを変更しましたが、Syntasticのエラーや警告などの標識列にインジケーターを表示したいと考えています。
回答:
この機能を試してください:
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であるファイルを開いたときに関数が自動的に呼び出されるようにするには、次のようにします。
autocmd FileType markdown call SignKeyword()
関数の最初の行ではsilent! sign undefine todo
、サインtodoが既に存在する場合はそれを削除します。そのため、行を削除または追加した後にサインが誤った場所に配置された場合は、関数を呼び出してすぐに修正できます。
2行目は、名前がtodo、テキストが>>
(好みに合わせて変更できます)、検索強調グループ(同じもの)を使用する記号を定義しています。
3行目では、グローバルコマンドを使用しています。
:g/pattern/command
グローバルコマンドは、パターンに一致するすべての行でコマンドを実行します。
ここでのパターンはです\v\C(<TODO>|<FIXME>)
。これは、単語TODOまたはFIXMEを含む行を意味します。
正規表現にはアトムが含まれる\C
ため、検索では大文字と小文字が区別されます( 'ignorecase'オプションが何であっても)。検索で大文字と小文字を区別しない場合は、に変更し\c
ます。
このような行が見つかると、次の行が関数によって実行されます。
execute "sign place 9999 line=" . line('.')
\ . " name=todo buffer=" . bufnr('')
:execute
次の文字列の内容を(コマンドで)実行します。
"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')
文字列には、2つのvim組み込み関数: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
バッファ5の行10に符号を配置するコマンドです
。9999は、符号に選択されたランダムIDです(別のIDを選択できます)。
関数の4行目:nohlsearch
は、一致したパターンの強調表示を無効にします。
編集:正規表現を修正しました。オリジナルは間違っていました。私は書いた^[TODO|FIXME]
が、その代わりにすべきだと思う\v\C(<TODO>|<FIXME>)
。ご不便をおかけして申し訳ありません。まだvimscriptを学習しています。
silent! sign undefine todo
。TODOまたはFIXMEというキーワードが含まれている行を削除した後に記号が誤って配置された場合、記号todoが既に存在する場合はそれを削除して、すぐに修正する関数を呼び出すことができます。
^[TODO|FIXME]
が、そうではありません\v(TODO|FIXME)
でした。新しい正規表現は、キーワードの1つを含む行と一致しますが、行の先頭は一致しませんsome code # FIXME this line needs to be fixed
。これは、このようなコメントの前にコードが含まれている可能性があるためです。以前の正規表現は完全に間違っていました。ご不便をおかけして申し訳ありません。私はまだvimscriptを学習しています...
私のDynamicSignsプラグインを使用できます。これにより、折り畳み式に似た、いわゆる「SignExpression」が可能になります。
だからあなたは簡単に行うことができます :SignExpression getline(v:lnum)=~'TODO'?'Warning':0
可能なことのより多くの例については、ヘルプをお読みください。
私のプラグインを使用する利点は、それがバッファーの変更を追跡し、それに応じて標識を調整することです。
TODO
コメントが削除された後にサインを削除する方法?