diff --git a/plugin/gnupg.vim b/plugin/gnupg.vim index 5be49c2..4be9130 100644 --- a/plugin/gnupg.vim +++ b/plugin/gnupg.vim @@ -1,5 +1,5 @@ " Name: gnupg.vim -" Last Change: 2017 Feb 14 +" Last Change: 2017 May 31 " Maintainer: James McCoy " Original Author: Markus Braun " Summary: Vim plugin for transparent editing of gpg encrypted files. @@ -220,24 +220,35 @@ highlight default link GPGHighlightUnknownRecipient ErrorMsg " Section: Functions {{{1 -" Function: s:shellescape(s[, special]) {{{2 +" Function: s:shellescape(s[, dict]) {{{2 " " Calls shellescape(), also taking into account 'shellslash' " when on Windows and using $COMSPEC as the shell. " +" Recognized keys are: +" special - Passed through as special argument for Vim's shellescape() +" cygpath - When true and s:useCygpath is true, adjust the path to work with +" Gpg4win from cygwin +" " Returns: shellescaped string " function s:shellescape(s, ...) - let special = a:0 ? a:1 : 0 + let opts = a:0 ? a:1 : {} + let special = get(opts, 'special', 0) + let cygpath = get(opts, 'cygpath', 0) + let s = a:s + if cygpath && s:useCygpath + let s = matchstr(system('cygpath -am '.shellescape(s)), '[^\x0a\x0d]*') + endif if exists('+shellslash') && &shell == $COMSPEC let ssl = &shellslash set noshellslash - let escaped = shellescape(a:s, special) + let escaped = shellescape(s, special) let &shellslash = ssl else - let escaped = shellescape(a:s, special) + let escaped = shellescape(s, special) endif return escaped @@ -387,6 +398,13 @@ function s:GPGInit(bufread) let s:GPGCipher = substitute(output, ".*Cipher: \\(.\\{-}\\)\n.*", "\\1", "") let s:GPGHash = substitute(output, ".*Hash: \\(.\\{-}\\)\n.*", "\\1", "") let s:GPGCompress = substitute(output, ".*Compress.\\{-}: \\(.\\{-}\\)\n.*", "\\1", "") + let s:GPGHome = matchstr(output, '.*Home: \zs.\{-}\ze\r\=\n') + + let s:useCygpath = 0 + if has('win32unix') && s:GPGHome =~ '\a:[/\\]' + call s:GPGDebug(1, 'Enabling use of cygpath') + let s:useCygpath = 1 + endif " determine if gnupg can use the gpg-agent if (str2float(gpgversion) >= 2.1 || (exists("$GPG_AGENT_INFO") && g:GPGUseAgent == 1)) @@ -476,7 +494,7 @@ function s:GPGDecrypt(bufread) " find the recipients of the file let cmd = { 'level': 3 } - let cmd.args = '--verbose --decrypt --list-only --dry-run --no-use-agent --logger-fd 1 ' . s:shellescape(filename) + let cmd.args = '--verbose --decrypt --list-only --dry-run --no-use-agent --logger-fd 1 ' . s:shellescape(filename, { 'cygpath': 1 }) let output = s:GPGSystem(cmd) " Suppress the "N more lines" message when editing a file, not when reading @@ -568,7 +586,7 @@ function s:GPGDecrypt(bufread) " we must redirect stderr (using shell temporarily) call s:GPGDebug(1, "decrypting file") let cmd = { 'level': 1, 'ex': silent . 'read ++edit !' } - let cmd.args = '--quiet --decrypt ' . s:shellescape(filename, 1) + let cmd.args = '--quiet --decrypt ' . s:shellescape(filename, { 'special': 1, 'cygpath': 1 }) call s:GPGExecute(cmd) if (v:shell_error) " message could not be decrypted @@ -710,7 +728,7 @@ function s:GPGEncrypt() let destfile = tempname() let cmd = { 'level': 1, 'ex': "'[,']write !" } let cmd.args = '--quiet --no-encrypt-to ' . options - let cmd.redirect = '>' . s:shellescape(destfile, 1) + let cmd.redirect = '>' . s:shellescape(destfile, { 'special': 1, 'cygpath': 1 }) silent call s:GPGExecute(cmd) if (v:shell_error) " message could not be encrypted @@ -1349,7 +1367,7 @@ endfunction function s:GPGSystem(dict) let commandline = s:GPGCommand if (!empty(g:GPGHomedir)) - let commandline .= ' --homedir ' . s:shellescape(g:GPGHomedir) + let commandline .= ' --homedir ' . s:shellescape(g:GPGHomedir, { 'cygpath': 1 }) endif let commandline .= ' ' . a:dict.args let commandline .= ' ' . s:stderrredirnull @@ -1376,7 +1394,7 @@ endfunction function s:GPGExecute(dict) let commandline = printf('%s%s', a:dict.ex, s:GPGCommand) if (!empty(g:GPGHomedir)) - let commandline .= ' --homedir ' . s:shellescape(g:GPGHomedir, 1) + let commandline .= ' --homedir ' . s:shellescape(g:GPGHomedir, { 'special': 1, 'cygpath': 1 }) endif let commandline .= ' ' . a:dict.args if (has_key(a:dict, 'redirect'))