:E 在目录视图中聚焦当前文件名

:E focus current filename in directory view

进入:E目录模式总是显示菜单的顶部,但如果我有很多文件,我必须滚动很多次。我能否让目录视图聚焦当前文件名,或尽可能接近文件名(如果未写入)?

如果文件没有写入,是因为有时我写入时:E,是因为我打开了错误的文件 如果我试图打开 dir1/dir2/dir3/filename.txt,但我搞砸了,而是执行:

:new dir1/dir2/dir3/filenam

现在,我想 :E,让 dir3 从 f 部分开始,而不是在目录的最顶部

即使我打开了正确的文件,我仍然希望 :E 视图从当前打开的文件开始(或尽可能靠近文件名)

这可能吗?

基本上您要做的是使用发出命令 :Explore 时所在文件的文件名执行搜索。通常这个 备用文件 的文件名包含在寄存器 @# 中(参见 :h quote#),但是 netrw 有点奇怪,当进入目录列表。

这意味着在转到 netrw 缓冲区之前,您必须找出并以某种方式传递您要搜索的术语。我选择通过将当前文件的名称 (expand('%:t')) 解析为命令序列 :Explore 来执行此操作,方法是在 .vimrc 中重新定义命令以包括对该术语的搜索:

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

该函数首先尝试使用作为参数提供给它的文件的全名进行搜索,如果没有找到,它将使用第一个 单词字符 进行搜索文件名(以确保优雅地处理点文件等),并忽略文件夹(列表中以 / 结尾的行)。除此之外,我没有包括任何特殊情况的处理,例如当你是一个没有名字的缓冲区时会发生什么,即使在那种特定情况下它表现得非常优雅地把你带到列表中的第一个文件。