vim-patch:19636be: runtime(zip): refactor save and restore of options

Problem:  zip plugin has no way to set/restore option values
Solution: Add the SetSaneOpts() and RestoreOpts() functions,
          so options that cause issues are set to sane values
          and restored back to their initial values later on.
          (this affects the 'shellslash' option on windows, which also
          changes how the shellescape() function works)

19636be55e

Co-authored-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq 2024-08-07 07:07:29 +08:00
parent 11c57c25ef
commit 92981c8e0b

View File

@ -83,14 +83,13 @@ fun! zip#Browse(zipfile)
return
endif
let repkeep= &report
set report=10
let dict = s:SetSaneOpts()
" sanity checks
if !executable(g:zip_unzipcmd)
redraw!
echohl Error | echomsg "***error*** (zip#Browse) unzip not available on your system"
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
if !filereadable(a:zipfile)
@ -99,7 +98,7 @@ fun! zip#Browse(zipfile)
redraw!
echohl Error | echomsg "***error*** (zip#Browse) File not readable<".a:zipfile.">" | echohl None
endif
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
if &ma != 1
@ -136,6 +135,7 @@ fun! zip#Browse(zipfile)
exe "keepj r ".fnameescape(a:zipfile)
let &ei= eikeep
keepj 1d
call s:RestoreOpts(dict)
return
endif
@ -147,28 +147,28 @@ fun! zip#Browse(zipfile)
noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>ZipBrowseSelect()<cr>
endif
let &report= repkeep
call s:RestoreOpts(dict)
endfun
" ---------------------------------------------------------------------
" ZipBrowseSelect: {{{2
fun! s:ZipBrowseSelect()
let repkeep= &report
set report=10
let dict = s:SetSaneOpts()
let fname= getline(".")
if !exists("b:zipfile")
call s:RestoreOpts(dict)
return
endif
" sanity check
if fname =~ '^"'
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
if fname =~ '/$'
redraw!
echohl Error | echomsg "***error*** (zip#Browse) Please specify a file, not a directory" | echohl None
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
@ -184,14 +184,13 @@ fun! s:ZipBrowseSelect()
exe "noswapfile e ".fnameescape("zipfile://".zipfile.'::'.fname)
filetype detect
let &report= repkeep
call s:RestoreOpts(dict)
endfun
" ---------------------------------------------------------------------
" zip#Read: {{{2
fun! zip#Read(fname,mode)
let repkeep= &report
set report=10
let dict = s:SetSaneOpts()
if has("unix")
let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
@ -205,7 +204,7 @@ fun! zip#Read(fname,mode)
if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','',''))
redraw!
echohl Error | echomsg "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program" | echohl None
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
@ -225,26 +224,25 @@ fun! zip#Read(fname,mode)
" cleanup
set nomod
let &report= repkeep
call s:RestoreOpts(dict)
endfun
" ---------------------------------------------------------------------
" zip#Write: {{{2
fun! zip#Write(fname)
let repkeep= &report
set report=10
let dict = s:SetSaneOpts()
" sanity checks
if !executable(substitute(g:zip_zipcmd,'\s\+.*$','',''))
redraw!
echohl Error | echomsg "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program" | echohl None
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
if !exists("*mkdir")
redraw!
echohl Error | echomsg "***error*** (zip#Write) sorry, mkdir() doesn't work on your system" | echohl None
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
@ -257,7 +255,7 @@ fun! zip#Write(fname)
" attempt to change to the indicated directory
if s:ChgDir(tmpdir,s:ERROR,"(zip#Write) cannot cd to temporary directory")
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
@ -323,26 +321,25 @@ fun! zip#Write(fname)
call delete(tmpdir, "rf")
setlocal nomod
let &report= repkeep
call s:RestoreOpts(dict)
endfun
" ---------------------------------------------------------------------
" zip#Extract: extract a file from a zip archive {{{2
fun! zip#Extract()
let repkeep= &report
set report=10
let dict = s:SetSaneOpts()
let fname= getline(".")
" sanity check
if fname =~ '^"'
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
if fname =~ '/$'
redraw!
echohl Error | echomsg "***error*** (zip#Extract) Please specify a file, not a directory" | echohl None
let &report= repkeep
call s:RestoreOpts(dict)
return
endif
@ -357,7 +354,7 @@ fun! zip#Extract()
endif
" restore option
let &report= repkeep
call s:RestoreOpts(dict)
endfun
@ -373,15 +370,11 @@ fun! s:Escape(fname,isfilt)
else
let qnameq= g:zip_shq.escape(a:fname,g:zip_shq).g:zip_shq
endif
if exists("+shellslash") && &shellslash && &shell =~ "cmd.exe"
" renormalize directory separator on Windows
let qnameq=substitute(qnameq, '/', '\\', 'g')
endif
return qnameq
endfun
" ---------------------------------------------------------------------
" ChgDir: {{{2
" s:ChgDir: {{{2
fun! s:ChgDir(newdir,errlvl,errmsg)
try
exe "cd ".fnameescape(a:newdir)
@ -400,6 +393,27 @@ fun! s:ChgDir(newdir,errlvl,errmsg)
return 0
endfun
" ---------------------------------------------------------------------
" s:SetSaneOpts: {{{2
fun! s:SetSaneOpts()
let dict = {}
let dict.report = &report
let dict.shellslash = &shellslash
let &report = 10
let &shellslash = 0
return dict
endfun
" ---------------------------------------------------------------------
" s:RestoreOpts: {{{2
fun! s:RestoreOpts(dict)
for [key, val] in items(a:dict)
exe $"let &{key} = {val}"
endfor
endfun
" ------------------------------------------------------------------------
" Modelines And Restoration: {{{1
let &cpo= s:keepcpo