自分は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を定義していなかったので、マッピングされているものから自分で定義して実現している。

これでファイルを開いたとき、いい感じにタグスタックへ情報が積まれるようになった。

もっといい方法はあるのかもしれないが、とりあえずこれで動いているのでしばらく様子見。