如何将视觉选择的文本移动到行尾,我应该使用哪个或哪些命令?
e.g。 /text3<CR>
请注意**是选定的文字,而不是其中的一部分。
**text3** text1 text2
**text3** text1 text2
然后转到:
text1 text2 **text3**
text1 text2 **text3**
我试过了:%s/\(text3\)\(.*\)/\2 \1/
其他任何方法吗?
答案 0 :(得分:3)
基本上你可以这样做(在视觉上选择你的文字之后就像把光标放在你的单词上,然后点击 v i w ) KBD> d $ p 。任何你可以为它创建一个宏,我曾经在类似的情况下使用类似的东西: q q / SEARCHTERM
输入 v 我 瓦特 d $ p Ĵ 0 q 。现在你可以执行 NUMBER(s) @ q 。
但作为更通用的解决方案:
:%s_\(YOUR_TEXT_TO_MOVE_TO_THE_EOL\)\(.*\)_\2\1
应该工作得很好。
答案 1 :(得分:1)
您可以使用:global
命令选择具有匹配模式的行,并:normal
对这些行进行操作。例如:
:g/^text3 /norm! dt p d0$p
:g/^text3 /<command>
在以text3开头,后跟空格的所有行上运行指定的<command>
。有关详细信息,请参阅:help :global
。
norm!
在正常模式下执行以下命令。请参阅:help :normal
。
dt p d0$p
删除到第一个空格,粘贴到所述空格后,向前移动一个字符并删除到该行的开头。移到行尾并粘贴。
答案 2 :(得分:1)
您可以使用Damian Conway's dragvisuals.vim
安装后,将以下(取消注释)添加到.vimrc
runtime plugin/dragvisuals.vim
vmap <expr> <LEFT> DVB_Drag('left')
vmap <expr> <RIGHT> DVB_Drag('right')
vmap <expr> <DOWN> DVB_Drag('down')
vmap <expr> <UP> DVB_Drag('up')
vmap <expr> D DVB_Duplicate()
" Remove any introduced trailing whitespace after moving...
let g:DVB_TrimWS = 1
或者,如果您使用箭头键进行正常运动,请选择四个 块拖动的其他键。例如:
vmap <expr> h DVB_Drag('left')
vmap <expr> l DVB_Drag('right')
vmap <expr> j DVB_Drag('down')
vmap <expr> k DVB_Drag('up')
或者:
vmap <expr> <S-LEFT> DVB_Drag('left')
vmap <expr> <S-RIGHT> DVB_Drag('right')
vmap <expr> <S-DOWN> DVB_Drag('down')
vmap <expr> <S-UP> DVB_Drag('up')
甚至:
vmap <expr> <LEFT><LEFT> DVB_Drag('left')
vmap <expr> <RIGHT><RIGHT> DVB_Drag('right')
vmap <expr> <DOWN><DOWN> DVB_Drag('down')
vmap <expr> <UP><UP> DVB_Drag('up')
使用可视模式选择并使用h,l,j或k等移动块。
答案 3 :(得分:0)
如果文字为iw
,则涉及text3
的解决方案将有效,但two words
会失败。
涉及$p
的任何方法都不会像:s
命令那样添加空格。您可以改为使用A <C-R>"<Esc>
。
如果你想在一行上完成它,并且已经在可视模式下选择了文本,那么x$p
就非常容易了。
如果文本在您刚刚搜索过的意义上被“选中”,并且使用搜索突出显示组突出显示,并且您想要在一行上进行更改,那么您可以使用{{1 }}。 d/<C-R>//e<CR>$p
将被当前搜索模式替换,因此您将获得类似<C-R>/
的内容。
如果您想在缓冲区中的所有匹配行上执行此操作,那么您的解决方案会稍微简化一下
d/text3/e<CR>$p
:%s/\v(<C-R>/)(.*)/\2 \1