我可以使Vim还将“小删除”保存到寄存器“ 1”中吗?


14

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

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

是否有可能让Vim将所有删除内容存储在寄存器中"1

nnoremap d "1d 几乎可以使用,但最终在寄存器"1 中都显示了文本"2

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

Answers:


10

当您使用此功能:set clipboard=unnamed(以前在Vim 7.3的较早版本中有效)(由于错误,请参阅Reddit讨论)我已经在此处报告了此错误。

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


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

5

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

它可以通过设置客户操作员功能来工作:

  1. 将寄存器1–8的内容存储在字典中,
  2. 执行删除到寄存器1中
  3. 将寄存器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 

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.