NERDTree 实时预览(像 sublime sidebar)
NERDTree live-preview (like sublime sidebar)
Sublime 的侧边栏有一个很酷的功能,我只需按下箭头键就可以快速浏览编辑器窗格中每个文件的外观。它实际上并没有打开文件——只是在编辑器窗格中显示它。
我想在 Vim(或 Vinegar/netrw 中用 NERDTree 做同样的事情,这并不重要)。我知道 NERDTree 允许我使用 go
打开光标下的文件,同时保持树处于焦点状态,但是 (a) 需要两次击键,并且 (b) 它为我 [=17] 的每个文件创建一个新缓冲区=] 像这样,所以...真的没有多少预览。
有没有办法让 NERDTree 或 Vim 模拟此 Sublime 功能?
是的,有。 Vim 有一个功能叫做 "preview window"。您可以使用 :pedit <filename>
在预览 window 中打开文件。如果你想把它插入 NERDTree,你可以在 ~/.vim/nerdtree_plugin/
目录中创建一个文件,例如 "live_preview_mapping.vim",包含以下内容:
if exists("g:loaded_nerdree_live_preview_mapping")
finish
endif
let g:loaded_nerdree_live_preview_mapping = 1
call NERDTreeAddKeyMap({
\ 'key': '<up>',
\ 'callback': 'NERDTreeLivePreview',
\ 'quickhelpText': 'preview',
\ })
function! NERDTreeLivePreview()
" Get the path of the item under the cursor if possible:
let current_file = g:NERDTreeFileNode.GetSelected()
if current_file == {}
return
else
exe 'pedit '.current_file.path.str()
endif
endfunction
第一部分只是一个加载保护,所以文件只获取一次,只是样板文件。第二部分使用 NERDTree API 为调用给定回调函数的 <up>
键添加一个键映射。
回调函数是代码的核心,但它应该相当容易理解——它获取光标下的节点(如果有的话),并使用文件名执行 :pedit
。
您甚至可以使用简单的特定于文件类型的映射更轻松地完成此操作,如下所示:
autocmd FileType nerdtree nnoremap <buffer> <up> :call NERDTreeLivePreview()<cr>
但前者是插件推荐的方法(参见:help NERDTreeAPI
)。如果不出意外,这会为它的 ?
键添加一个帮助条目,并将 nerdtree 扩展保存在一个地方。
有关预览 window 的更多信息,请尝试 :help preview-window
。例如,您可以使用 <c-w>z
关闭它,但您可以将其映射到您想要的任何内容,这与 NERDTree 不再真正相关。如果您对 window 的显示位置不满意,请考虑将 "pedit" 更改为 "botright pedit" 或 "leftabove pedit" 或您想要的任何内容。查看 :leftabove
的帮助并查看下面的相关命令。
使用 netrw,预览文件:将光标放在文件上方,按 "p"。
NERDTree 不提供任何开箱即用的自动功能。我喜欢预览 window 劫持最后一个活动 window 并允许在那里打开缓冲区,或与原始缓冲区分开。这个扩展可以做到这一点,而且它的源代码很短。
Sublime 的侧边栏有一个很酷的功能,我只需按下箭头键就可以快速浏览编辑器窗格中每个文件的外观。它实际上并没有打开文件——只是在编辑器窗格中显示它。
我想在 Vim(或 Vinegar/netrw 中用 NERDTree 做同样的事情,这并不重要)。我知道 NERDTree 允许我使用 go
打开光标下的文件,同时保持树处于焦点状态,但是 (a) 需要两次击键,并且 (b) 它为我 [=17] 的每个文件创建一个新缓冲区=] 像这样,所以...真的没有多少预览。
有没有办法让 NERDTree 或 Vim 模拟此 Sublime 功能?
是的,有。 Vim 有一个功能叫做 "preview window"。您可以使用 :pedit <filename>
在预览 window 中打开文件。如果你想把它插入 NERDTree,你可以在 ~/.vim/nerdtree_plugin/
目录中创建一个文件,例如 "live_preview_mapping.vim",包含以下内容:
if exists("g:loaded_nerdree_live_preview_mapping")
finish
endif
let g:loaded_nerdree_live_preview_mapping = 1
call NERDTreeAddKeyMap({
\ 'key': '<up>',
\ 'callback': 'NERDTreeLivePreview',
\ 'quickhelpText': 'preview',
\ })
function! NERDTreeLivePreview()
" Get the path of the item under the cursor if possible:
let current_file = g:NERDTreeFileNode.GetSelected()
if current_file == {}
return
else
exe 'pedit '.current_file.path.str()
endif
endfunction
第一部分只是一个加载保护,所以文件只获取一次,只是样板文件。第二部分使用 NERDTree API 为调用给定回调函数的 <up>
键添加一个键映射。
回调函数是代码的核心,但它应该相当容易理解——它获取光标下的节点(如果有的话),并使用文件名执行 :pedit
。
您甚至可以使用简单的特定于文件类型的映射更轻松地完成此操作,如下所示:
autocmd FileType nerdtree nnoremap <buffer> <up> :call NERDTreeLivePreview()<cr>
但前者是插件推荐的方法(参见:help NERDTreeAPI
)。如果不出意外,这会为它的 ?
键添加一个帮助条目,并将 nerdtree 扩展保存在一个地方。
有关预览 window 的更多信息,请尝试 :help preview-window
。例如,您可以使用 <c-w>z
关闭它,但您可以将其映射到您想要的任何内容,这与 NERDTree 不再真正相关。如果您对 window 的显示位置不满意,请考虑将 "pedit" 更改为 "botright pedit" 或 "leftabove pedit" 或您想要的任何内容。查看 :leftabove
的帮助并查看下面的相关命令。
使用 netrw,预览文件:将光标放在文件上方,按 "p"。
NERDTree 不提供任何开箱即用的自动功能。我喜欢预览 window 劫持最后一个活动 window 并允许在那里打开缓冲区,或与原始缓冲区分开。这个扩展可以做到这一点,而且它的源代码很短。