如果您不熟悉它的工作原理,在Pico和Nano中你可以多次点击ctrl-k,它会将每一行添加到剪贴板.然后你可以按住"解锁"这个.这是一个非常有用的命令.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')
Run Code Online (Sandbox Code Playgroud)
寄存器@a用于跟踪是否应追加切割线.寄存器@b用作剪贴板寄存器.每当光标位置改变时,您将停止处于"追加"模式.因此,您可以反复按住ctrl-k以保持追加线,但是一旦移动光标,您就会恢复正常.我很确定这就是Nano和Pico在引擎盖下实现它的方式.
有人知道更清洁的解决方案吗?
您正在寻找的Vim命令是删除/剪切,dd以及放置/粘贴,p.默认情况下,每个命令都使用未命名的寄存器"".因此,dd将删除一行并将新删除的行放入未命名的寄存器中.p将未命名寄存器中的内容放入当前缓冲区.
Vim不仅仅是未命名的寄存器,还有命名寄存器.这些寄存器是a- z.
:registers."add"Add""add第一行,然后通过附加下一行"Add.对于重复删除使用.dap删除一个段落.看到:h text-objectsd}删除到段落结尾d/foo<cr>V6jd.使用可视模式没有错此外,除非要插入文本,否则您希望不要使用插入模式.您只希望一次插入移动短脉冲.大多数时候你应该处于普通模式,因此得名.
对于Vi/Vim方式上的一篇好帖子,请参阅这篇StackOverflow文章:你对Vim的问题是你没有grok vi.
如果没有标准的Vim技巧满足您的需求,您可能需要查看支持线路交换的插件,如Unimpaired或LineJuggler.
但是,如果您确实需要类似这种nano/pico功能的东西,可以将它放在您的~/.vimrc文件中使用以下内容:
nnoremap Q :<c-u>call <SID>DeleteAppend()<cr>
function! s:DeleteAppend()
let save = @a
let @a = @@
let reg = get(g:, 'append_tick', -1) == b:changedtick ? 'A' : 'a'
execute 'normal! "' . reg . 'dd'
let g:append_tick = b:changedtick
let @@ = @a
let @a = save
endfunction
Run Code Online (Sandbox Code Playgroud)
的Q正常命令现在将删除一行,直到执行另一个命令附加额外删除的行.用法示例:QQjjQQQp
:h d
:h p
:h "
:h registers
:h :reg
:h motion
:h text-objects
:h .
:h visual-mode
Run Code Online (Sandbox Code Playgroud)