Vim:如何 remove/clear 由 mkview 从 vim 内部创建的视图
Vim: How to remove/clear views created by mkview from inside of vim
mkview 和 loadview 是在 vim 中保存状态的绝妙方法,许多人使用 .vimrc 命令来自动保存所有文件的状态。
au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
这将创建状态文件(在诸如 ~/.vim/view 的位置)
不过,有时您希望清除视图信息,以便文件以全新状态启动。
我能看到的唯一方法是:
- 从命令行中找到并删除相应的 .vim/view/ 文件
- 暂时编辑您的 .vimrc 以关闭加载视图,打开文件,然后恢复 .vimrc
这些都很麻烦,而且涉及在 vim 之外做事。有没有办法:
- 打开一个文件而不做 loadview(或者可能是一种将选项传递给 vimrc 以跳过 loadview 的方法?)所以当我们关闭时我们将有一个清晰的 mkview
- Remove/clear loadview 设置的任何状态,或者从内部删除给定文件的相应 loadview 文件 vim
我想你可以编写一个 shell 脚本,它获取文件路径并试图找出 .vim/view 目录中的 vim 路径的“=+”编码并删除它,然后从 vim 内部调用 shell 脚本,但似乎 vim 应该对此有某种支持。
用户@pkeu 指出,如果您有自动视图创建功能,那么如果您当前正在查看要为其删除视图的文件,则需要将其关闭,否则当您退出时它会再次创建它,您可以通过更改 mkview 自动命令来确保这一点:
au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
捆绑在一个名为 "keepview" 的组中 - 这使得它们很容易关闭:
:augroup keepview
: autocmd BufWinLeave ?* mkview
: autocmd BufWinEnter ?* silent loadview
:autogroup END
然后可以通过在 endfunction 之前添加这一行来关闭它们:
:autocmd! keepview
此方法的唯一问题是 MyDeleteView 不够智能,无法检查您当前是否正在查看要删除的文件,如果没有,则不会保存当前文件的视图.另一种选择是根本不添加它,只删除当前未打开的文件的视图。或者编写一个更智能的 MyDeleteView() 来检查您当前是否在文件中。
由于自动视图处理是由:autocmd
触发的,您可以通过
暂时禁用视图加载
:noautocmd edit myfile
请注意,这也会关闭由其他插件/自定义完成的任何挂钩。
要从 Vim 中删除文件,您可以使用 delete()
定义自定义命令:
:command! -nargs=1 DeleteView call delete(&viewdir . '/' . <q-args>)
这可以通过构建 globbing 甚至 Vim 的文件规范转义到它来进一步改进。
看起来 vim 没有这个能力,所以我需要写一个 vim 脚本来正确引用(感谢 Ingo 的灵感和关于 '&viewdir' 的注释).
这是 vim 脚本,您可以将其添加到您的 .vimrc 以将命令添加到 vim:
" # Function to permanently delete views created by 'mkview'
function! MyDeleteView()
let path = fnamemodify(bufname('%'),':p')
" vim's odd =~ escaping for /
let path = substitute(path, '=', '==', 'g')
if empty($HOME)
else
let path = substitute(path, '^'.$HOME, '\~', '')
endif
let path = substitute(path, '/', '=+', 'g') . '='
" view directory
let path = &viewdir.'/'.path
call delete(path)
echo "Deleted: ".path
endfunction
" # Command Delview (and it's abbreviation 'delview')
command Delview call MyDeleteView()
" Lower-case user commands: http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev
cabbrev delview <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'Delview' : 'delview')<CR>
添加后,你可以简单地做:
:delview
从命令行删除为当前 buffer/file
创建的视图
您的 $HOME 环境变量必须设置为 vim 认为“~”的值
mkview 和 loadview 是在 vim 中保存状态的绝妙方法,许多人使用 .vimrc 命令来自动保存所有文件的状态。
au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
这将创建状态文件(在诸如 ~/.vim/view 的位置)
不过,有时您希望清除视图信息,以便文件以全新状态启动。
我能看到的唯一方法是:
- 从命令行中找到并删除相应的 .vim/view/ 文件
- 暂时编辑您的 .vimrc 以关闭加载视图,打开文件,然后恢复 .vimrc
这些都很麻烦,而且涉及在 vim 之外做事。有没有办法:
- 打开一个文件而不做 loadview(或者可能是一种将选项传递给 vimrc 以跳过 loadview 的方法?)所以当我们关闭时我们将有一个清晰的 mkview
- Remove/clear loadview 设置的任何状态,或者从内部删除给定文件的相应 loadview 文件 vim
我想你可以编写一个 shell 脚本,它获取文件路径并试图找出 .vim/view 目录中的 vim 路径的“=+”编码并删除它,然后从 vim 内部调用 shell 脚本,但似乎 vim 应该对此有某种支持。
用户@pkeu 指出,如果您有自动视图创建功能,那么如果您当前正在查看要为其删除视图的文件,则需要将其关闭,否则当您退出时它会再次创建它,您可以通过更改 mkview 自动命令来确保这一点:
au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
捆绑在一个名为 "keepview" 的组中 - 这使得它们很容易关闭:
:augroup keepview
: autocmd BufWinLeave ?* mkview
: autocmd BufWinEnter ?* silent loadview
:autogroup END
然后可以通过在 endfunction 之前添加这一行来关闭它们:
:autocmd! keepview
此方法的唯一问题是 MyDeleteView 不够智能,无法检查您当前是否正在查看要删除的文件,如果没有,则不会保存当前文件的视图.另一种选择是根本不添加它,只删除当前未打开的文件的视图。或者编写一个更智能的 MyDeleteView() 来检查您当前是否在文件中。
由于自动视图处理是由:autocmd
触发的,您可以通过
:noautocmd edit myfile
请注意,这也会关闭由其他插件/自定义完成的任何挂钩。
要从 Vim 中删除文件,您可以使用 delete()
定义自定义命令:
:command! -nargs=1 DeleteView call delete(&viewdir . '/' . <q-args>)
这可以通过构建 globbing 甚至 Vim 的文件规范转义到它来进一步改进。
看起来 vim 没有这个能力,所以我需要写一个 vim 脚本来正确引用(感谢 Ingo 的灵感和关于 '&viewdir' 的注释).
这是 vim 脚本,您可以将其添加到您的 .vimrc 以将命令添加到 vim:
" # Function to permanently delete views created by 'mkview'
function! MyDeleteView()
let path = fnamemodify(bufname('%'),':p')
" vim's odd =~ escaping for /
let path = substitute(path, '=', '==', 'g')
if empty($HOME)
else
let path = substitute(path, '^'.$HOME, '\~', '')
endif
let path = substitute(path, '/', '=+', 'g') . '='
" view directory
let path = &viewdir.'/'.path
call delete(path)
echo "Deleted: ".path
endfunction
" # Command Delview (and it's abbreviation 'delview')
command Delview call MyDeleteView()
" Lower-case user commands: http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev
cabbrev delview <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'Delview' : 'delview')<CR>
添加后,你可以简单地做:
:delview
从命令行删除为当前 buffer/file
创建的视图您的 $HOME 环境变量必须设置为 vim 认为“~”的值