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"])


これで値がどんどん足し込まれていく問題を回避することができます。