Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 在VI/M ex命令中标记一个字符块_Vim_Vi - Fatal编程技术网

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

Vim 在VI/M ex命令中标记一个字符块,vim,vi,Vim,Vi,对于VI/M来说,从第M行到第n行标记一个行块以准备删除、剪切和通过,或者复制和粘贴是非常困难的 :M,N d :M,N m p :M,N t p 如果VI/M还需要标记一个从第M行第i个字符到第n行第j个字符的字符块,是否可以实现与上述类似的 @编辑 除了下一个关于视觉块模式的回答外,关于键入简洁的ex命令的选项如何 @编辑2 要澄清一组字符的含义: 字符的方形块,由可视块模式寻址,在正常模式下按Ctrl-v可直接调用 连续字符的zipzag区域,由视觉字符模式寻址,在正常模式下按v键可

对于VI/M来说,从第M行到第n行标记一个行块以准备删除、剪切和通过,或者复制和粘贴是非常困难的

:M,N d
:M,N m p
:M,N t p 
如果VI/M还需要标记一个从第M行第i个字符到第n行第j个字符的字符块,是否可以实现与上述类似的

@编辑

除了下一个关于
视觉块模式
的回答外,关于键入简洁的ex命令的选项如何

@编辑2

要澄清一组字符的含义

  • 字符的方形块,由
    可视块模式
    寻址,在
    正常模式下按Ctrl-v可直接调用
  • 连续字符的zipzag区域,由
    视觉字符模式
    寻址,在
    正常模式下按v键可直接调用
  • 连续行的行区域,由
    可视行模式
    寻址,在
    正常模式下按V键可直接调用。在这种情况下,
    ex模式下的简便解决方案在最初提出此主题时已在上面进行了说明
@解决方案

ex模式下选择从第M行、第I列到第N行、第J列的连续字符的abitraryzipzag区域,与在
视觉字符模式下完全相同:

标记:

删除:

:normal! MggI|vNggJ|d
:execute "normal! MggI|\<C-v>NggJ|d"
美国佬:

移动到第X行第Y列

:normal! MggI|vNggJ|dXggY|p
:normal! MggI|vNggJ|yXggY|p
:execute "normal! MggI|\<C-v>NggJ|dXggY|p"
:execute "normal! MggI|\<C-v>NggJ|yXggY|p"
复制到第X行第Y列

:normal! MggI|vNggJ|dXggY|p
:normal! MggI|vNggJ|yXggY|p
:execute "normal! MggI|\<C-v>NggJ|dXggY|p"
:execute "normal! MggI|\<C-v>NggJ|yXggY|p"
@解决方案2

ex模式
中选择从第M行、第I列到第N行、第J列的字符的任意方形块,与在
可视块模式
中完全相同:

标记:

:执行“normal!MggI |\NggJ |”
删除:

:normal! MggI|vNggJ|d
:execute "normal! MggI|\<C-v>NggJ|d"
:执行“normal!MggI |\NggJ | d”
美国佬:

:执行“normal!MggI |\NggJ | y”
移动到第X行第Y列

:normal! MggI|vNggJ|dXggY|p
:normal! MggI|vNggJ|yXggY|p
:execute "normal! MggI|\<C-v>NggJ|dXggY|p"
:execute "normal! MggI|\<C-v>NggJ|yXggY|p"
:执行“normal!MggI |\NggJ | dXggY | p”
复制到第X行第Y列

:normal! MggI|vNggJ|dXggY|p
:normal! MggI|vNggJ|yXggY|p
:execute "normal! MggI|\<C-v>NggJ|dXggY|p"
:execute "normal! MggI|\<C-v>NggJ|yXggY|p"
:执行“normal!MggI |\NggJ | yXggY | p”

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

您可以使用
normal从ex命令模式使用可视块模式:例如,要从(42,10)到(54,20)中选择一个块(行、列),并将其拖动(两行必须至少有20个字符,或者应设置
virtualedit=block
):

执行“正常!42gg10 |\54gg20 | y”
。这是一种非常简单的方法,只在脚本中有用

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


  • 设置标记
    “呃,更好地解释一下你想做什么。M,N,J和。。。没什么帮助。您在示例中所写的行是做什么的?这些M和N有什么重要意义吗?另外,您想在vi还是在vim中执行此操作(现在大多数情况下都安装了vim)。如何在vim中构造ex命令来删除、剪切或复制并粘贴文件中任意位置的指定连续字符块?例如,如果您希望删除/拖动以“:M,N…”开头的每一行,我想我会使用正则表达式执行此操作。如果这只是我需要几次的东西,并且行数是已知的,则使用宏。简而言之,我需要在ex模式下使用与在视觉模式下相同的函数来选择字符块的任何定位开头和结尾;此外,还可以删除、移动或复制。“set virtualedit”在谈论虚拟块选择时也值得一提。琐事:您也可以通过单击并拖动来阻止选择…;)太好了,谢谢!虽然未能重复您的
    视觉块模式的示例,但我成功地实现了
    :正常!42gg10 | v54gg20 | y
    对于
    视觉模式
    @sof,您必须编写
    :执行
    、双引号和
    \
    ,或者使用“real”
    ,可以在ex模式下按
    获得。如果您正在编写scripts.Thx以获得澄清,请不要执行后者。我再试了一次,完全按照描述:
    :执行“normal!42gg10 |\20 | 54gg”
    ,但选择的是块
    [(42,1),(54,10)]
    ,而不是预期的
    [(42,10),(54,20)]
    。我最终发现,无论是在
    视觉模式下还是在
    视觉块模式下,头部和尾部字符的定位都应符合
    LINEggCOLUMN |
    ,因此
    :执行“normal!42gg10 |\54gg20 |”
    解决了问题。嗨,ZyX。你能修改答案来纠正这个小问题吗?那我很乐意接受。