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 : []
endfunction
cd
したらその結果を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 を参考にさせていただきました.