这是我通常复制文本或代码块的方式:


在可视模式(V)下选择该块,然后用
转到我想要的文本位置,我太愚蠢了,无法记住p和P之间的区别大约有50%的时间是正确的。
(如果我弄错了:请重试一次)。
有时,压痕需要调整,因此我再次使用
V进入可视模式,然后重新选择相同的块,然后使用>或
<进行修复。

有没有更简单的方法?在某些编辑器中,我已经看到您可以照原样“拾取”一块文本,然后四处移动;这是来自Emacs的示例(但是我在其他编辑器中也看到了此示例):

评论

关于缩进问题,可以通过粘贴] p或[p而不是p或P来解决。
您可能想看Drew Neil Bubbling Text推荐的视频,建议使用vim-unimpaired。

#1 楼

有一个插件:dragvisuals.vim。

默认情况下它不绑定任何键,因此您必须自己做。我喜欢将它们映射到Control + Arrow键:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')


它还带有一个奖励键来复制当前选择:

此插件在其他答案上的优点:


如果您尝试将其移动到第一行以上,则不会丢失任何文本。
如果您移动到最后一行的下面,它将扩展文件。
向左/右移动会更好一些。 br />
xmap <expr> D DVB_Duplicate()


在视觉模式下使用>后,它将重新选择上一个视觉选择,因此您可以更轻松地调整对齐方式(也可以使用箭头键,但这会将其移动一个字符,而不是一个shiftwidth)。

评论


为此,还有一个插件,我建议的插件的作者将其描述为“对我自己的dragvisuals.vim进行了改进的重做”:github.com/zirrostig/vim-schlepp

–杰伊·汤普森(Jay Thompson)
16-2-21在11:29

#2 楼

对于第3步,您可以改用gv==表示缩进,而gv表示“重新选择上一个视觉选择”)。

对于Emacs行为,在您的代码中添加一些映射非常简单。 .vimrc:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]


然后您可以使用向上和向下箭头键在视觉线选择周围移动。 (当然,如果您讨厌箭头,也可以映射到不同的键。)

(您可以使用常规的视觉选择并向左和向右移动它们:vnoremap <left> dhPgvhohovnoremap <right> dpgvlolo。)

评论


gv转到最后一个视觉选择,在这种情况下,这将是被删除的段落。我想念什么?

–罗伯特·史密斯
2015年2月8日,下午1:36

#3 楼

您可以重新映射一些键以移动线。例如,如果习惯于通过hjkl来上下移动箭头。移动一行

:m+1以指示一行向上或向下(-1保持该行在同一位置)模式

此解决方案不会干扰寄存器,因此任何复制的文本仍然可用,并且可以重新格式化代码以设置适当的缩进等。

评论


这很好,但对我而言并不好,因为我不喜欢使用=(它经常改变太多无关的格式)。

–马丁·图尔诺伊(Martin Tournoij)
2015年2月8日在21:16

我映射,这样我也可以映射插入模式

– Erik Lievaart
20年8月3日在22:05

#4 楼

我找到的最简单的方法记录在这里:http://vimrcfu.com/snippet/77

在.vimrc中放入以下内容

vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv


评论


这似乎与凯尔本(Khelben)2月8日的回答相同吗?

–马丁·图尔诺伊(Martin Tournoij)
15年2月19日在12:29

另请参阅截屏视频#65:Greg Hurell垂直移动线

–霍奇克
18年4月12日在16:16

#5 楼

很少有插件,但是我更喜欢蒂姆·波普的vim-unimpaired(github)(Ingo Karkat LineJuggler是类似的)。块向下(另一方向为]e)。使用[e重复该操作(您确实安装了repeat.vim吗?)。如果您走得太远,那么只需通过.撤消即可。然后,您可以使用u粘贴相同的缩进。如果您使用的是无损伤的,可以执行p来粘贴更深的压痕级别,或者执行P来粘贴并重新格式化。 ]p>p命令是一种对称命令。

正如其他人指出的那样,您可以使用=p重新选择视觉选择。但是,如果仅放置/粘贴文本,则将丢失视觉选择。不要担心,因为每次更改(和拉扯!)都会在更改后的区域周围设置pP。因此,您可以通过o进行缩进(阅读:向右移直到最后一个更改的结尾),然后使用O重复缩进,直到将文本放在正确的位置。 />
:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv


#6 楼

如果您知道要将文本块移动到的行号,则可以使用范围或可视选择与:move命令一起将文本块移动到该行。例如,如果我有以下文件:

1 aaa
2 bbb
3 ccc
4 ddd


我想将a的行移动到c的行之后,将光标放在a的行上并输入:m3 ,然后移动该行。

也可以使用+/-偏移量。在上面的示例中,使用:m+2将第2行向下移动也可以实现相同的结果。要将aaa和bbb行移动到文件末尾,请使用类似:1,2m$($ =最后一行)的命令,或直观地选择这些行和:m$

评论


有关:move的更多提示,另请参见vim.wikia.com/wiki/Moving_lines_up_or_down或D. Neil在《实用Vim》一书中使用“:t”和“:m”命令复制或移动提示29。

–霍奇克
18年4月12日在16:38

#7 楼

matze插件vim-move




https://www.vim.org/scripts/script.php?script_id=4687
https://github.com/matze/vim-move

可视和普通模式下的默认映射:

<A-k>   Move current line/selection up
<A-j>   Move current line/selection down