在可视模式(V)下选择该块,然后用
转到我想要的文本位置,我太愚蠢了,无法记住p和P之间的区别大约有50%的时间是正确的。
(如果我弄错了:请重试一次)。
有时,压痕需要调整,因此我再次使用
V进入可视模式,然后重新选择相同的块,然后使用>或
<进行修复。
有没有更简单的方法?在某些编辑器中,我已经看到您可以照原样“拾取”一块文本,然后四处移动;这是来自Emacs的示例(但是我在其他编辑器中也看到了此示例):
#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> dhPgvhoho
和vnoremap <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
重新选择视觉选择。但是,如果仅放置/粘贴文本,则将丢失视觉选择。不要担心,因为每次更改(和拉扯!)都会在更改后的区域周围设置p
和P
。因此,您可以通过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
评论
关于缩进问题,可以通过粘贴] p或[p而不是p或P来解决。您可能想看Drew Neil Bubbling Text推荐的视频,建议使用vim-unimpaired。