11" yankring.vim - Yank / Delete Ring for Vim
22" ---------------------------------------------------------------
3- " Version: 15 .0
3+ " Version: 16 .0
44" Author: David Fishburn <dfishburn dot vim at gmail dot com>
55" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
6- " Last Modified: 2012 Dec 14
6+ " Last Modified: 2013 Jan 20
77" Script: http://www.vim.org/scripts/script.php?script_id=1234
88" Based On: Mocked up version by Yegappan Lakshmanan
99" http://groups.yahoo.com/group/vim/post?act=reply&messageNum=34406
@@ -19,7 +19,7 @@ if v:version < 700
1919 finish
2020endif
2121
22- let loaded_yankring = 150
22+ let loaded_yankring = 160
2323
2424" Turn on support for line continuations when creating the script
2525let s: cpo_save = &cpo
@@ -1386,37 +1386,83 @@ function! s:YRPaste(replace_last_paste_selection, nextvalue, direction, ...)
13861386 let cmd_mode = ((a: 1 == ' v' ) ? ' v' : ' n' )
13871387 endif
13881388
1389+ if a: replace_last_paste_selection == 1
1390+ " Replacing the previous put
1391+ let start = line (" '[" )
1392+ let end = line (" ']" )
1393+
1394+ if start != line (' .' )
1395+ call s: YRWarningMsg ( ' YR: You must paste text first, before you can replace' )
1396+ return
1397+ endif
1398+
1399+ if start == 0 || end == 0
1400+ return
1401+ endif
1402+
1403+ " If a count was provided (ie 5<C-P>), multiply the
1404+ " nextvalue accordingly and position the next paste index
1405+ " let which_elem = a:nextvalue * ((v_count > 0)?(v_count):1) * -1
1406+ let which_elem = matchstr (a: nextvalue , ' -\?\d\+' ) * ((v_count > 0 )?(v_count):1 ) * -1
1407+ let s: yr_last_paste_idx = s: YRGetNextElem (
1408+ \ s: yr_last_paste_idx , which_elem
1409+ \ )
1410+
1411+ let save_reg = getreg (default_register)
1412+ let save_reg_type = getregtype (default_register)
1413+ call setreg ( default_register
1414+ \ , s: YRGetValElemNbr ((s: yr_last_paste_idx- 1 ),' v' )
1415+ \ , s: YRGetValElemNbr ((s: yr_last_paste_idx- 1 ),' t' )
1416+ \ )
1417+
1418+ " First undo the previous paste
1419+ exec " normal! u"
1420+ " Check if the visual selection should be reselected
1421+ " Next paste the correct item from the ring
1422+ " This is done as separate statements since it appeared that if
1423+ " there was nothing to undo, the paste never happened.
1424+ exec " normal! " .
1425+ \ ((s: yr_prev_vis_mode== 0 ) ? " " : " gv" ).
1426+ \ ' "' .default_register.
1427+ \ s: yr_paste_dir
1428+ call setreg (default_register, save_reg, save_reg_type)
1429+ call s: YRSetPrevOP (' ' , ' ' , ' ' , ' n' )
1430+
1431+ return
1432+ endif
1433+
13891434 " User has decided to bypass the yankring and specify a specific
13901435 " register
13911436 if user_register != default_register
1392- if a: replace_last_paste_selection == 1
1393- call s: YRWarningMsg ( ' YR: A register cannot be specified in replace mode' )
1394- return
1437+ " if a:replace_last_paste_selection == 1
1438+ " call s:YRWarningMsg( 'YR: A register cannot be specified in replace mode' )
1439+ " return
1440+ " endif
1441+
1442+ " Check for the expression register, in this special case
1443+ " we must copy it's evaluation into the default buffer and paste
1444+ if user_register == ' ='
1445+ " Save the default register since Vim will only
1446+ " allow the expression register to be pasted once
1447+ " and will revert back to the default buffer
1448+ let save_default_reg = @"
1449+ call setreg (default_register, eval (histget (' =' , -1 )) )
13951450 else
1396- " Check for the expression register, in this special case
1397- " we must copy it's evaluation into the default buffer and paste
1398- if user_register == ' ='
1399- " Save the default register since Vim will only
1400- " allow the expression register to be pasted once
1401- " and will revert back to the default buffer
1402- let save_default_reg = @"
1403- call setreg (default_register, eval (histget (' =' , -1 )) )
1404- else
1405- let user_register = ' "' .user_register
1406- endif
1407- exec " normal! " .
1408- \ ((cmd_mode== ' n' ) ? " " : " gv" ).
1409- \ ((v_count > 0 )?(v_count):' ' ).
1410- \ ((user_register== ' =' )?' ' :user_register).
1411- \ a: direction
1412- if user_register == ' ='
1413- let @" = save_default_reg
1414- endif
1415- " In this case, we have bypassed the yankring
1416- " If the user hits next or previous we want the
1417- " next item pasted to be the top of the yankring.
1418- let s: yr_last_paste_idx = 1
1451+ let user_register = ' "' .user_register
1452+ endif
1453+ exec " normal! " .
1454+ \ ((cmd_mode== ' n' ) ? " " : " gv" ).
1455+ \ ((v_count > 0 )?(v_count):' ' ).
1456+ \ ((user_register== ' =' )?' ' :user_register).
1457+ \ a: direction
1458+ if user_register == ' ='
1459+ let @" = save_default_reg
14191460 endif
1461+ " In this case, we have bypassed the yankring
1462+ " If the user hits next or previous we want the
1463+ " next item pasted to be the top of the yankring.
1464+ let s: yr_last_paste_idx = 1
1465+
14201466 let s: yr_paste_dir = a: direction
14211467 let s: yr_prev_vis_mode = ((cmd_mode== ' n' ) ? 0 : 1 )
14221468 return
@@ -1489,73 +1535,31 @@ function! s:YRPaste(replace_last_paste_selection, nextvalue, direction, ...)
14891535 " return
14901536 " endif
14911537
1492- if a: replace_last_paste_selection == 1
1493- " Replacing the previous put
1494- let start = line (" '[" )
1495- let end = line (" ']" )
1496-
1497- if start != line (' .' )
1498- call s: YRWarningMsg ( ' YR: You must paste text first, before you can replace' )
1499- return
1500- endif
1501-
1502- if start == 0 || end == 0
1503- return
1504- endif
1505-
1506- " If a count was provided (ie 5<C-P>), multiply the
1507- " nextvalue accordingly and position the next paste index
1508- " let which_elem = a:nextvalue * ((v_count > 0)?(v_count):1) * -1
1509- let which_elem = matchstr (a: nextvalue , ' -\?\d\+' ) * ((v_count > 0 )?(v_count):1 ) * -1
1510- let s: yr_last_paste_idx = s: YRGetNextElem (
1511- \ s: yr_last_paste_idx , which_elem
1512- \ )
1513-
1514- let save_reg = getreg (default_register)
1515- let save_reg_type = getregtype (default_register)
1516- call setreg ( default_register
1517- \ , s: YRGetValElemNbr ((s: yr_last_paste_idx- 1 ),' v' )
1518- \ , s: YRGetValElemNbr ((s: yr_last_paste_idx- 1 ),' t' )
1519- \ )
1538+ " User hit p or P
1539+ " Supports this for example - 5"ayy
1540+ " And restores the current register
1541+ let save_reg = getreg (default_register)
1542+ let save_reg_type = getregtype (default_register)
1543+ let s: yr_last_paste_idx = 1
1544+ call setreg (default_register
1545+ \ , s: YRGetValElemNbr (0 ,' v' )
1546+ \ , s: YRGetValElemNbr (0 ,' t' )
1547+ \ )
1548+ exec " normal! " .
1549+ \ ((cmd_mode== ' n' ) ? " " : " gv" ).
1550+ \ ((v_count > 0 )?(v_count):' ' ).
1551+ \ ' "' .default_register.
1552+ \ a: direction
1553+ call setreg (default_register, save_reg, save_reg_type)
1554+ call s: YRSetPrevOP (
1555+ \ a: direction
1556+ \ , v_count
1557+ \ , default_register
1558+ \ , ' n'
1559+ \ )
1560+ let s: yr_paste_dir = a: direction
1561+ let s: yr_prev_vis_mode = ((cmd_mode== ' n' ) ? 0 : 1 )
15201562
1521- " First undo the previous paste
1522- exec " normal! u"
1523- " Check if the visual selection should be reselected
1524- " Next paste the correct item from the ring
1525- " This is done as separate statements since it appeared that if
1526- " there was nothing to undo, the paste never happened.
1527- exec " normal! " .
1528- \ ((s: yr_prev_vis_mode== 0 ) ? " " : " gv" ).
1529- \ ' "' .default_register.
1530- \ s: yr_paste_dir
1531- call setreg (default_register, save_reg, save_reg_type)
1532- call s: YRSetPrevOP (' ' , ' ' , ' ' , ' n' )
1533- else
1534- " User hit p or P
1535- " Supports this for example - 5"ayy
1536- " And restores the current register
1537- let save_reg = getreg (default_register)
1538- let save_reg_type = getregtype (default_register)
1539- let s: yr_last_paste_idx = 1
1540- call setreg (default_register
1541- \ , s: YRGetValElemNbr (0 ,' v' )
1542- \ , s: YRGetValElemNbr (0 ,' t' )
1543- \ )
1544- exec " normal! " .
1545- \ ((cmd_mode== ' n' ) ? " " : " gv" ).
1546- \ ((v_count > 0 )?(v_count):' ' ).
1547- \ ' "' .default_register.
1548- \ a: direction
1549- call setreg (default_register, save_reg, save_reg_type)
1550- call s: YRSetPrevOP (
1551- \ a: direction
1552- \ , v_count
1553- \ , default_register
1554- \ , ' n'
1555- \ )
1556- let s: yr_paste_dir = a: direction
1557- let s: yr_prev_vis_mode = ((cmd_mode== ' n' ) ? 0 : 1 )
1558- endif
15591563endfunction
15601564
15611565
@@ -1773,10 +1777,10 @@ function! s:YRMapsCreate(...)
17731777 exec ' xnoremap <silent>' .g: yankring_paste_v_akey ." :<C-U>YRPaste 'p', 'v'<CR>"
17741778 endif
17751779 if g: yankring_replace_n_pkey != ' '
1776- exec ' nnoremap <silent>' .g: yankring_replace_n_pkey ." :<C-U>YRReplace '-1', 'P' <CR>"
1780+ exec ' nnoremap <silent>' .g: yankring_replace_n_pkey ." :<C-U>YRReplace '-1', P <CR>"
17771781 endif
17781782 if g: yankring_replace_n_nkey != ' '
1779- exec ' nnoremap <silent>' .g: yankring_replace_n_nkey ." :<C-U>YRReplace '1', 'p' <CR>"
1783+ exec ' nnoremap <silent>' .g: yankring_replace_n_nkey ." :<C-U>YRReplace '1', p <CR>"
17801784 endif
17811785
17821786 let g: yankring_enabled = 1
0 commit comments