从stdin读取时阻止vim加载会话

时间:2012-12-17 01:47:52

标签: session vim stdin

我最近一直在定制.vimrc,并热爱:mksession给我的力量和便利。我目前在.vimrc到自动加载会话中有以下内容:

function! LoadSession()                                                              
  if argc() == 0 && ! &diff                                                                                                                                                                                                                
    let g:sessiondir = $HOME . "/.vim/sessions" . getcwd()                           
    let g:sessionfile = g:sessiondir . "/session.vim"                                
    if (filereadable(g:sessionfile))                                                 
      exe 'source ' g:sessionfile                                                    
    else                                                                             
      echo "No session loaded." + argc() + argv()                                    
    endif                                                                            
  else                                                                               
    let g:sessionfile = ""                                                           
    let g:sessiondir = ""                                                            
    call ResCur()                                                                    
  endif                                                                              
endfunction

然后我用au VimEnter * nested :call LoadSession()调用它。这适用于大多数情况,除非vim从stdin读取。在这种情况下,会话仍然被加载,但我想防止这种情况发生。我原本认为argc() == 0条件已足够,但看起来调用vim -以从stdin读取会导致argc()不返回0。船尾! ]

我已经尝试了各种各样的事情,看argv(0)(在这种情况下它是空的 - 为什么?),试图找到识别vim正在从stdin读取的方法(它显示了一个消息,它正在这样做,但我无法弄清楚如何利用,等等,但到目前为止没有运气。

我确定我在这里遗漏了一些非常明显的东西,但谷歌和vim :help并没有把我带到任何地方,所以我希望这里有一些善良的灵魂可以为我揭示这一点

3 个答案:

答案 0 :(得分:3)

我发现的作品是

autocmd StdinReadPre * let g:my_is_stdin = 1
在您的.vimrc

,然后在会话保存/加载功能中测试exists("g:my_is_stdin")。请注意,必须通过事件autocmd / VimLeave上的VimEnter运行这些内容才能使此方案正常运行。

答案 1 :(得分:1)

我正在使用的session.vim plugin提供了扩展的会话处理功能。其中,它询问是否应该在Vim启动时恢复以前保存的会话。

但除非您需要插件的其他功能,否则使用映射触发恢复的解决方法也可能很好。

答案 2 :(得分:0)

我在Vim初创公司的加载会话上一直在努力,最终决定这不是一个好主意,主要是因为它不适合插件。

我最终添加了一些用于保存和恢复会话的映射。这样做有一个好处,就是当你进行快速编辑时,你不必乱用你的会话。

map <leader>ss :call CustomSessionSave()<CR>
map <leader>sl :call CustomSessionRestore()<CR>
map <leader>sd :call CustomSessionDelete()<CR>

也许这有帮助