对于 VI/M 来说,标记从第 M 行到第 N 行的行 block 准备好删除、剪切和粘贴,或复制和粘贴是相当简单的。
:M,N d
:M,N m p
:M,N t p
如果进一步要求VI/M标记从第M行第I个字符到第N行第J个字符的字符 block ,是否可以类似完成?
@编辑
除了要求 visual block mode
的下一个答案外,输入简洁的 ex 命令的选项怎么样?
@编辑 2
阐明字符 block 的含义:
- 正方形 block 字符,由
visual block mode
寻址,通过在normal mode
中按 Ctrl-v 直接调用 - 连续字符的压缩区域,由
visual character mode
寻址,通过在normal mode
中按 v 直接调用 - 连续行的行区域,由
visual line mode
寻址,通过在normal mode
中按 V 直接调用。在这种情况下,最初提出此主题时,上面已经说明了ex mode
中的便捷解决方案。
@解决方案
在 ex mode
中选择从第 M 行第 I 列到第 N 行第 J 列的连续字符的任意zipzag 区域 与 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 列中选择任意方 block 字符,与 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 命令模式使用可视 block 模式: 例如,要从 (42, 10) 到 (54, 20) 中选择一个 block (行,列)并将其抽出(两行必须至少有 20 个字符,否则应设置 virtualedit=block
):
execute "normal! 42gg10|\<C-v>54gg20|y"
.这是一种非常直接的方法,仅在脚本中有用。
请注意,此命令至少有以下副作用:
- 设置标记
'<
,'>
,'[
,']
,''
. - 移动光标。
- 更改寄存器
@"
,@0
. - 将一项添加到跳转列表。
- 覆盖之前的视觉选择。
- 改变
v:count
和v:count1
变量。
关于vim - VI/M ex 命令中标记一个字符 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8882611/