Skip to content

Commit 0c74d5b

Browse files
dfishburnvim-scripts
authored andcommitted
Version 16.0
BF: YankRing could report "YR: A register cannot be specified in replace mode" when using clipboard = unnamed or unnamedplus. This can often happen when fetching previous values from the YankRing (i.e. <C-N> or <C-P>).
1 parent 7551d5e commit 0c74d5b

File tree

2 files changed

+109
-101
lines changed

2 files changed

+109
-101
lines changed

doc/yankring.txt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
*yankring.txt* For Vim version 7.0.
22

3-
Author: David Fishburn Jnauary 2, 2013
4-
Version: 15.0
3+
Author: David Fishburn Jnauary 20, 2013
4+
Version: 16.0
55

66
For instructions on installing this file, type
77
:help add-local-help |add-local-help| inside Vim.
@@ -1220,9 +1220,13 @@ mapping: >
12201220
==============================================================================
12211221
7. History *yankring-history*
12221222

1223+
16.0: January 20, 2013
1224+
BF: YankRing could report "YR: A register cannot be specified in
1225+
replace mode" when using clipboard = unnamed or unnamedplus.
1226+
This can often happen when fetching previous values from
1227+
the YankRing (i.e. <C-N> or <C-P>).
1228+
12231229
15.0: January 2, 2013
1224-
NF: Automatically turn off relativenumber for the YankRing
1225-
window (Emma Tramp).
12261230
NF: Automatically turn off relativenumber for the YankRing
12271231
window (Emma Tramp).
12281232
NF: The YankRing window supports 1-9 to choose to paste those

plugin/yankring.vim

Lines changed: 101 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
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
2020
endif
2121

22-
let loaded_yankring = 150
22+
let loaded_yankring = 160
2323

2424
" Turn on support for line continuations when creating the script
2525
let 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
15591563
endfunction
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

Comments
 (0)