强迫Vim使用相对路径的mksession?

时间:2012-11-10 14:29:56

标签: session vim path relative absolute

我正在尝试使用打开文件的相对路径在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结账到另一个。

4 个答案:

答案 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