这是我通常复制一段文本或代码的方式:
- 用可视模式(V)选择块,然后用删除 d; 或者,如果仅是一行,则使用 dd。
- 转到我想要的文字是,我太傻记住的区别p和P,所以我得到的时间的50%这一权利。(如果我弄错了:请重试一次)。
- 有时,缩进需要调整,因此我V再次进入可视模式 并重新选择相同的块,然后使用>或 <修复它。
有没有更简单的方法?在某些编辑器中,我看到您可以“拾取”一段文本,然后四处移动;这是Emacs的示例(但我在其他编辑器中也看到了此示例):
也许还有另一种(甚至更好)的方法?
这是我通常复制一段文本或代码的方式:
有没有更简单的方法?在某些编辑器中,我看到您可以“拾取”一段文本,然后四处移动;这是Emacs的示例(但我在其他编辑器中也看到了此示例):
也许还有另一种(甚至更好)的方法?
Answers:
有一个插件: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
)。
对于第3步,您可以gv=
改用(=
表示缩进,gv
表示“重新选择上一个视觉选择”)。
对于Emacs行为,在.vimrc中添加一些映射非常简单:
vnoremap <down> dpV`]
vnoremap <up> dkPV`]
然后,您可以使用向上和向下箭头键在可视线选择周围移动。(当然,如果您讨厌箭头,也可以映射到其他键。)
(您可以通过正常的视觉选择并向左和向右移动它们来完成此操作:vnoremap <left> dhPgvhoho
和vnoremap <right> dpgvlolo
。)
gv
转到最后一个视觉选择,在这种情况下将是被删除的段落。我想念什么?
您可以重新映射一些键以移动线。例如,如果习惯于上下移动箭头,请使用上下箭头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将行保持在同一位置)
gv
在VISUAL
模式下再次选择相同的文本
此解决方案不会干扰寄存器,因此任何复制的文本仍然可用,并且可以重新格式化代码以设置适当的缩进等。
=
(它经常改变太多无关的格式)。
我找到的最简单的方法记录在这里:http : //vimrcfu.com/snippet/77
将以下内容放入您的.vimrc
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv
插件很少,但我更喜欢蒂姆·波普(Tim Pope)的vim- unimpaired (github)(Ingo Karkat LineJuggler与此类似)。
您可以从视觉上选择文本块,然后执行]e
(e进行交换)将文本块向下移动([e
用于其他方向)。使用.
重复的动作(你有repeat.vim安装没有你)。如果您走得太远,则只需通过撤消即可u
。
现在我个人认为p
并且P
是如此常见的命令,最好在养成不良习惯之前先学习它们。然后,您可以使用]p
粘贴相同的缩进。如果您使用的是无损伤的产品,则可以>p
粘贴更深的压痕级别或=p
粘贴并重新格式化。
如果您在记住时遇到麻烦p
,P
那么可能会帮助您根据o
and O
命令来思考它们,这是一种对称。
正如其他人指出的那样,您可以gv
用来重新选择视觉选择。但是,如果仅放置/粘贴文本,则将失去视觉选择。不要担心,因为每一个变化(与洋基!)将设置'[
和']
围绕变更区域。因此,您可以通过缩进>']
(阅读:向右移动直到最后一个更改的结尾),然后使用.
重复缩进,直到文本位于正确的位置。
有关更多帮助,请参见:
:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv
如果知道要将文本块移动到的行号,则可以在: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 。
可从
视觉和普通模式下的默认映射:
<A-k> Move current line/selection up
<A-j> Move current line/selection down
]p
或[p
而不是p
或来解决P
。这样,您粘贴的块将自动缩进。