unite-filters の converter で値を足し込む時の注意
unite.vim の候補にファイルの更新日を追加したいと思うことがあります。
その場合は unite-filters の converter を使用して候補の表示形式を設定することができます。
let s:filters = { \ "name" : "converter_add_updatetime", \ "description" : "add updatetime" \} function! s:filters.filter(candidates, context) for candidate in a:candidates let updatetime = strftime("(%Y/%m/%d %H:%M:%S) ", getftime(candidate.action__path)) " abbr に更新日を追加する let candidate.abbr = updatetime . candidate.abbr endfor return a:candidates endfunction call unite#define_filter(s:filters) unlet s:filters call unite#custom#source('file', 'converters', ["converter_add_updatetime"])
上記のように更新日を追加することができます。
しかし、converter は候補の絞り込みを行うたびに処理が行われ、そのたびに更新日の情報がどんどん追加されていってしまいます。
この問題を回避するためにはコピーした candidates を使用して、その値を返す必要があります。
let s:filters = { \ "name" : "converter_add_updatetime", \ "description" : "add updatetime" \} function! s:filters.filter(candidates, context) let candidates = deepcopy(a:candidates) for candidate in candidates let updatetime = strftime("(%Y/%m/%d %H:%M:%S) ", getftime(candidate.action__path)) let candidate.abbr = updatetime . candidate.abbr endfor return candidates endfunction call unite#define_filter(s:filters) unlet s:filters call unite#custom#source('file', 'converters', ["converter_add_updatetime"])
これで値がどんどん足し込まれていく問題を回避することができます。