如果您不熟悉它的工作原理,在Pico和Nano中你可以多次点击ctrl-k,它会将每一行添加到剪贴板。然后你可以按下" uncut"这个。这是一个非常有用的命令。 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')
寄存器@a用于跟踪是否应追加切割线。寄存器@b用作剪贴板寄存器。每当光标位置改变时,你就不再进入&#34;追加&#34;模式。因此,您可以反复按住ctrl-k以保持追加线,但是一旦移动光标,您就会恢复正常。我非常确定Nano和Pico是如何在幕后实现它的。
有人知道更清洁的解决方案吗?
答案 0 :(得分:5)
您要查找的Vim命令是删除/剪切,dd
和放置/粘贴,p
。默认情况下,每个命令都使用未命名的寄存器""
。因此dd
将删除一行并将新删除的行放入未命名的寄存器中。 p
会将未命名寄存器中的内容放入当前缓冲区。
Vim不仅仅是未命名的寄存器,还有命名寄存器。这些寄存器是a
- z
。
:registers
。"add
"Add"
"add
第一行,然后通过"Add
追加下一行。对于重复删除,请使用.
dap
用于删除段落。请参阅:h text-objects
d}
删除到段落结尾d/foo<cr>
V6jd
。使用可视模式没有错误此外,除非要插入文本,否则您希望不要进入插入模式。您只希望一次插入移动短脉冲。大多数情况下你应该处于普通模式,因此得名。
有关Vi / Vim方式的精彩帖子,请参阅此StackOverflow帖子:Your problem with Vim is that you don't 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
Q
普通命令现在将删除一行并附加其他删除的行,直到执行另一个命令。用法示例:QQjjQQQp
:h d
:h p
:h "
:h registers
:h :reg
:h motion
:h text-objects
:h .
:h visual-mode
答案 1 :(得分:0)
是的,有许多更清洁的解决方案:
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
Vim对其他编辑的重大优势之一就是它的表达语言:不要在“纳米”中思考,在“Vim”中思考。