进入:E
目录模式始终显示菜单的顶部,但如果我有很多文件,我必须滚动很多。我可以将目录视图聚焦到当前文件名,或尽可能接近文件名(如果没有写入)?
如果文件没有被写入,那是因为有时当我:E
时,因为我打开了错误的文件
如果我试图打开dir1/dir2/dir3/filename.txt
,我搞砸了,而是:
:new dir1/dir2/dir3/filenam
现在,我想做:E
,并在f
部分开始使用dir3,而不是在目录的最顶层
即使我打开了正确的文件,我仍然希望:E
视图从当前打开的文件开始(或尽可能接近名称)
这可能吗?
答案 0 :(得分:1)
基本上,您要做的是使用发出命令:Explore
时所处文件的文件名来执行搜索。通常这个备用文件的文件名包含在寄存器@#
中(参见:h quote#
),但netrw有点奇怪,在进入时似乎没有更新目录列表。
这意味着在进入netrw缓冲区之前,您必须弄清楚并以某种方式传递您要搜索的术语。我选择通过将当前文件的名称(expand('%:t')
)解析为命令序列:Explore
来执行此操作,方法是在.vimrc
中重新定义命令以包含对此术语的搜索:< / p>
autocmd VimEnter * com! -nargs=* -bar -bang -count=0 -complete=dir Explore execute "call netrw#Explore(<count>,0,0+<bang>0,<q-args>)" . ' | call SearchNetrw(' . string(expand('%:t')) . ')'
需要 au VimEnter
,因为netrw插件是在加载.vimrc
之后获取的,否则将使用默认定义覆盖此命令。当前文件的名称被传递给对函数SearchNetrw
的调用,我将其定义为:
function! SearchNetrw(fname)
if ! search('\V\^' . a:fname . '\$')
call search('^' . substitute(a:fname, '\w\zs.*', '', '') . '.*\/\@<!$')
endif
endfunction
该函数首先尝试使用作为参数提供给它的文件的整个名称进行搜索,如果找不到,则使用文件名的第一个单词字符进行搜索(至确保优先处理dotfiles等,并忽略文件夹(在列表中以/
结尾的行)。除此之外,我没有包含任何特殊情况的处理,例如当你是一个没有名字的缓冲区时会发生什么,即使在这种特殊情况下它会非常优雅地将你带到列表中的第一个文件。