runtime(zip): refactor save and restore of options
Commit:
https://github.com/vim/vim/commit/19636be55e023cb726389107e9e7d62049b6fd58
Author: Christian Brabandt <[email protected]>
Date: Mon Aug 5 21:00:07 2024 +0200
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)
Signed-off-by: Christian Brabandt <[email protected]>
diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim
index cf7013518..7e833fe5a 100644
--- a/runtime/autoload/zip.vim
+++ b/runtime/autoload/zip.vim
@@ -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://\(.\{-}\)::[^\].*$',' ','')
@@ -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
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/E1sbOwh-001kDx-1C%40256bit.org.