cdで移動したディレクトリを記録して,カレントディレクトリに関係なく過去に移動したディレクトリに移動できるコマンドです.
導入などは以下参照.
autojumpを Vim から使えるようにしてみました.
導入
NeoBundle 'zoncoen/unite-autojump'使い方
:Unite autojump.vimrcに以下のように書いておけば,:jで呼び出せて便利(かもしれない).
nnoremap :j :<C-u>Unite autojump<CR>簡単な解説
autojump --statで取得できるので,その結果を unite.vim に渡しています.
let s:autojump_command = 'autojump -s'
let s:unite_source = {
\ 'name': 'autojump',
\ 'description': 'candidates from autojump database',
\ 'default_action' : 'cd_autojump',
\ }
function! s:unite_source.gather_candidates(args, context)
let l:directories = reverse(split(unite#util#system(s:autojump_command),"\n"))[7:]
return map(directories,
\ '{
\ "word": split(v:val, "\t")[1],
\ "source": "autojump",
\ "kind": "cdable",
\ "action\_\_directory": split(v:val, "\t")[1],
\ }')
endfunction
function! unite#sources#autojump#define()
return exists('s:autojump_command') ? s:unite_source : []
endfunctioncdしたらその結果をautojump --addで autojump のデータベースに反映するcd_autojumpという unite action を定義しています.
let s:autojump_add_command = 'autojump -a %s'
let s:action = {
\ 'description': 'change current working directory with adding path to autojump database',
\ 'is_selectable': 0,
\ }
function! s:action.func(candidate)
if a:candidate.action**directory != ''
execute g:unite_kind_cdable_cd_command a:candidate.action**directory
echo a:candidate.action**directory
call unite#util#system(printf('autojump -a %s', a:candidate.action**directory))
endif
endfunction
call unite#custom#action('cdable', 'cd_autojump', s:action)TODO
cdコマンドのように,Vim 上での:cdでも移動先のパスを autojump のデータベースに反映できたらなぁと思ってます.
:cdに hook して処理を行うことができればよさそう( autocmd のオレオレ event を作る?).
Vim 力高い方アドバイスお願いします :-)
まとめ
:helpや ujihisa さんの unite-locate を参考にさせていただきました.