VI/M标记一个从第M行到第N行的行块以准备删除、剪切&过去或复制&粘贴
:M,N d
:M,N m p
:M,N t p
如果进一步要求VI/M标记从第M行的第I个字符到第N行的第J个字符的字符块,是否可以实现与上述类似的?
@EDIT
除了visual block mode
的下一个答案外,键入简洁的ex命令的选项如何?
@EDIT 2
要澄清一个字符块的含义:
- 字符的方形块,由
visual block mode
寻址,通过按下normal mode
中的Ctrl-v直接调用 - 连续字符的zipzag区域,由
visual character mode
寻址,通过按下normal mode
中的v直接调用 - 连续行的行区域,由
visual line mode
寻址,通过按下normal mode
中的V直接调用。在这种情况下,ex mode
中方便的解决方案在最初提出该主题时已经在上面进行了说明
@解决方案
选择ex mode
中从M行、I列到N行、J列的连续字符的任意压缩区域与visual character mode
:完全相同
标记:
:normal! MggI|vNggJ|
删除:
:normal! MggI|vNggJ|d
扬克:
:normal! MggI|vNggJ|y
移动到第X行第Y列
:normal! MggI|vNggJ|dXggY|p
复制到第X行第Y列
:normal! MggI|vNggJ|yXggY|p
@解决方案2
在ex mode
中从M行、I列到N行、J列选择一个方形块字符,与visual block mode
:完全相同
标记:
:execute "normal! MggI|<C-v>NggJ|"
删除:
:execute "normal! MggI|<C-v>NggJ|d"
扬克:
:execute "normal! MggI|<C-v>NggJ|y"
移动到第X行第Y列
:execute "normal! MggI|<C-v>NggJ|dXggY|p"
复制到第X行第Y列
:execute "normal! MggI|<C-v>NggJ|yXggY|p"
您可以使用normal!
从ex命令模式使用视觉块模式:例如,从(42,10)到(54,20)选择一个块(行、列)并拖动它(两行必须至少有20个字符,否则应设置virtualedit=block
):
execute "normal! 42gg10|<C-v>54gg20|y"
这是一种非常简单的方法,只在脚本中有用。
请注意,此命令至少有以下副作用:
- 设置标记
'<
、'>
、'[
、']
、''
- 移动光标
- 更改寄存器
@"
、@0
- 向跳转列表中添加一项
- 覆盖以前的视觉选择
- 改变
v:count
和v:count1
变量
Ctrl+V启用视觉块模式,然后可以使用箭头键选择块。