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

时间:2012-01-16 15:59:01

标签: vim vi

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寻址的方块字符,在{{1}中按 Ctrl - v 直接调用}}
  • normal mode处理的连续字符的 zipzag区域,通过在visual character mode
  • 中按 v 直接调用
  • normal mode寻址的连续行的行区域,通过按visual line mode中的 V 直接调用。在这种情况下,最初提出此主题时,上面已经说明了normal mode中的方便解决方案。

@SOLUTION

ex mode中的第M行,第I列到第N行,第J列的连续字符的选择 zipzag area ,与ex mode完全相同:

标志:

visual character mode

删除:

:normal! MggI|vNggJ|

猛拉:

:normal! MggI|vNggJ|d

移至第X行Y列

:normal! MggI|vNggJ|y

复制到第X行Y列

:normal! MggI|vNggJ|dXggY|p

@SOLUTION 2

:normal! MggI|vNggJ|yXggY|p 中的第M行,第I列到第N行,第J列,选择字符方块,与ex mode完全相同:

标志:

visual block mode

删除:

:execute "normal! MggI|\<C-v>NggJ|"

猛拉:

:execute "normal! MggI|\<C-v>NggJ|d"

移至第X行Y列

:execute "normal! MggI|\<C-v>NggJ|y"

复制到第X行Y列

:execute "normal! MggI|\<C-v>NggJ|dXggY|p"

2 个答案:

答案 0 :(得分:4)

您可以使用normal!从前命令模式使用视觉块模式:例如,从(42,10)到(54,20)中选择一个块(行,列)并将其拉出(两者都是行必须至少包含20个字符或者应设置virtualedit=block

execute "normal! 42gg10|\<C-v>54gg20|y"

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

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

  1. 设置标记'<'>'[']''
  2. 移动光标。
  3. 更改注册表@"@0
  4. 将一个项目添加到跳转列表。
  5. 覆盖以前的视觉选择。
  6. 更改v:countv:count1变量。

答案 1 :(得分:2)

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