自分はVimでのバッファ移動によくタグスタックを使っている。
思考スタイル的にすぐ前に戻るという感覚がやりやすいのか、telescopeでファイルを開いたときも全部タグスタックに積んでコマンド入力でポンポン前のファイルに戻っている。
https://nametake.dev/posts/2023/12/13/telescope-nvim-git-files-tagstack/
ただ、Vimのファイラである NREDTree では標準機能で開いたファイルをタグスタックに積む方法がなかった。
そのため、ちょっとNERDTreeでファイルを開いたときにも前のファイルに戻れるようにちょっとだけスクリプトを書いたのでそれのメモ。
やったこと Link to heading
以下のようなことを実現することで解決している。
- NERDTreeを開いたときにファイルの位置情報を記録する
- NERDTreeからファイルを開いたときに記録した情報をタグスタックに書き込む
上記のようにすることで、ただNERDTreeを開いたときにはタグスタックに情報が積まれないようにしている。
以下のような関数とマップを定義。
function! CacheTagStackPosition() abort
let s:old_location = [bufnr('%'), line('.'), col('.'), 0]
let s:tagname = expand('<cword>')
let s:winid = win_getid()
endfunction
function! SetTagStackFromCache() abort
call settagstack(s:winid, {'items': [{'from': s:old_location, 'tagname': s:tagname}]}, 'a')
endfunction
nmap <silent> <Plug>(cache-tag-stack-position) :<C-u>call CacheTagStackPosition()<CR>
nmap <silent> <Plug>(set-tag-stack-from-cache) :<C-u>call SetTagStackFromCache()<CR>
スクリプトローカルな変数にファイルの位置情報を記録するようにして、タグスタックに書き込むときにはその値を利用するようにしている。
上記で定義したキーマップを以下のようにしてNERDTreeのファイル開閉と紐付け。
Plug 'preservim/nerdtree'
nnoremap <silent> <Space>f <Plug>(cache-tag-stack-position):<C-u>NERDTreeFind<CR>
nmap <silent> <Plug>(nerdtree-cr) :<C-u>call nerdtree#ui_glue#invokeKeyMap("\<CR\>")<CR>
autocmd MyAutoCmd FileType nerdtree map <buffer> <CR> <Plug>(set-tag-stack-from-cache)<Plug>(nerdtree-cr)
NERDTree自体はファイルを開くKeyMapを定義していなかったので、マッピングされているものから自分で定義して実現している。
これでファイルを開いたとき、いい感じにタグスタックへ情報が積まれるようになった。
もっといい方法はあるのかもしれないが、とりあえずこれで動いているのでしばらく様子見。