移动文本块的更快方法


25

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

  1. 用可视模式(V)选择块,然后用删除 d; 或者,如果仅是一行,则使用 dd
  2. 转到我想要的文字是,我太傻记住的区别pP,所以我得到的时间的50%这一权利。(如果我弄错了:请重试一次)。
  3. 有时,缩进需要调整,因此我V再次进入可视模式 并重新选择相同的块,然后使用><修复它。

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

埃马克斯

也许还有另一种(甚至更好)的方法?


关于缩进问题,您可以通过粘贴]p[p而不是p或来解决P。这样,您粘贴的块将自动缩进。
贡萨洛·里贝罗

您可能想看Drew Neil Bubbling Text推荐的视频,建议使用vim-unimpaired
Hotschke

Answers:


13

有一个插件:dragvisuals.vim

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

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')

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

xmap <expr> D DVB_Duplicate()

这个插件比其他答案的优势:

  • 如果您尝试向上移动到第一行,则不会使任何文本消失。
  • 如果移至最后一行,它将扩展文件。
  • 向左/向右移动效果更好。

补充这些的另一个有用技巧是这些键绑定:

xnoremap > >gv
xnoremap < <gv

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


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

8

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

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

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

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

(您可以通过正常的视觉选择并向左和向右移动它们来完成此操作:vnoremap <left> dhPgvhohovnoremap <right> dpgvlolo。)


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

4

您可以重新映射一些键以移动线。例如,如果习惯于上下移动箭头,请使用上下箭头hjkl

例如在.vimrc上

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m,正常命令移动一条线

+1-2表示上一行或下一行(-1将行保持在同一位置)

gvVISUAL模式下再次选择相同的文本

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


这很好,但对我来说不行,因为我不喜欢使用=(它经常改变太多无关的格式)。
马丁·图尔诺伊


3

插件很少,但我更喜欢蒂姆·波普(Tim Pope)的vim- unimpaired (github)(Ingo Karkat LineJuggler与此类似)。

您可以从视觉上选择文本块,然后执行]e(e进行交换)将文本块向下移动([e用于其他方向)。使用.重复的动作(你有repeat.vim安装没有你)。如果您走得太远,则只需通过撤消即可u

现在我个人认为p并且P是如此常见的命令,最好在养成不良习惯之前先学习它们。然后,您可以使用]p粘贴相同的缩进。如果您使用的是无损伤的产品,则可以>p粘贴更深的压痕级别或=p粘贴并重新格式化。

如果您在记住时遇到麻烦pP那么可能会帮助您根据oand O命令来思考它们,这是一种对称。

正如其他人指出的那样,您可以gv用来重新选择视觉选择。但是,如果仅放置/粘贴文本,则将失去视觉选择。不要担心,因为每一个变化(与洋基!)将设置'[']围绕变更区域。因此,您可以通过缩进>'](阅读:向右移动直到最后一个更改的结尾),然后使用.重复缩进,直到文本位于正确的位置。

有关更多帮助,请参见:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv

2

如果知道要将文本块移动到的行号,则可以在:move命令中使用范围或可视选择,以将文本块移动到该行。

例如,如果我有以下文件:

1 aaa
2 bbb
3 ccc
4 ddd

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

这也适用于+/-偏移量。在上面的示例中,将:m+2线向下移动2行可以实现相同的结果。

对于文本块,唯一的区别是添加了范围或选择。要将aaa和bbb行移动到文件末尾,请使用:1,2m$($ =最后一行)之类的命令,或直观地选择行和:m$


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.