Vim中是否可以像Nano和Pico中一样具有Ctrl-K剪切/未剪切功能?

Vim中是否可以像Nano和Pico中一样具有Ctrl-K剪切/未剪切功能?,vim,Vim,如果您不熟悉它的工作原理,在Pico和Nano中,您可以多次按ctrl-k,它会将每一行添加到剪贴板。然后您可以按住ctrl-u键以“取消剪切”此项。这是一个非常有用的命令。Vim与dd命令做了一些类似的事情,但它一次只能工作一行。因此,您必须使用视觉模式来正确完成上述任务 我在网上找不到好的答案,所以我推出了自己的解决方案。您可以将其添加到vimrc文件中: imap <C-k> <Esc>:execute @a ? 'normal! "Bdd' : 'normal!

如果您不熟悉它的工作原理,在Pico和Nano中,您可以多次按ctrl-k,它会将每一行添加到剪贴板。然后您可以按住ctrl-u键以“取消剪切”此项。这是一个非常有用的命令。Vim与dd命令做了一些类似的事情,但它一次只能工作一行。因此,您必须使用视觉模式来正确完成上述任务

我在网上找不到好的答案,所以我推出了自己的解决方案。您可以将其添加到vimrc文件中:

imap <C-k> <Esc>:execute @a ? 'normal! "Bdd' : 'normal! "bdd'<cr>:let @a=1<cr>:echo ''<cr>i
imap <C-u> <Esc>"bPi
autocmd CursorMovedI * execute(':let @a=0')
imap:execute@a?“典型的“Bdd':“正常!”Bdd':让@a=1:echo'i
imap“bPi
autocmd CursorMovedI*执行(':let@a=0')
寄存器@a用于跟踪是否应追加剪切线。寄存器@b用作剪贴板寄存器。每当光标位置发生变化时,您将停止处于“追加”状态“模式。因此,可以反复按ctrl-k键以继续追加线,但只要移动光标,就可以恢复正常。我很确定Nano和Pico就是这样在引擎盖下实现的

有人知道更清洁的解决方案吗?

寄存器介绍 您正在查找的Vim命令是delete/cut、
dd
和put/paste、
p
。默认情况下,这些命令中的每一个都使用未命名寄存器,
”。因此,
dd
将删除一行,并将新删除的行放入未命名寄存器
p
将把未命名寄存器中的内容放入当前缓冲区

Vim不仅仅有未命名的寄存器,它还有命名寄存器。这些寄存器是
a
-
z

  • 要查看寄存器设置为什么,可以执行
    :registers
  • 要使用命名寄存器前缀,请将命令与引号和小写字母一起使用,例如,
    “添加
  • 大写字母将附加而不是替换寄存器的内容,例如
    “Add”
维姆之路
  • “添加第一行
    ,然后通过
    “添加
    ”追加下一行。对于重复删除,请使用
  • 使用文本对象。例如,
    dap
    删除段落。请参见
    :h文本对象
  • 通过一些动作删除文本。例如,
    d}
    被删除到段落末尾
  • 删除到正则表达式模式,例如
    d/foo
  • 最后是使用视觉模式,
    V6jd
    。使用视觉模式没有错
此外,除非正在插入文本,否则您希望退出插入模式。您只希望一次处于插入移动状态以进行短突发。大多数情况下,您应该处于正常模式,因此得名

有关Vi/Vim方式的一篇好文章,请参阅此StackOverflow帖子:

选择 如果没有一个标准的Vim技巧能够满足您的需求,那么您可能需要研究支持类似或的线路交换的插件

但是,如果您确实想要类似的nano/pico功能,您可以通过将其放入
~/.vimrc
文件来使用以下功能:

nnoremap Q:calldeleteAppend()
函数!s:DeleteAppend()
让save=@a
设@a=@@
让reg=get(g:,'append_tick',-1)==b:changedtick?'A':'A'
执行“正常!”。雷格。”dd'
设g:append_tick=b:changedtick
让我们来看一看
让@a=save
端功能
Q
normal命令现在将删除一行并附加其他已删除的行,直到执行另一个命令。用法示例:
qqjqqqp

如需更多帮助,请参阅 寄存器简介 您正在查找的Vim命令是delete/cut、
dd
和put/paste、
p
。默认情况下,这些命令中的每一个都使用未命名寄存器,
”。因此,
dd
将删除一行,并将新删除的行放入未命名寄存器
p
将把未命名寄存器中的内容放入当前缓冲区

Vim不仅仅有未命名的寄存器,它还有命名寄存器。这些寄存器是
a
-
z

  • 要查看寄存器设置为什么,可以执行
    :registers
  • 要使用命名寄存器前缀,请将命令与引号和小写字母一起使用,例如,
    “添加
  • 大写字母将附加而不是替换寄存器的内容,例如
    “Add”
维姆之路
  • “添加第一行
    ,然后通过
    “添加
    ”追加下一行。对于重复删除,请使用
  • 使用文本对象。例如,
    dap
    删除段落。请参见
    :h文本对象
  • 通过一些动作删除文本。例如,
    d}
    被删除到段落末尾
  • 删除到正则表达式模式,例如
    d/foo
  • 最后是使用视觉模式,
    V6jd
    。使用视觉模式没有错
此外,除非正在插入文本,否则您希望退出插入模式。您只希望一次处于插入移动状态以进行短突发。大多数情况下,您应该处于正常模式,因此得名

有关Vi/Vim方式的一篇好文章,请参阅此StackOverflow帖子:

选择 如果没有一个标准的Vim技巧能够满足您的需求,那么您可能需要研究支持类似或的线路交换的插件

但是,如果您确实想要类似的nano/pico功能,您可以通过将其放入
~/.vimrc
文件来使用以下功能:

nnoremap Q:calldeleteAppend()
函数!s:DeleteAppend()
让save=@a
设@a=@@
让reg=get(g:,'append_tick',-1)==b:changedtick?'A':'A'
执行“正常!”。雷格。”dd'
设g:append_tick=b:changedtick
让我们来看一看
让@a=save
端功能
Q
normal命令现在将删除一行并附加其他已删除的行,直到执行另一个命令。用法示例:
qqjqqqp

对于
:h d
:h p
:h "
:h registers
:h :reg
:h motion
:h text-objects
:h .
:h visual-mode
12dd{motion}p         " cut 12 lines, move elsewhere, paste

d5j{motion}p          " cut from here to 5 lines down, move elsewhere, paste

d/foo<CR>{motion}p    " cut from here to next 'foo', move elsewhere, paste

:.,23d<CR>:12put<CR>  " cut from here to line 23, paste after line 12

:.,+5d<CR>:0put<CR>   " cut from here to fifth line below, paste at top of buffer
:.,11m35<CR>          " move the lines between this one and 11 to after line 35 
Vjjjjjjjjjjd{motion}p