diff --git a/plugin/gnupg.vim b/plugin/gnupg.vim index d498594..39dbca2 100644 --- a/plugin/gnupg.vim +++ b/plugin/gnupg.vim @@ -1,5 +1,5 @@ " Name: gnupg.vim -" Version: $Id: gnupg.vim 2249 2008-07-31 11:43:14Z mbr $ +" Version: $Id: gnupg.vim 2276 2008-08-15 12:50:33Z mbr $ " Author: Markus Braun " Summary: Vim plugin for transparent editing of gpg encrypted files. " Licence: This program is free software; you can redistribute it and/or @@ -68,6 +68,10 @@ " g:GPGPreferArmor " If set to 1 armored data is preferred for new files. Defaults to 0. " +" g:GPGDefaultRecipients +" If set, these recipients are used as defaults when no other recipient is +" defined. This variable is a Vim list. Default is unset. +" " Credits: " - Mathieu Clabaut for inspirations through his vimspell.vim script. " - Richard Bronosky for patch to enable ".pgp" suffix. @@ -78,9 +82,11 @@ " - Karl-Heinz Ruskowski for patch to fix unknown recipients and trust model " and patient beta testing. " - Giel van Schijndel for patch to get GPG_TTY dynamically. +" - Sebastian Luettich for patch to fix issue with symmetric encryption an set +" recipients. " " Section: Plugin header {{{1 -if v:version < 700 +if (v:version < 700) echohl ErrorMsg | echo 'plugin gnupg.vim requires Vim version >= 7.0' | echohl None finish endif @@ -89,7 +95,7 @@ if (exists("g:loaded_gnupg") || &cp || exists("#BufReadPre#*.\(gpg\|asc\|pgp\)") finish endif -let g:loaded_gnupg = "$Revision: 2249 $" +let g:loaded_gnupg = "$Revision: 2276 $" " Section: Autocmd setup {{{1 augroup GnuPG @@ -108,6 +114,9 @@ augroup GnuPG " undo the encryption so we are back in the normal text, directly " after the file has been written. autocmd BufWritePost,FileWritePost *.\(gpg\|asc\|pgp\) call s:GPGEncryptPost() + + " cleanup on leaving vim + autocmd VimLeave *.\(gpg\|asc\|pgp\) call s:GPGCleanup() augroup END " Section: Highlight setup {{{1 @@ -123,7 +132,7 @@ highlight default link GPGHighlightUnknownRecipient ErrorMsg function s:GPGInit() " first make sure nothing is written to ~/.viminfo while editing " an encrypted file. - set viminfo= + set viminfo= " we don't want a swap file, as it writes unencrypted data to disk set noswapfile @@ -148,6 +157,11 @@ function s:GPGInit() let g:GPGPreferArmor = 0 endif + " check if debugging is turned on + if (!exists("g:GPGDefaultRecipients")) + let g:GPGDefaultRecipients = [] + endif + " check if debugging is turned on if (!exists("g:GPGDebugLevel")) let g:GPGDebugLevel = 0 @@ -168,21 +182,21 @@ function s:GPGInit() echohl None endif endif - let s:GPGCommand=g:GPGExecutable . " --use-agent" + let s:GPGCommand = g:GPGExecutable . " --use-agent" else - let s:GPGCommand=g:GPGExecutable . " --no-use-agent" + let s:GPGCommand = g:GPGExecutable . " --no-use-agent" endif " don't use tty in gvim " FIXME find a better way to avoid an error. " with this solution only --use-agent will work - if has("gui_running") - let s:GPGCommand=s:GPGCommand . " --no-tty" + if (has("gui_running")) + let s:GPGCommand = s:GPGCommand . " --no-tty" endif " setup shell environment for unix and windows - let s:shellredirsave=&shellredir - let s:shellsave=&shell + let s:shellredirsave = &shellredir + let s:shellsave = &shell if (match(&shell,"\\(cmd\\|command\\).execute") >= 0) " windows specific settings let s:shellredir = '>%s' @@ -192,21 +206,31 @@ function s:GPGInit() " unix specific settings let s:shellredir = &shellredir let s:shell = 'sh' - let s:stderrredirnull ='2>/dev/null' - let s:GPGCommand="LANG=C LC_ALL=C " . s:GPGCommand + let s:stderrredirnull = '2>/dev/null' + let s:GPGCommand = "LANG=C LC_ALL=C " . s:GPGCommand endif " find the supported algorithms - let &shellredir=s:shellredir - let &shell=s:shell - let output=system(s:GPGCommand . " --version") - let &shellredir=s:shellredirsave - let &shell=s:shellsave + let &shellredir = s:shellredir + let &shell = s:shell + let output = system(s:GPGCommand . " --version") + let &shellredir = s:shellredirsave + let &shell = s:shellsave - let s:GPGPubkey=substitute(output, ".*Pubkey: \\(.\\{-}\\)\n.*", "\\1", "") - 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:GPGPubkey = substitute(output, ".*Pubkey: \\(.\\{-}\\)\n.*", "\\1", "") + let s:GPGCipher = substitute(output, ".*Cipher: \\(.\\{-}\\)\n.*", "\\1", "") + let s:GPGHash = substitute(output, ".*Hash: \\(.\\{-}\\)\n.*", "\\1", "") + let s:GPGCompress = substitute(output, ".*Compress: \\(.\\{-}\\)\n.*", "\\1", "") +endfunction + +" Function: s:GPGCleanup() {{{2 +" +" cleanup on leaving vim +" +function s:GPGCleanup() + " wipe out screen + new +only + redraw! endfunction " Function: s:GPGDecrypt() {{{2 @@ -218,34 +242,34 @@ function s:GPGDecrypt() set bin " get the filename of the current buffer - let filename=escape(expand("%:p"), '\"') + let filename = escape(expand("%:p"), '\"') " clear GPGEncrypted, GPGRecipients and GPGOptions - let b:GPGEncrypted=0 - let b:GPGRecipients=[] - let b:GPGOptions=[] + let b:GPGEncrypted = 0 + let b:GPGRecipients = [] + let b:GPGOptions = [] " find the recipients of the file - let &shellredir=s:shellredir - let &shell=s:shell - let output=system(s:GPGCommand . " --verbose --decrypt --list-only --dry-run --batch --no-use-agent --logger-fd 1 \"" . filename . "\"") - let &shellredir=s:shellredirsave - let &shell=s:shellsave + let &shellredir = s:shellredir + let &shell = s:shell + let output = system(s:GPGCommand . " --verbose --decrypt --list-only --dry-run --batch --no-use-agent --logger-fd 1 \"" . filename . "\"") + let &shellredir = s:shellredirsave + let &shell = s:shellsave call s:GPGDebug(1, "output of command '" . s:GPGCommand . " --verbose --decrypt --list-only --dry-run --batch --no-use-agent --logger-fd 1 \"" . filename . "\"' is:") call s:GPGDebug(1, ">>>>> " . output . " <<<<<") " check if the file is symmetric/asymmetric encrypted if (match(output, "gpg: encrypted with [[:digit:]]\\+ passphrase") >= 0) " file is symmetric encrypted - let b:GPGEncrypted=1 + let b:GPGEncrypted = 1 call s:GPGDebug(1, "this file is symmetric encrypted") - let b:GPGOptions+=["symmetric"] + let b:GPGOptions += ["symmetric"] " find the used cipher algorithm - let cipher=substitute(output, ".*gpg: \\([^ ]\\+\\) encrypted data.*", "\\1", "") + let cipher = substitute(output, ".*gpg: \\([^ ]\\+\\) encrypted data.*", "\\1", "") if (match(s:GPGCipher, "\\<" . cipher . "\\>") >= 0) - let b:GPGOptions+=["cipher-algo " . cipher] + let b:GPGOptions += ["cipher-algo " . cipher] call s:GPGDebug(1, "cipher-algo is " . cipher) else echohl GPGWarning @@ -255,32 +279,32 @@ function s:GPGDecrypt() endif elseif (match(output, "gpg: public key is [[:xdigit:]]\\{8}") >= 0) " file is asymmetric encrypted - let b:GPGEncrypted=1 + let b:GPGEncrypted = 1 call s:GPGDebug(1, "this file is asymmetric encrypted") - let b:GPGOptions+=["encrypt"] + let b:GPGOptions += ["encrypt"] " find the used public keys - let start=match(output, "gpg: public key is [[:xdigit:]]\\{8}") + let start = match(output, "gpg: public key is [[:xdigit:]]\\{8}") while (start >= 0) - let start=start + strlen("gpg: public key is ") - let recipient=strpart(output, start, 8) + let start = start + strlen("gpg: public key is ") + let recipient = strpart(output, start, 8) call s:GPGDebug(1, "recipient is " . recipient) - let name=s:GPGNameToID(recipient) + let name = s:GPGNameToID(recipient) if (strlen(name) > 0) - let b:GPGRecipients+=[name] + let b:GPGRecipients += [name] call s:GPGDebug(1, "name of recipient is " . name) else - let b:GPGRecipients+=[recipient] + let b:GPGRecipients += [recipient] echohl GPGWarning echom "The recipient \"" . recipient . "\" is not in your public keyring!" echohl None end - let start=match(output, "gpg: public key is [[:xdigit:]]\\{8}", start) + let start = match(output, "gpg: public key is [[:xdigit:]]\\{8}", start) endwhile else " file is not encrypted - let b:GPGEncrypted=0 + let b:GPGEncrypted = 0 call s:GPGDebug(1, "this file is not encrypted") echohl GPGWarning echom "File is not encrypted, all GPG functions disabled!" @@ -292,21 +316,21 @@ function s:GPGDecrypt() " check if the message is armored if (match(output, "gpg: armor header") >= 0) call s:GPGDebug(1, "this file is armored") - let b:GPGOptions+=["armor"] + let b:GPGOptions += ["armor"] endif " finally decrypt the buffer content " since even with the --quiet option passphrase typos will be reported, " we must redirect stderr (using shell temporarily) - let &shellredir=s:shellredir - let &shell=s:shell + let &shellredir = s:shellredir + let &shell = s:shell exec "'[,']!" . s:GPGCommand . " --quiet --decrypt " . s:stderrredirnull - let &shellredir=s:shellredirsave - let &shell=s:shellsave + let &shellredir = s:shellredirsave + let &shell = s:shellsave if (v:shell_error) " message could not be decrypted silent u echohl GPGError - let blackhole=input("Message could not be decrypted! (Press ENTER)") + let blackhole = input("Message could not be decrypted! (Press ENTER)") echohl None bwipeout set nobin @@ -334,7 +358,7 @@ function s:GPGEncrypt() call s:GPGDebug(2, "saved window view " . string(s:GPGWindowView)) " store encoding and switch to a safe one - if &fileencoding != &encoding + if (&fileencoding != &encoding) let s:GPGEncoding = &encoding let &encoding = &fileencoding call s:GPGDebug(2, "encoding was \"" . s:GPGEncoding . "\", switched to \"" . &encoding . "\"") @@ -356,42 +380,43 @@ function s:GPGEncrypt() " initialize GPGOptions if not happened before if (!exists("b:GPGOptions") || len(b:GPGOptions) == 0) - let b:GPGOptions=[] + let b:GPGOptions = [] if (exists("g:GPGPreferSymmetric") && g:GPGPreferSymmetric == 1) - let b:GPGOptions+=["symmetric"] + let b:GPGOptions += ["symmetric"] + let b:GPGRecipients = [] else - let b:GPGOptions+=["encrypt"] + let b:GPGOptions += ["encrypt"] endif if (exists("g:GPGPreferArmor") && g:GPGPreferArmor == 1) - let b:GPGOptions+=["armor"] + let b:GPGOptions += ["armor"] endif call s:GPGDebug(1, "no options set, so using default options: " . string(b:GPGOptions)) endif " built list of options - let options="" + let options = "" for option in b:GPGOptions - let options=options . " --" . option . " " + let options = options . " --" . option . " " endfor " check here again if all recipients are available in the keyring let [ recipients, unknownrecipients ] = s:GPGCheckRecipients(b:GPGRecipients) " check if there are unknown recipients and warn - if(len(unknownrecipients) > 0) + if (len(unknownrecipients) > 0) echohl GPGWarning echom "Please use GPGEditRecipients to correct!!" echo echohl None " Let user know whats happend and copy known_recipients back to buffer - let dummy=input("Press ENTER to quit") + let dummy = input("Press ENTER to quit") endif " built list of recipients if (len(recipients) > 0) for gpgid in recipients - let options=options . " -r " . gpgid + let options = options . " -r " . gpgid endfor else if (match(b:GPGOptions, "encrypt") >= 0) @@ -404,18 +429,20 @@ function s:GPGEncrypt() endif " encrypt the buffer - let &shellredir=s:shellredir - let &shell=s:shell + let &shellredir = s:shellredir + let &shell = s:shell silent exec "'[,']!" . s:GPGCommand . " --quiet --no-encrypt-to " . options . " " . s:stderrredirnull - let &shellredir=s:shellredirsave - let &shell=s:shellsave + let &shellredir = s:shellredirsave + let &shell = s:shellsave call s:GPGDebug(1, "called gpg command is: " . "'[,']!" . s:GPGCommand . " --quiet --no-encrypt-to " . options . " " . s:stderrredirnull) if (v:shell_error) " message could not be encrypted - silent u + " delete content of the buffer to be sure no data is written unencrypted + " content will be recovered in GPGEncryptPost() + silent normal! 1GdG + echohl GPGError - let blackhole=input("Message could not be encrypted! File might be empty! (Press ENTER)") + let blackhole = input("Message could not be encrypted! File might be empty! (Press ENTER)") echohl None - bwipeout return endif @@ -438,7 +465,7 @@ function s:GPGEncryptPost() set nobin " restore encoding - if s:GPGEncoding != "" + if (s:GPGEncoding != "") let &encoding = s:GPGEncoding call s:GPGDebug(2, "restored encoding \"" . &encoding . "\"") endif @@ -469,14 +496,14 @@ function s:GPGViewRecipients() echo 'This file has following recipients (Unknown recipients have a prepended "!"):' " echo the recipients for name in recipients - let name=s:GPGIDToName(name) + let name = s:GPGIDToName(name) echo name endfor " echo the unknown recipients echohl GPGWarning for name in unknownrecipients - let name="!" . name + let name = "!" . name echo name endfor echohl None @@ -506,8 +533,8 @@ function s:GPGEditRecipients() if (match(bufname("%"), "^\\(GPGRecipients_\\|GPGOptions_\\)") != 0 && match(bufname("%"), "\.\\(gpg\\|asc\\|pgp\\)$") >= 0) " save buffer name - let buffername=bufname("%") - let editbuffername="GPGRecipients_" . buffername + let buffername = bufname("%") + let editbuffername = "GPGRecipients_" . buffername " check if this buffer exists if (!bufexists(editbuffername)) @@ -541,7 +568,7 @@ function s:GPGEditRecipients() setlocal nonumber " so we know for which other buffer this edit buffer is - let b:GPGCorrespondingTo=buffername + let b:GPGCorrespondingTo = buffername " put some comments to the scratch buffer silent put ='GPG: ----------------------------------------------------------------------' @@ -554,20 +581,31 @@ function s:GPGEditRecipients() " get the recipients let [ recipients, unknownrecipients ] = s:GPGCheckRecipients(getbufvar(b:GPGCorrespondingTo, "GPGRecipients")) + " if there are no known or unknown recipients, use the default ones + if (len(recipients) == 0 && len(unknownrecipients) == 0) + if (type(g:GPGDefaultRecipients) == type([])) + let [ recipients, unknownrecipients ] = s:GPGCheckRecipients(g:GPGDefaultRecipients) + else + echohl GPGWarning + echom "g:GPGDefaultRecipients is not a Vim list, please correct this in your vimrc!" + echohl None + endif + endif + " put the recipients in the scratch buffer for name in recipients - let name=s:GPGIDToName(name) + let name = s:GPGIDToName(name) silent put =name endfor " put the unknown recipients in the scratch buffer - let syntaxPattern="\\(nonexxistinwordinthisbuffer" + let syntaxPattern = "\\(nonexxistinwordinthisbuffer" for name in unknownrecipients - let name="!" . name - let syntaxPattern=syntaxPattern . "\\|" . name + let name = "!" . name + let syntaxPattern = syntaxPattern . "\\|" . name silent put =name endfor - let syntaxPattern=syntaxPattern . "\\)" + let syntaxPattern = syntaxPattern . "\\)" " define highlight if (has("syntax") && exists("g:syntax_on")) @@ -612,30 +650,30 @@ function s:GPGFinishRecipientsBuffer() " get the recipients from the scratch buffer - let recipients=[] - let lines=getline(1,"$") + let recipients = [] + let lines = getline(1,"$") for recipient in lines " delete all spaces at beginning and end of the recipient " also delete a '!' at the beginning of the recipient - let recipient=substitute(recipient, "^[[:space:]!]*\\(.\\{-}\\)[[:space:]]*$", "\\1", "") + let recipient = substitute(recipient, "^[[:space:]!]*\\(.\\{-}\\)[[:space:]]*$", "\\1", "") " delete comment lines - let recipient=substitute(recipient, "^GPG:.*$", "", "") + let recipient = substitute(recipient, "^GPG:.*$", "", "") " only do this if the line is not empty if (strlen(recipient) > 0) - let gpgid=s:GPGNameToID(recipient) + let gpgid = s:GPGNameToID(recipient) if (strlen(gpgid) > 0) if (match(recipients, gpgid) < 0) - let recipients+=[gpgid] + let recipients += [gpgid] endif else if (match(recipients, recipient) < 0) - let recipients+=[recipient] + let recipients += [recipient] echohl GPGWarning echom "The recipient \"" . recipient . "\" is not in your public keyring!" echohl None endif - end + endif endif endfor @@ -695,8 +733,8 @@ function s:GPGEditOptions() if (match(bufname("%"), "^\\(GPGRecipients_\\|GPGOptions_\\)") != 0 && match(bufname("%"), "\.\\(gpg\\|asc\\|pgp\\)$") >= 0) " save buffer name - let buffername=bufname("%") - let editbuffername="GPGOptions_" . buffername + let buffername = bufname("%") + let editbuffername = "GPGOptions_" . buffername " check if this buffer exists if (!bufexists(editbuffername)) @@ -729,7 +767,7 @@ function s:GPGEditOptions() setlocal nonumber " so we know for which other buffer this edit buffer is - let b:GPGCorrespondingTo=buffername + let b:GPGCorrespondingTo = buffername " put some comments to the scratch buffer silent put ='GPG: ----------------------------------------------------------------------' @@ -743,7 +781,7 @@ function s:GPGEditOptions() silent put ='GPG: ----------------------------------------------------------------------' " put the options in the scratch buffer - let options=getbufvar(b:GPGCorrespondingTo, "GPGOptions") + let options = getbufvar(b:GPGCorrespondingTo, "GPGOptions") for option in options silent put =option @@ -783,24 +821,24 @@ function s:GPGFinishOptionsBuffer() endif " clear options and unknownOptions - let options=[] - let unknownOptions=[] + let options = [] + let unknownOptions = [] " delete the autocommand autocmd! * " get the options from the scratch buffer - let lines=getline(1, "$") + let lines = getline(1, "$") for option in lines " delete all spaces at beginning and end of the option " also delete a '!' at the beginning of the option - let option=substitute(option, "^[[:space:]!]*\\(.\\{-}\\)[[:space:]]*$", "\\1", "") + let option = substitute(option, "^[[:space:]!]*\\(.\\{-}\\)[[:space:]]*$", "\\1", "") " delete comment lines - let option=substitute(option, "^GPG:.*$", "", "") + let option = substitute(option, "^GPG:.*$", "", "") " only do this if the line is not empty if (strlen(option) > 0 && match(options, option) < 0) - let options+=[option] + let options += [option] endif endfor @@ -818,19 +856,19 @@ endfunction " check if recipients are known " Returns: two lists recipients and unknownrecipients function s:GPGCheckRecipients(tocheck) - let recipients=[] - let unknownrecipients=[] + let recipients = [] + let unknownrecipients = [] if (type(a:tocheck) == type([])) for recipient in a:tocheck - let gpgid=s:GPGNameToID(recipient) + let gpgid = s:GPGNameToID(recipient) if (strlen(gpgid) > 0) if (match(recipients, gpgid) < 0) - let recipients+=[gpgid] + let recipients += [gpgid] endif else if (match(unknownrecipients, recipient) < 0) - let unknownrecipients+=[recipient] + let unknownrecipients += [recipient] echohl GPGWarning echom "The recipient \"" . recipient . "\" is not in your public keyring!" echohl None @@ -851,60 +889,60 @@ endfunction " Returns: ID for the given name function s:GPGNameToID(name) " ask gpg for the id for a name - let &shellredir=s:shellredir - let &shell=s:shell - let output=system(s:GPGCommand . " --quiet --with-colons --fixed-list-mode --list-keys \"" . a:name . "\"") - let &shellredir=s:shellredirsave - let &shell=s:shellsave + let &shellredir = s:shellredir + let &shell = s:shell + let output = system(s:GPGCommand . " --quiet --with-colons --fixed-list-mode --list-keys \"" . a:name . "\"") + let &shellredir = s:shellredirsave + let &shell = s:shellsave " when called with "--with-colons" gpg encodes its output _ALWAYS_ as UTF-8, " so convert it, if necessary - if &encoding != "utf-8" - let output=iconv(output, "utf-8", &encoding) + if (&encoding != "utf-8") + let output = iconv(output, "utf-8", &encoding) endif - let lines=split(output, "\n") + let lines = split(output, "\n") " parse the output of gpg - let pubseen=0 - let uidseen=0 - let counter=0 - let gpgids=[] - let choices="The name \"" . a:name . "\" is ambiguous. Please select the correct key:\n" + let pubseen = 0 + let uidseen = 0 + let counter = 0 + let gpgids = [] + let choices = "The name \"" . a:name . "\" is ambiguous. Please select the correct key:\n" for line in lines - let fields=split(line, ":") + let fields = split(line, ":") " search for the next uid if (pubseen == 1) if (fields[0] == "uid") if (uidseen == 0) - let choices=choices . counter . ": " . fields[9] . "\n" - let counter=counter+1 - let uidseen=1 + let choices = choices . counter . ": " . fields[9] . "\n" + let counter = counter+1 + let uidseen = 1 else - let choices=choices . " " . fields[9] . "\n" + let choices = choices . " " . fields[9] . "\n" endif else - let uidseen=0 - let pubseen=0 + let uidseen = 0 + let pubseen = 0 endif endif " search for the next pub if (pubseen == 0) if (fields[0] == "pub") - let gpgids+=[fields[4]] - let pubseen=1 + let gpgids += [fields[4]] + let pubseen = 1 endif endif endfor " counter > 1 means we have more than one results - let answer=0 + let answer = 0 if (counter > 1) - let choices=choices . "Enter number: " - let answer=input(choices, "0") + let choices = choices . "Enter number: " + let answer = input(choices, "0") while (answer == "") - let answer=input("Enter number: ", "0") + let answer = input("Enter number: ", "0") endwhile endif @@ -919,32 +957,32 @@ function s:GPGIDToName(identity) " TODO is the encryption subkey really unique? " ask gpg for the id for a name - let &shellredir=s:shellredir - let &shell=s:shell - let output=system(s:GPGCommand . " --quiet --with-colons --fixed-list-mode --list-keys " . a:identity ) - let &shellredir=s:shellredirsave - let &shell=s:shellsave + let &shellredir = s:shellredir + let &shell = s:shell + let output = system(s:GPGCommand . " --quiet --with-colons --fixed-list-mode --list-keys " . a:identity ) + let &shellredir = s:shellredirsave + let &shell = s:shellsave " when called with "--with-colons" gpg encodes its output _ALWAYS_ as UTF-8, " so convert it, if necessary - if &encoding != "utf-8" - let output=iconv(output, "utf-8", &encoding) + if (&encoding != "utf-8") + let output = iconv(output, "utf-8", &encoding) endif - let lines=split(output, "\n") + let lines = split(output, "\n") " parse the output of gpg - let pubseen=0 - let uid="" + let pubseen = 0 + let uid = "" for line in lines - let fields=split(line, ":") + let fields = split(line, ":") if (pubseen == 0) " search for the next pub if (fields[0] == "pub") - let pubseen=1 + let pubseen = 1 endif else " search for the next uid if (fields[0] == "uid") - let pubseen=0 - let uid=fields[9] + let pubseen = 0 + let uid = fields[9] break endif endif @@ -968,7 +1006,7 @@ command! GPGEditRecipients call s:GPGEditRecipients() command! GPGViewOptions call s:GPGViewOptions() command! GPGEditOptions call s:GPGEditOptions() " Section: Menu {{{1 -if has("menu") +if (has("menu")) amenu Plugin.GnuPG.View\ Recipients :GPGViewRecipients amenu Plugin.GnuPG.Edit\ Recipients :GPGEditRecipients amenu Plugin.GnuPG.View\ Options :GPGViewOptions