Vim でオレオレ gf を書いた

Vim の gf はカーソル下のファイルを開けたりして便利なのですが、Ruby の require で使用した場合、ファイルではなくてディレクトリが開かれてしまうので、ついカッとなってオレオレ gf 書いた。

function! s:open_cmd(file_cmd, dir_cmd, file)
    if filereadable(a:file)
        return a:file_cmd . " " . a:file
    elseif isdirectory(a:file)
        return a:dir_cmd . " " . a:file
    else
        return ""
    endif
endfunction


function! s:goto_file(file_open, dir_open, file)
    let files = split(substitute(globpath(&path, a:file), '\\', '/', "g"), "\n")
    let exts  = split(&suffixesadd, '[,;]')
    if !empty(exts)
        let files = eval(join(map(exts, 'map(copy(files), "v:val . ''" . v:val . "''")'), '+')) + files
    endif
    let openable = sort(filter(files, 'isdirectory(v:val) || filereadable(v:val)'), reti#lambda("filereadable(a:2) - filereadable(a:1)"))
    if empty(openable)
        return ""
    endif
    return ":" . s:open_cmd(a:file_open, a:dir_open, openable[0]) . "\<CR>"
endfunction


nnoremap <expr> gf <SID>goto_file("Tabdrop", "VimFilerTab", expand("<cfile>"))