vim - VI/M ex 命令中标记一个字符 block

标签 vim vi

对于 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"

.这是一种非常直接的方法,仅在脚本中有用。

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

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

关于vim - VI/M ex 命令中标记一个字符 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8882611/

相关文章:

Linux gvim 与 vim

linux - 设置 Vim 背景颜色

Vim:执行当前文件?

linux - "cat"和 "vim"之间的不同显示

haskell - 为 Haskell Platform(标准库)生成 ctag,专门用于 prelude

vim - 在 vim 中保存文件导致窗口为空

Vim:如何更改当前行号的字体颜色

regex - 使用什么 Vim 命令删除文件每一行某个字符后的所有文本?

unicode - 如何从 .t​​xt 文件中删除 <96>

linux - 查找并替换由分隔符分隔的字符串