如何在netrw中让光标自动定位到之前打开的缓冲区?
解决Netrw返回时光标自动定位的方案
方案一:定位到最近从Netrw打开的文件
这个思路是记录你从Netrw打开的最后一个文件,当你回到Netrw时,自动将光标移到该文件所在行。将以下代码添加到你的~/.vimrc或init.vim中:
" 全局变量:保存最近从Netrw打开的文件路径 let g:last_netrw_opened_file = '' " 当从Netrw目录打开文件时,记录该文件的路径 autocmd BufEnter * \ if &filetype ==# 'netrw' | \ let g:netrw_last_dir = expand('%:p:h') | \ else | \ if exists('g:netrw_last_dir') && stridx(expand('%:p'), g:netrw_last_dir) == 0 | \ let g:last_netrw_opened_file = expand('%:p') | \ endif | \ endif " 进入Netrw缓冲区时,定位到最近打开的文件 autocmd BufEnter * \ if &filetype ==# 'netrw' && !empty(g:last_netrw_opened_file) | \ let l:target_filename = fnamemodify(g:last_netrw_opened_file, ':t') | \ call search(l:target_filename, 'w') | \ endif
方案二:恢复Netrw上次的光标位置
这个方案会按目录记录Netrw窗口的光标位置,下次进入同一目录的Netrw时,直接恢复之前的光标位置,更贴合“回到上次浏览位置”的需求:
" 全局变量:按目录保存Netrw的光标位置 let g:netrw_cursor_pos = {} " 离开Netrw缓冲区时,保存当前目录的光标位置 autocmd BufLeave * \ if &filetype ==# 'netrw' | \ let g:netrw_cursor_pos[expand('%:p:h')] = getpos('.') | \ endif " 进入Netrw缓冲区时,恢复对应目录的光标位置 autocmd BufEnter * \ if &filetype ==# 'netrw' | \ let l:current_dir = expand('%:p:h') | \ if has_key(g:netrw_cursor_pos, l:current_dir) | \ call setpos('.', g:netrw_cursor_pos[l:current_dir]) | \ endif | \ endif
注意事项
- 两种方案可以二选一,方案二更适合需要回到上次浏览位置的场景,方案一则专注于定位到最近打开的文件
- 代码添加后,重启Vim或执行
:source ~/.vimrc即可生效 - 如果Netrw切换了显示模式(比如从列表切换到树形视图),光标定位可能会受影响,默认列表模式下表现稳定
内容的提问来源于stack exchange,提问作者Romain Vincent
相关产品推荐
相关产品推荐

