Session 力维姆';要使用相对路径吗?

Session 力维姆';要使用相对路径吗?,session,vim,relative-path,absolute-path,Session,Vim,Relative Path,Absolute Path,我正试图用打开文件的相对路径在Vim中保存会话。使用sessionoptions中的cur\u dir,文件路径将是相对wrt。当前目录,但会话文件包含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

我正试图用打开文件的相对路径在Vim中保存会话。使用
sessionoptions
中的
cur\u dir
,文件路径将是相对wrt。当前目录,但会话文件包含
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签出复制到另一个会话文件。

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

例如,类似于:

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

我用一个额外的行修改了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

如果有人可以改进上面的函数,将行缩小到只从
添加开始的行,这会更好。

我也遇到了同样的问题,我根据的解决方案和的解决方案,使用下面的函数解决了这个问题。 另外,我定义了一个宏来执行这个函数,只需很少的按键

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>
函数!MakeSession()
设cwd=getcwd()
让filename=cwd.'/。维姆
exe“mksession!”。文件名
exe“tabedit!”。文件名
exe“静默g:^cd:d”
exe“静默g:^lcd:d”
“exe”静默%s:\V.cwd./::ge”
“^不工作,因为getcwd()展开~而mksession不展开!
exe“静默%s”\\v\\\~=/.+/??g
“^需要保护反斜杠
exe“x”
端功能
nnoremap mks:调用MakeSession()
主要区别在于正则表达式删除了完整路径。
之所以需要它,是因为
getcwd
扩展了主目录的
~
,但是
mksession
没有扩展(在Mac OS上)。

使用
curdir
而不是
sesdir
(请参见
:help sessionoptions
)时,解决方案更简单,因为绝对路径在会话文件中只出现一次(
cd path
)。因此,
MakeSession
函数更小(我调用了会话文件
。vim
):


你能解释一下
g:^cd:d
吗?我仍然有问题要解决。我发现这一行很重要,但不知道它是做什么的。Thx.Hi@JohnChain,当然。这是一个
ex
模式命令,它在与
cd
的正则表达式匹配的每一行的行上全局执行行删除(
d
)。
function! MakeSession()
    exe "mksession! .vim"
    exe "tabedit! .vim"
    exe "silent g:^cd :d"
    exe "x"
endfunction

nnoremap <leader>mks :call MakeSession()<cr>
function! MakeNamedSession(arg)
    let radical = a:arg
    exe "mksession! " . radical . ".vim"
    exe "tabedit! " . radical . ".vim"
    exe "silent g:^cd :d"
    exe "x"
endfunction