1
1
" yankring.vim - Yank / Delete Ring for Vim
2
2
" ---------------------------------------------------------------
3
- " Version: 15 .0
3
+ " Version: 16 .0
4
4
" Author: David Fishburn <dfishburn dot vim at gmail dot com>
5
5
" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
6
- " Last Modified: 2012 Dec 14
6
+ " Last Modified: 2013 Jan 20
7
7
" Script: http://www.vim.org/scripts/script.php?script_id=1234
8
8
" Based On: Mocked up version by Yegappan Lakshmanan
9
9
" http://groups.yahoo.com/group/vim/post?act=reply&messageNum=34406
@@ -19,7 +19,7 @@ if v:version < 700
19
19
finish
20
20
endif
21
21
22
- let loaded_yankring = 150
22
+ let loaded_yankring = 160
23
23
24
24
" Turn on support for line continuations when creating the script
25
25
let s: cpo_save = &cpo
@@ -1386,37 +1386,83 @@ function! s:YRPaste(replace_last_paste_selection, nextvalue, direction, ...)
1386
1386
let cmd_mode = ((a: 1 == ' v' ) ? ' v' : ' n' )
1387
1387
endif
1388
1388
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
+
1389
1434
" User has decided to bypass the yankring and specify a specific
1390
1435
" register
1391
1436
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 )) )
1395
1450
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
1419
1460
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
+
1420
1466
let s: yr_paste_dir = a: direction
1421
1467
let s: yr_prev_vis_mode = ((cmd_mode== ' n' ) ? 0 : 1 )
1422
1468
return
@@ -1489,73 +1535,31 @@ function! s:YRPaste(replace_last_paste_selection, nextvalue, direction, ...)
1489
1535
" return
1490
1536
" endif
1491
1537
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 )
1520
1562
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
1559
1563
endfunction
1560
1564
1561
1565
@@ -1773,10 +1777,10 @@ function! s:YRMapsCreate(...)
1773
1777
exec ' xnoremap <silent>' .g: yankring_paste_v_akey ." :<C-U>YRPaste 'p', 'v'<CR>"
1774
1778
endif
1775
1779
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>"
1777
1781
endif
1778
1782
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>"
1780
1784
endif
1781
1785
1782
1786
let g: yankring_enabled = 1
0 commit comments