Session 力维姆';要使用相对路径吗?
我正试图用打开文件的相对路径在Vim中保存会话。使用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
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