在VI/M-ex命令中标记一个字符块



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"

这是一种非常简单的方法,只在脚本中有用。

请注意,此命令至少有以下副作用:

  1. 设置标记'<'>'[']''
  2. 移动光标
  3. 更改寄存器@"@0
  4. 向跳转列表中添加一项
  5. 覆盖以前的视觉选择
  6. 改变v:countv:count1变量

Ctrl+V启用视觉块模式,然后可以使用箭头键选择块。

最新更新