我正在尝试使用打开文件的相对路径在Vim中保存会话。在cur_dir
中使用sessionoptions
,文件的路径将是相对的。当前目录,但会话文件包含cd /path/to/base/directory
命令:
...
cd /path/to/base
badd +0 relpath1/file
badd +0 relpath2/file
...
如果我将curdir
从会话选项中删除,cd
命令将消失,但文件路径将是绝对的:
badd +0 /path/to/base/relpath1/file
badd +0 /path/to/base/relpath2/file
有没有办法让只相对路径wrt。什么是创建会话时的当前目录 - 没有插件或编写脚本?这样会话文件只有:
badd +0 relpath1/file
badd +0 relpath2/file
我的最终目标是拥有一个我可以复制的会话文件,例如:从SVN结账到另一个。
答案 0 :(得分:6)
如果不为AFAIK设置包装函数,则无法做到这一点。
E.g。类似的东西:
function! MakeSession()
let b:sessiondir = getcwd()
let b:filename = b:sessiondir . '/session.vim'
exe "mksession! " . b:filename
exe "edit! " . b:filename
exe "g:^cd :d"
exe "x"
endfunction
答案 1 :(得分:0)
我用额外的一行修改了Botykai的答案,以全局删除绝对路径。
WebMvcEndpointHandlerMapping
如果有人可以改善上面的功能以将行缩小到仅以function! MakeSession()
let b:sessiondir = getcwd()
let b:filename = b:sessiondir . '/_vimsession'
exe "mksession! " . b:filename
exe "edit! " . b:filename
" Delete the line start with 'cd ...'
exe "g:^cd :d"
" Vim complains about b:sessiondir being undefined. So I use getcwd() directly
" exe "%s:" . b:sessiondir . "::g". Use ':' to avoid path escape
exe "%s:" . getcwd() . "/::g"
" Save with 'x'
exe "x"
endfunction
开头的行,那会更好。
答案 2 :(得分:0)
我遇到了同样的问题,我使用以下受 Zsolt Botykai 的解决方案和 John Chain 的解决方案启发的函数来解决它。 另外,我定义了一个宏来用更少的按键来执行这个函数。
function! MakeSession()
let cwd = getcwd()
let filename = cwd . '/.vim'
exe "mksession! " . filename
exe "tabedit! " . filename
exe "silent g:^cd :d"
exe "silent g:^lcd :d"
"exe "silent %s:\V" . cwd . "/::ge"
" ^ Don’t work because getcwd() expand the ~ while mksession does not !
exe "silent %s?\\v \\~=/.+/? ?g"
" ^ backslash need to be protected
exe "x"
endfunction
nnoremap <leader>mks :call MakeSession()<cr>
主要区别在于删除完整路径的正则表达式。
它是必需的,因为 getcwd
扩展了主目录的 ~
,但 mksession
没有(在 Mac OS 上)。
答案 3 :(得分:0)
使用 curdir
代替 sesdir
(请参阅 :help sessionoptions
)时解决方案更简单,因为绝对路径在会话文件 (cd path
) 中仅出现一次。因此,MakeSession
函数较小(我将会话文件称为 .vim
):
function! MakeSession()
exe "mksession! .vim"
exe "tabedit! .vim"
exe "silent g:^cd :d"
exe "x"
endfunction
nnoremap <leader>mks :call MakeSession()<cr>
选择会话文件的名称(执行::call MakeNamedSession('foo')
):
function! MakeNamedSession(arg)
let radical = a:arg
exe "mksession! " . radical . ".vim"
exe "tabedit! " . radical . ".vim"
exe "silent g:^cd :d"
exe "x"
endfunction