6

我正在尝试使用打开文件的相对路径将我的会话保存在 Vim 中。使用cur_dirin sessionoptions,文件的路径将是相对的 wrt。当前目录,但会话文件包含cd /path/to/base/directory命令:

...
cd /path/to/base
badd +0 relpath1/file
badd +0 relpath2/file
...

如果我忽略curdirsessionoptions,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

4 回答 4

7

如果不为其设置包装函数,AFAIK,您将无法做到这一点。

例如:

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
于 2012-11-10T15:17:53.260 回答
0

我用额外的一行修改了 Botykai 的答案,以全局删除绝对路径。

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

如果有人可以改进上述功能以将行缩小到仅以 开头的行badd,那就更好了。

于 2019-02-25T20:57:38.593 回答
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 上)。

于 2021-01-13T23:28:16.570 回答
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
于 2021-04-09T23:37:06.973 回答