--- a/vim/bundle/yankring/plugin/yankring.vim Mon Jan 16 11:28:13 2012 -0500
+++ b/vim/bundle/yankring/plugin/yankring.vim Mon Jan 16 12:15:40 2012 -0500
@@ -1,8 +1,8 @@
" yankring.vim - Yank / Delete Ring for Vim
" ---------------------------------------------------------------
-" Version: 10.0
+" Version: 12.0
" Authors: David Fishburn <dfishburn.vim@gmail.com>
-" Last Modified: 2010 Jan 24
+" Last Modified: 2011 Jun 14
" Script: http://www.vim.org/scripts/script.php?script_id=1234
" Based On: Mocked up version by Yegappan Lakshmanan
" http://groups.yahoo.com/group/vim/post?act=reply&messageNum=34406
@@ -18,7 +18,7 @@
finish
endif
-let loaded_yankring = 100
+let loaded_yankring = 120
let s:yr_has_voperator = 0
if v:version > 701 || ( v:version == 701 && has("patch205") )
@@ -52,6 +52,11 @@
let g:yankring_max_element_length = 1048576
endif
+" Warn if truncation occurs
+if !exists('g:yankring_warn_on_truncate')
+ let g:yankring_warn_on_truncate = 1
+endif
+
" Allow the user to specify if the plugin is enabled or not
if !exists('g:yankring_enabled')
let g:yankring_enabled = 1
@@ -323,6 +328,11 @@
let toggle = matchstr(a:1, '\d\+')
endif
+ let show_registers = 0
+ if a:0 > 1 && a:2 ==# 'R'
+ let show_registers = 1
+ endif
+
if toggle == 1
if bufwinnr(s:yr_buffer_id) > -1
" If the YankRing window is already open close it
@@ -351,9 +361,9 @@
" show the contents (or when it is refreshed).
if g:yankring_paste_check_default_buffer == 1
let save_reg = 0
- let register = ((&clipboard=='unnamed')?'+':'"')
+ let register = ((&clipboard=~'unnamed')?'+':'"')
- if &clipboard == 'unnamed' && getreg('+') != s:yr_prev_clipboard
+ if &clipboard =~ 'unnamed' && getreg('+') != s:yr_prev_clipboard
let save_reg = 1
endif
if register == '"' && getreg('"') != s:yr_prev_reg_unnamed
@@ -371,14 +381,23 @@
" List is shown in order of replacement
" assuming using previous yanks
let output = "--- YankRing ---\n"
- let output = output . "Elem Content\n"
+ let output = output . (show_registers == 1 ? 'Reg ' : 'Elem')." Content\n"
- call s:YRHistoryRead()
- let disp_item_nr = 1
- for elem in s:yr_history_list
- let output = output . s:YRDisplayElem(disp_item_nr, elem) . "\n"
- let disp_item_nr += 1
- endfor
+ if show_registers == 1
+ for reg_name in map( range(char2nr('0'), char2nr('9')) +
+ \ (range(char2nr('a'), char2nr('z')))
+ \, 'nr2char(v:val)'
+ \ )
+ let output = output . s:YRDisplayElem(reg_name, getreg(reg_name).',') . "\n"
+ endfor
+ else
+ call s:YRHistoryRead()
+ let disp_item_nr = 1
+ for elem in s:yr_history_list
+ let output = output . s:YRDisplayElem(disp_item_nr, elem) . "\n"
+ let disp_item_nr += 1
+ endfor
+ endif
if g:yankring_window_use_separate == 1
call s:YRWindowOpen(output)
@@ -438,7 +457,7 @@
return -1
endif
- let default_buffer = ((&clipboard=='unnamed')?'+':'"')
+ let default_buffer = ((&clipboard=~'unnamed')?'+':'"')
let direction = 'p'
if a:0 > 1
@@ -483,7 +502,7 @@
return -1
endif
- let default_buffer = ((&clipboard=='unnamed')?'+':'"')
+ let default_buffer = ((&clipboard=~'unnamed')?'+':'"')
call setreg(default_buffer
\ , s:YRGetValElemNbr((elem), 'v')
\ , s:YRGetValElemNbr((elem), 't')
@@ -632,7 +651,7 @@
" Resets the common script variables for managing the ring.
function! s:YRReset()
- let s:yr_history_list = []
+ call s:YRHistoryDelete()
" Update the history file
call s:YRHistorySave()
endfunction
@@ -696,7 +715,7 @@
" so test for this condition and return the
" default register
let user_register = ((v:register=='')?('"'):(v:register))
- if &clipboard == 'unnamed' && user_register == '"'
+ if &clipboard =~ 'unnamed' && user_register == '"'
let user_register = '+'
endif
return user_register
@@ -718,7 +737,7 @@
" If we are pushing something on to the yankring, add it to
" the default buffer as well so the next item pasted will
" be the item pushed
- let default_buffer = ((&clipboard=='unnamed')?'+':'"')
+ let default_buffer = ((&clipboard=~'unnamed')?'+':'"')
call setreg(default_buffer, getreg(user_register),
\ getregtype(user_register))
@@ -781,7 +800,7 @@
return ""
endif
- let register = ((&clipboard=='unnamed')?'+':register)
+ let register = ((&clipboard=~'unnamed')?'+':register)
" let s:yr_prev_changenr = changenr()
if register == '"'
@@ -804,14 +823,16 @@
let s:yr_prev_clipboard = @+
endif
+ " Manage the numbered registers
+ if g:yankring_manage_numbered_reg == 1
+ " Allow the user to define an autocmd to dynamically
+ " setup their connection information.
+ silent! doautocmd User YRSetNumberedReg
+ endif
+
" If the yankring window is open, refresh it
call s:YRWindowUpdate()
- " Manage the numbered registers
- if g:yankring_manage_numbered_reg == 1
- call s:YRSetNumberedReg()
- endif
-
return ""
endfunction
@@ -827,7 +848,7 @@
return ""
endif
- let register = ((&clipboard=='unnamed')?'+':register)
+ let register = ((&clipboard=~'unnamed')?'+':register)
if register == '"'
" If the change has occurred via an omap, we must delay
@@ -853,14 +874,16 @@
let s:yr_prev_clipboard = @+
endif
+ " Manage the numbered registers
+ if g:yankring_manage_numbered_reg == 1
+ " Allow the user to define an autocmd to dynamically
+ " setup their connection information.
+ silent! doautocmd User YRSetNumberedReg
+ endif
+
" If the yankring window is open, refresh it
call s:YRWindowUpdate()
- " Manage the numbered registers
- if g:yankring_manage_numbered_reg == 1
- call s:YRSetNumberedReg()
- endif
-
return ""
endfunction
@@ -1012,19 +1035,27 @@
" Manages the Vim's numbered registers
function! s:YRSetNumberedReg()
- let i = 1
+ let i = 0
while i <= 10
if i > s:yr_count
break
endif
- call setreg( (i-1)
- \ , s:YRGetValElemNbr((i-1),'v')
- \ , s:YRGetValElemNbr((i-1),'t')
+ call setreg( (i)
+ \ , s:YRGetValElemNbr((i),'v')
+ \ , s:YRGetValElemNbr((i),'t')
\ )
let i += 1
endwhile
+
+ " There are a few actions that Vim automatically takes
+ " when modifying the numbered registers.
+ " Modifying register 1 - changes the named register.
+ " It is impossible to set register 2 to a value, since Vim will change it.
+
+ " This will at least preserve the default register
+ let @" = @0
endfunction
@@ -1128,7 +1159,7 @@
function! s:YRYankRange(do_delete_selection, ...) range
let user_register = s:YRRegister()
- let default_buffer = ((&clipboard=='unnamed')?'+':'"')
+ let default_buffer = ((&clipboard=~'unnamed')?'+':'"')
" Default command mode to normal mode 'n'
let cmd_mode = 'n'
@@ -1185,7 +1216,7 @@
let user_register = s:YRRegister()
- let default_buffer = ((&clipboard == 'unnamed')?'+':'"')
+ let default_buffer = ((&clipboard =~ 'unnamed')?'+':'"')
let v_count = v:count
" Default command mode to normal mode 'n'
@@ -1356,7 +1387,7 @@
" echomsg "YRMapsE:".localtime()
" echomsg "YRMapsE 1:".cmds.":".v:operator.":".s:yr_maps_created_zap
- if (a:motion =~ '\.' && s:yr_remove_omap_dot == 1) || a:motion =~ '@'
+ if (a:motion =~ '\.' && s:yr_remove_omap_dot == 1) || a:motion =~ '@'
" If we are repeating a series of commands we must
" unmap the _zap_ keys so that the user is not
" prompted when a command is replayed.
@@ -1407,6 +1438,11 @@
let cmds .= a:sid. "yrrecord"
endif
endif
+
+ " This will not work since we are already executing an expression
+ " if a:motion =~ '@'
+ " let cmds = 'normal! ' . cmds
+ " endif
" echomsg "YRMapsE 5:".a:motion.":'".cmds."':".s:yr_maps_created_zap
return cmds
@@ -1414,41 +1450,43 @@
endfunction
-" Handle any the @
-function! s:YRMapsMacro(bang, ...) range
- " If we are repeating a series of commands we must
- " unmap the _zap_ keys so that the user is not
- " prompted when a command is replayed.
- " These maps must be re-instated in YRRecord3()
- " after the action of the replay is completed.
- call s:YRMapsDelete('remove_only_zap_keys')
-
- " let zapto = (a:0==0 ? "" : s:YRGetChar())
- let zapto = s:YRGetChar()
-
- if zapto == "\<C-C>"
- " Abort if the user hits Control C
- call s:YRWarningMsg( "YR:Aborting command:".v:operator.a:motion )
- return ""
- endif
-
- let v_count = v:count
- " If no count was specified it will have a value of 0
- " so set it to at least 1
- let v_count = ((v_count > 0)?(v_count):'')
-
- let range = ''
- if a:firstline != a:lastline
- let rannge = a:firstline.','.a:lastline
- endif
-
- let cmd = range."normal! ".v_count.'@'.zapto
- " DEBUG
- " echomsg cmd
- exec cmd
-
- call s:YRMapsCreate('add_only_zap_keys')
-endfunction
+" Handle macros (@).
+" This routine is not used, YRMapsExpression is used to
+" handle the @ symbol.
+" function! s:YRMapsMacro(bang, ...) range
+" " If we are repeating a series of commands we must
+" " unmap the _zap_ keys so that the user is not
+" " prompted when a command is replayed.
+" " These maps must be re-instated in YRRecord3()
+" " after the action of the replay is completed.
+" call s:YRMapsDelete('remove_only_zap_keys')
+"
+" " let zapto = (a:0==0 ? "" : s:YRGetChar())
+" let zapto = s:YRGetChar()
+"
+" if zapto == "\<C-C>"
+" " Abort if the user hits Control C
+" call s:YRWarningMsg( "YR:Aborting command:".v:operator.a:motion )
+" return ""
+" endif
+"
+" let v_count = v:count
+" " If no count was specified it will have a value of 0
+" " so set it to at least 1
+" let v_count = ((v_count > 0)?(v_count):'')
+"
+" let range = ''
+" if a:firstline != a:lastline
+" let rannge = a:firstline.','.a:lastline
+" endif
+"
+" let cmd = range."normal! ".v_count.'@'.zapto
+" " DEBUG
+" " echomsg cmd
+" exec cmd
+"
+" call s:YRMapsCreate('add_only_zap_keys')
+" endfunction
" Create the default maps
@@ -1549,6 +1587,11 @@
let g:yankring_enabled = 1
let s:yr_maps_created = 1
+
+ if exists('*YRRunAfterMaps')
+ " This will allow you to override the default maps if necessary
+ call YRRunAfterMaps()
+ endif
endfunction
@@ -1592,84 +1635,79 @@
endtry
endfor
- if g:yankring_map_dot == 1
- exec "nunmap ."
+ if g:yankring_map_dot == 1
+ silent! exec "nunmap ."
endif
if g:yankring_v_key != ''
- exec 'vunmap '.g:yankring_v_key
+ silent! exec 'vunmap '.g:yankring_v_key
endif
if g:yankring_del_v_key != ''
for v_map in split(g:yankring_del_v_key)
if strlen(v_map) > 0
try
- exec 'vunmap '.v_map
+ silent! exec 'vunmap '.v_map
catch
endtry
endif
endfor
endif
if g:yankring_paste_n_bkey != ''
- exec 'nunmap '.g:yankring_paste_n_bkey
+ silent! exec 'nunmap '.g:yankring_paste_n_bkey
if g:yankring_paste_using_g == 1
- exec 'nunmap g'.g:yankring_paste_n_bkey
+ silent! exec 'nunmap g'.g:yankring_paste_n_bkey
endif
endif
if g:yankring_paste_n_akey != ''
- exec 'nunmap '.g:yankring_paste_n_akey
+ silent! exec 'nunmap '.g:yankring_paste_n_akey
if g:yankring_paste_using_g == 1
- exec 'nunmap g'.g:yankring_paste_n_akey
+ silent! exec 'nunmap g'.g:yankring_paste_n_akey
endif
endif
if g:yankring_paste_v_bkey != ''
- exec 'vunmap '.g:yankring_paste_v_bkey
+ silent! exec 'vunmap '.g:yankring_paste_v_bkey
endif
if g:yankring_paste_v_akey != ''
- exec 'vunmap '.g:yankring_paste_v_akey
+ silent! exec 'vunmap '.g:yankring_paste_v_akey
endif
if g:yankring_replace_n_pkey != ''
- exec 'nunmap '.g:yankring_replace_n_pkey
+ silent! exec 'nunmap '.g:yankring_replace_n_pkey
endif
if g:yankring_replace_n_nkey != ''
- exec 'nunmap '.g:yankring_replace_n_nkey
+ silent! exec 'nunmap '.g:yankring_replace_n_nkey
endif
+ silent! exec 'nunmap @'
+
let g:yankring_enabled = 0
let s:yr_maps_created = 0
endfunction
function! s:YRGetValElemNbr( position, type )
-
let needed_elem = a:position
" The List which contains the items in the yankring
" history is also ordered, most recent at the top
let elem = s:YRMRUGet('s:yr_history_list', needed_elem)
- if elem >= 0
- if a:type == 't'
- return matchstr(elem, '^.*,\zs.*$')
+ if a:type == 't'
+ let elem = matchstr(elem, '^.*,\zs.*$')
+ else
+ let elem = matchstr(elem, '^.*\ze,.*$')
+ if s:yr_history_version == 'v1'
+ " Match three @@@ in a row as long as it is not
+ " preceeded by a @@@
+ " v1
+ let elem = substitute(elem, s:yr_history_v1_nl_pat, "\n", 'g')
+ let elem = substitute(elem, '\\@', '@', 'g')
else
- let elem = matchstr(elem, '^.*\ze,.*$')
- if s:yr_history_version == 'v1'
- " Match three @@@ in a row as long as it is not
- " preceeded by a @@@
- " v1
- let elem = substitute(elem, s:yr_history_v1_nl_pat, "\n", 'g')
- let elem = substitute(elem, '\\@', '@', 'g')
- else
- let elem = substitute(elem, s:yr_history_v2_nl_pat, "\n", 'g')
- endif
- return elem
+ let elem = substitute(elem, s:yr_history_v2_nl_pat, "\n", 'g')
endif
- else
- return -1
endif
- return ""
+ return elem
endfunction
function! s:YRMRUReset( mru_list )
-
let {a:mru_list} = []
return 1
@@ -1683,6 +1721,16 @@
let elem = a:element
if g:yankring_max_element_length != 0
let elem = strpart(a:element, 0, g:yankring_max_element_length)
+ if (g:yankring_warn_on_truncate > 0)
+ let bytes = len (a:element) - len(elem)
+ if (bytes > 0)
+ call s:YRWarningMsg("Yankring truncated its element by ".
+ \ bytes.
+ \ " bytes due to a g:yankring_max_element_length of ".
+ \ g:yankring_max_element_length
+ \ )
+ endif
+ endif
endif
if s:yr_history_version == 'v1'
let elem = escape(elem, '@')
@@ -1754,7 +1802,6 @@
endfunction
function! s:YRMRUDel( mru_list, elem_nbr )
-
if a:elem_nbr >= 0 && a:elem_nbr < s:yr_count
call remove({a:mru_list}, a:elem_nbr)
call s:YRHistorySave()
@@ -1763,6 +1810,23 @@
return 1
endfunction
+function! s:YRHistoryDelete()
+ let s:yr_history_list = []
+ let yr_filename = s:yr_history_file_{s:yr_history_version}
+
+ if filereadable(yr_filename)
+ let rc = delete(yr_filename)
+ if rc != 0
+ call s:YRErrorMsg(
+ \ 'YRHistoryDelete: Unable to delete the yankring history file: '.
+ \ yr_filename
+ \ )
+ endif
+ endif
+
+ return 0
+endfunction
+
function! s:YRHistoryRead()
let refresh_needed = 1
let yr_history_list = []
@@ -1801,20 +1865,22 @@
endfunction
function! s:YRHistorySave()
+ let yr_filename = s:yr_history_file_{s:yr_history_version}
+
if len(s:yr_history_list) > g:yankring_max_history
" Remove items which exceed the max # specified
call remove(s:yr_history_list, g:yankring_max_history)
endif
- let rc = writefile(s:yr_history_list, s:yr_history_file_{s:yr_history_version})
+ let rc = writefile(s:yr_history_list, yr_filename)
if rc == 0
- let s:yr_history_last_upd = getftime(s:yr_history_file_{s:yr_history_version})
+ let s:yr_history_last_upd = getftime(yr_filename)
let s:yr_count = len(s:yr_history_list)
else
call s:YRErrorMsg(
\ 'YRHistorySave: Unable to save yankring history file: '.
- \ s:yr_history_file_{s:yr_history_version}
+ \ yr_filename
\ )
endif
endfunction
@@ -1879,7 +1945,7 @@
let msg = 'AutoClose='.g:yankring_window_auto_close.
\ ';ClipboardMonitor='.g:yankring_clipboard_monitor.
- \ ';Cmds:<enter>,[g]p,[g]P,d,r,s,a,c,u,q,<space>;Help=?'.
+ \ ';Cmds:<enter>,[g]p,[g]P,d,r,s,a,c,u,R,q,<space>;Help=?'.
\ (s:yr_search==""?"":';SearchRegEx='.s:yr_search)
if s:yr_has_voperator == 0
@@ -1896,7 +1962,8 @@
\ '" [g]P : [g][P]aste selection'."\n".
\ '" r : [p]aste selection in reverse order'."\n".
\ '" s : [s]earch the yankring for text'."\n".
- \ '" u : [u]pdate display'."\n".
+ \ '" u : [u]pdate display show YankRing'."\n".
+ \ '" R : [R]egisters display'."\n".
\ '" a : toggle [a]utoclose setting'."\n".
\ '" c : toggle [c]lipboard monitor setting'."\n".
\ '" q : [q]uit / close the yankring window'."\n".
@@ -2084,6 +2151,7 @@
nnoremap <buffer> <silent> ? :call <SID>YRWindowAction ('?' ,'n')<CR>
nnoremap <buffer> <silent> u :call <SID>YRWindowAction ('u' ,'n')<CR>
nnoremap <buffer> <silent> q :call <SID>YRWindowAction ('q' ,'n')<CR>
+ nnoremap <buffer> <silent> R :call <SID>YRWindowAction ('R' ,'n')<CR>
nnoremap <buffer> <silent> <space> \|:silent exec 'vertical resize '.
\ (
\ g:yankring_window_use_horiz!=1 && winwidth('.') > g:yankring_window_width
@@ -2151,7 +2219,7 @@
endfunction
function! s:YRWindowAction(op, cmd_mode) range
- let default_buffer = ((&clipboard=='unnamed')?'+':'"')
+ let default_buffer = ((&clipboard=~'unnamed')?'+':'"')
let opcode = a:op
let lines = []
let v_count = v:count
@@ -2220,6 +2288,12 @@
call s:YRShow(0)
return
+ elseif opcode ==# 'R'
+ " Switch back to the original buffer
+ exec s:yr_buffer_last_winnr . "wincmd w"
+
+ call s:YRShow(0, 'R')
+ return
elseif opcode ==# 'a'
let l:curr_line = line(".")
" Toggle the auto close setting
@@ -2399,6 +2473,8 @@
autocmd WinLeave * :call <SID>YRWinLeave()
autocmd FocusGained * :if has('clipboard') | call <SID>YRFocusGained() | endif
autocmd InsertLeave * :call <SID>YRInsertLeave()
+ autocmd User YRSetNumberedReg :call <SID>YRSetNumberedReg()
+ " autocmd User YRSetNumberedReg :let i = 0 | while i <= 10 | if i > s:yr_count | break | endif | call setreg( (i), s:YRGetValElemNbr((i),'v'), s:YRGetValElemNbr((i),'t') ) | let i += 1 | endwhile
augroup END
@@ -2431,18 +2507,30 @@
if has("gui_running") && has("menu") && g:yankring_default_menu_mode != 0
if g:yankring_default_menu_mode == 1
let menuRoot = 'YankRing'
+ let menuPriority = ''
elseif g:yankring_default_menu_mode == 2
let menuRoot = '&YankRing'
+ let menuPriority = ''
+ elseif g:yankring_default_menu_mode == 3
+ let menuRoot = exists("g:yankring_menu_root") ? g:yankring_menu_root : '&Plugin.&YankRing'
+ let menuPriority = exists("g:yankring_menu_priority") ? yankring_menu_priority : ''
else
let menuRoot = '&Plugin.&YankRing'
+ let menuPriority = ''
endif
- exec 'noremenu <script> '.menuRoot.'.YankRing\ Window :YRShow<CR>'
- exec 'noremenu <script> '.menuRoot.'.YankRing\ Search :YRSearch<CR>'
- exec 'noremenu <script> '.menuRoot.'.Replace\ with\ Previous :YRReplace ''-1'', ''P''<CR>'
- exec 'noremenu <script> '.menuRoot.'.Replace\ with\ Next :YRReplace ''1'', ''P''<CR>'
- exec 'noremenu <script> '.menuRoot.'.Clear :YRClear<CR>'
- exec 'noremenu <script> '.menuRoot.'.Toggle :YRToggle<CR>'
+ let leader = '\'
+ if exists('g:mapleader')
+ let leader = g:mapleader
+ endif
+ let leader = escape(leader, '\')
+
+ exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.YankRing\ Window :YRShow<CR>'
+ exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.YankRing\ Search :YRSearch<CR>'
+ exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.Replace\ with\ Previous<TAB>'.leader.'<C-P> :YRReplace ''-1'', ''P''<CR>'
+ exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.Replace\ with\ Next<TAB>'.leader.'<C-N> :YRReplace ''1'', ''P''<CR>'
+ exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.Clear :YRClear<CR>'
+ exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.Toggle :YRToggle<CR>'
endif
if g:yankring_enabled == 1
@@ -2450,11 +2538,6 @@
call s:YRMapsCreate()
endif
-if exists('*YRRunAfterMaps')
- " This will allow you to override the default maps if necessary
- call YRRunAfterMaps()
-endif
-
call s:YRInit()
call s:YRHistoryRead()