我最近从设置中删除了YankRing插件,部分原因是它导致了宏的一些问题,但主要是因为我决定最好训练自己使用Vim的寄存器,尤其是删除文本最初存储在寄存器中的方式。 "1,然后向上移动到"2"3等,因为进行进一步的删除非常有用。

但是,当删除/更改删除少于一行的文本时,会将其存储在"-小删除寄存器中(某些移动命令有一些例外)。如果随后进行了一些小删除,则会丢失一部分文字。

是否可以使Vim将所有删除内容存储在寄存器"1中?

nnoremap d "1d几乎可以工作,但是您最后以两个寄存器"1"2中的文本结尾。

我不介意小型删除寄存器的功能是否受到影响。建议我更改行为以将小的删除内容保存到命名寄存器中绝对不是一个有帮助的答案-这就是我目前正在做的事情。

#1 楼

当您在:set clipboard=unnamed上使用时,此功能可在Vim 7.3的较早版本中使用(由于错误,请参阅此Reddit讨论,该错误已在此处报告。

该线程包含Aryeh Leib Taurog制作的补丁,引入了一个'regone'选项。这已经使它成为了(太长的待办事项)列表,但是不太可能很快被合并。因此,您目前只能选择降级到过时的Vim,或者使用该补丁自己构建Vim(并且在vim_dev邮件列表上推送以通过)。

评论


有趣! (尤其是您对阈值的想法。)谢谢您提供的信息。暂时暂不接受赞美/接受,以鼓励他人提出一些疯狂的VimScript在此期间这样做。

–丰富
2015年3月11日13:35



#2 楼

我有一个概念验证的解决方案,该解决方案适用于带有运动和可视模式的d命令。它还不是一个完全健壮的解决方案(例如,d[count]d不起作用,[count]D也不起作用),但是它几乎涵盖了我的所有实际用例。

通过设置客户操作员功能可以工作表示:


将寄存器1–8的内容存储在字典中,
将删除内容执行到寄存器1中,
将寄存器2–9设置为先前的已保存寄存器1–8的内容。

有关操作员功能如何工作的说明,请参见:help map-operator

function! ShiftingDeleteOperator(type)
  let reg_dict = {}
  for k in range(1, 8)
    execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
  endfor

  if a:type ==# 'v'
    execute 'normal! `<v`>d'
  elseif a:type ==# 'V'
    execute 'normal! `<V`>d'
  elseif a:type ==# "\<C-V>"
    execute "normal! `<\<C-V>`>d"
  elseif a:type ==# 'char'
    execute 'normal! `[v`]d'
  elseif a:type ==# 'line'
    execute "normal! '[V']d"
  else
    return
  endif

  let deleted = getreg('"', 1)
  call setreg(1, deleted)

  for [k, v] in items(reg_dict)
    execute printf("call setreg(%d, v)", k + 1)
  endfor
endfunction

" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd 


评论


很抱歉对旧答案发表评论。我对y和c采用了这种解决方案,但是对于c,我的nvim在执行该操作后不会进入插入模式...当前,我必须执行l和startinsert,这不是一个正确的解决方法(例如c $会将光标放在错误的位置)。有任何想法吗?

–晴天双关语
18年6月28日在4:53

#3 楼

将请求提交到neovim编辑器中:

[RFC]添加选项以使用编号寄存器进行较小的删除#8169

我尝试添加smalldel选项,它允许您配置要被推送到编号寄存器“ 1 ..” 9中的已删除字符的最小数量。9

合并此PR之后的下一个neovim版本(如果发生这种情况)将包含此内容。选项。