| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -7,11 +7,6 @@ let g:loaded_Banana= 1 " your version number
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				let s:keepcpo           = &cpo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				set cpo&vim
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" Public Interface:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" AppFunction: is a function you expect your users to call
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" PickAMap: some sequence of characters that will run your AppFunction
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" Repeat these three lines as needed for multiple functions which will
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" be used to provide an interface for the user
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				if !hasmapto('<Plug>BananaEnc')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					map <unique> <Leader>b <Plug>BananaEnc
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				endif
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -19,143 +14,12 @@ endif
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				if !hasmapto('<Plug>BananaDec')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					map <unique> <Leader>d <Plug>BananaDec
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				endif
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"" Global Maps:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				""
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"noremap <silent> <unique> <script> <Plug>BananaPybanana
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"			\ :set lz<CR>:call <SID>Pybanana()<CR>:set nolz<CR>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				noremap <silent> <unique> <script> <Plug>BananaEnc
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							\ :call <SID>Enc()<CR>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				noremap <silent> <unique> <script> <Plug>BananaDec
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							\ :call <SID>Dec()<CR>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"command! Banana call s:PyBanana()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"nnoremap ;b :Banana<CR>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"vnoremap ;b :<C-U>Banana<CR>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"------------------------------------------------------------------------------
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" s:AppFunction: this function is available via the <Plug>/<script>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" interface above
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"fun! s:Pybanana()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"python3 << EOL
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"import vim
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"import re
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"def dec2banana(num, dictstart = None, shiftend = None, minlength = None, dictionary = None):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    #defaults
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if dictstart is None: dictstart = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if shiftend is None: shiftend = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if minlength is None: minlength = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if dictionary is None: dictionary = [list("bcdfglmnprstvz"), list("aeiou")]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    numdict = len(dictionary)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    v = num
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    st = ""
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    l = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    i = (numdict - 1 + dictstart + shiftend) % numdict
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    while not (v == 0 and i == (numdict - 1 + dictstart) % numdict and l >= minlength):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        r = v % len(dictionary[i])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        v = int(v / len(dictionary[i]))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        st = dictionary[i][r] + st
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        i = (i - 1) % numdict
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        l += 1
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"   
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    return(st)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"def banana2dec(banana, dictstart = None, shiftend = None, dictionary = None):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    #defaults
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if dictstart is None: dictstart = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if shiftend is None: shiftend = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if dictionary is None: dictionary = [list("bcdfglmnprstvz"), list("aeiou")] #, list("123456")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    numdict = len(dictionary)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if (len(banana) - shiftend) % numdict != 0:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        return("Banana non valida")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    v = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    for i in range(len(banana)):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        r = (numdict + i + dictstart) % numdict
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        try:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"            v = v * len(dictionary[r]) + dictionary[r].index(banana[i])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        except:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"            return("Carattere non valido in posizione", i+1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    return(v)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"def isbanana(banana, dictstart = None, shiftend = None, dictionary = None):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    #defaults
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if dictstart is None: dictstart = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if shiftend is None: shiftend = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if dictionary is None: dictionary = [list("bcdfglmnprstvz"), list("aeiou")] #, list("123456")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    numdict = len(dictionary)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if (len(banana) - shiftend) % numdict != 0:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        return(False)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    for i in range(len(banana)):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        r = (numdict + i + dictstart) % numdict
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        if banana[i] not in dictionary[r]:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"            return(False)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    return(True)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"def callback_dec(x):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    b = x[0].strip().lower()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    if isbanana(b):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        return "%s" % banana2dec(b)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    else:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"        return x[0]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"def text2dec(text):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    text = re.sub(r"[A-Z][A-Z]*", callback_dec, text)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	#return text
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    print(text)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"def callback(x):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    return " %s " % dec2banana(int(x[0], base=10)).upper()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"def text2banana(text):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    text = re.sub(r"[0-9][0-9]*", callback, text)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    return text
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"def get_selected_text():
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    buf = vim.current.buffer
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    (lnum1, col1) = buf.mark('<')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    (lnum2, col2) = buf.mark('>')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    lines = vim.eval('getline({}, {})'.format(lnum1, lnum2))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    lines[0] = lines[0][col1:]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    lines[-1] = lines[-1][:col2]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    return "\n".join(lines)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"def replace_selected_text(new_str):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    buf = vim.current.buffer
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    (lnum1, col1) = buf.mark('<')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    (lnum2, col2) = buf.mark('>')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    lines = vim.eval('getline({}, {})'.format(lnum1,lnum2))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    new_str = lines[0][:col1] + new_str + lines[-1][col2+1:]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    new_str_list = new_str.split('\n')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    del buf[lnum1-1:lnum2]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    buf.append(new_str_list, lnum1-1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"    return new_str
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"replace_selected_text(text2banana(get_selected_text()))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"EOL
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	" your script function can set up maps to internal functions
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	"nnoremap <silent> <Left> :set lz<CR>:silent! call
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	"<SID>AppFunction2()<CR>:set nolz<CR>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	" your app can call functions in its own script and not worry
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	" about name
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	" clashes by preceding those function names with <SID>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	"call s:InternalAppFunction(...)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	" or you could call it with
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	"call s:InternalAppFunction(...)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"endfun
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				python3 import sys
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				python3 import vim
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				python3 sys.path.append(vim.eval('expand("<sfile>:h")'))
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -178,18 +42,5 @@ replace_selected_text(text2dec(get_selected_text()))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				EOL
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				endfun!
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"------------------------------------------------------------------------------
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" s:InternalAppFunction: this function cannot be
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" called from outside the
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" script, and its name won't clash with whatever else
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				" the user has loaded
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"fun! s:InternalAppFunction(...)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"	..whatever..
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"endfun
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				"------------------------------------------------------------------------------
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				let &cpo= s:keepcpo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				unlet s:keepcpo
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				unlet s:keepcpo
 |