38、Vile编辑器:强大功能与特色模式深度解析

Vile编辑器核心功能解析

Vile编辑器:强大功能与特色模式深度解析

Visual Mode

Vile在高亮待操作文本的方式上与Elvis和Vim有所不同,它采用“引用动作”命令 q 。操作步骤如下:
1. 在区域起始处输入 q
2. 运用其他vi动作移动到区域的另一端。
3. 再次输入 q 结束引用动作,此时Vile会高亮标记的文本。

q 命令的参数决定了高亮的类型:
- 1q (等同于 q ):精确高亮。
- 2q :逐行高亮。
- 3q :矩形高亮。

通常,引用动作会与操作符(如 d y )结合使用。例如, d3qjjwq 会删除由这些动作指定的矩形区域。若不使用操作符,区域会保持高亮状态,之后可通过 ^S 引用该区域,如 d ^S 会删除高亮区域。

此外,矩形区域还可通过标记来指定。标记有不同的引用形式:
- 用 ` 引用时指向特定字符。
- 用 ' 引用时指向特定行。
- 例如, d'b 会删除一组行,而 d`` b 会删除两行的部分内容以及它们之间的行。使用 `` ` 形式的标记引用能得到比 ’` 形式更“精确”的区域。

Vile还新增了第三种标记引用形式,即 \ 命令。单独使用时,它的行为与 ` 相同,会将光标移动到标记设置的字符处;但与操作符结合使用时,标记引用会变成“矩形”,例如 d\b 会删除以光标和标记 b 所在字符为角的矩形字符区域。

以下是相关操作示例:
| 按键操作 | 结果 |
| — | — |
| ma | 在“book”的 b 处设置标记 a 。文本内容为:
The 6th edition of Learning the vi Editor
brings the book into the late 1990’s.
In particular, besides the “original” version of
vi that comes as a standard part of every Unix system,
there are now a number of freely available “clones”
or work-alike editors. |
| 3jfr | 将光标移动到“number”的 r 处,标记对角。文本内容不变。 |
| ^A ~\a | 切换由标记 a 界定的矩形区域内字符的大小写。文本变为:
The 6th edition of Learning the vi Editor
brings the BOOK INTO The late 1990’s.
In particulAR, BESIDES the “original” version of
vi that comes as a standard part of every Unix system,
there are nOW A NUMBER of freely available “clones”
or work-alike editors. |

Vile定义任意区域并对其进行操作的命令总结如下表:
| 命令 | 操作 |
| — | — |
| q | 开始和结束引用动作。 |
| ^A r | 打开一个矩形区域。 |
| > | 文本右移。当区域为矩形时,等同于 ^A r 。 |
| < | 文本左移。当区域为矩形时,等同于 d 。 |
| y | 复制整个区域。Vile会记住该区域为矩形。 |
| c | 更改区域。对于非矩形区域,删除端点间的所有文本并进入插入模式;对于矩形区域,提示输入填充行的文本。 |
| ^A u | 将区域内字符全部转换为大写。 |
| ^A l | 将区域内字符全部转换为小写。 |
| ^A ~ | 切换区域内所有字母字符的大小写。 |
| ^A SPACE | 用空格填充区域。 |
| p , P | 放回文本。若原文本为矩形,Vile会进行矩形放回。 |
| ^A p , ^A P | 强制将之前复制的文本以矩形形式放回。使用最长复制行的宽度作为矩形的宽度。 |

Programming Assistance
Edit-Compile Speedup

Vile使用两个简单的vi模式命令来管理程序开发,具体如下表:
| 命令 | 功能 |
| — | — |
| ^X !command ENTER | 运行命令,并将输出保存到名为 [Output] 的缓冲区。 |
| ^X ^X | 查找下一个错误。Vile会解析输出并移动到每个连续错误的位置。 |

Vile能理解GNU make生成的“Entering directory XXX”和“Leaving directory XXX”消息,即使文件位于不同目录,也能找到正确的文件。错误消息通过 [Error Expressions] 缓冲区中的正则表达式进行解析,Vile会自动创建该缓冲区,并在使用 ^X ^X 时使用它。你可以根据需要添加表达式,其扩展语法允许指定文件名、行号、列号等在错误消息中的位置。Vile的错误查找器还能补偿文件中的更改,跟踪你处理每个错误时的添加和删除操作。错误查找器适用于通过读取shell命令创建的最新缓冲区,例如 ^X!command 会生成名为 [Output] 的缓冲区, :e !command 会生成名为 [!command] 的缓冲区,错误查找器会相应设置。你还可以使用 :error-buffer 命令将错误查找器指向任意缓冲区,从而对之前编译器或 egrep 运行的输出使用错误查找器。

Syntax Highlighting

Vile在所有配置中都支持语法高亮,它使用自定义语法过滤程序进行语法着色。这些过滤程序可以内置在Vile中,也可以作为外部程序运行。Vile将待着色的缓冲区内容发送给语法过滤器,读取标记后的版本,并将标记应用于缓冲区以进行着色。

内置过滤器比外部程序更快,并且在终端显示时能消除shell的干扰。对于某些平台,语法过滤器可以动态加载,这能使编辑器可执行文件更小,但速度不如内置过滤器。目前有71个程序,还有一个用于Unix手册页的单独程序。有些程序可用于多种类型的文件,例如C、C++和Java语法相似,但使用不同的关键字。

Vile提供了宏,可按需或在你修改缓冲区时自动运行语法过滤器,相关命令总结如下表:
| 命令 | 按键绑定 | 功能 |
| — | — | — |
| :HighlightFilter | | 对当前缓冲区调用语法高亮过滤器。Vile根据缓冲区的扩展属性(称为主模式)选择过滤器。如果过滤器是内置的,Vile初始化时会设置自动着色模式,在你停止修改缓冲区五秒后调用此宏。 |
| :HighlightFilterMsg | ^X-q | 使用 HighlightFilter 为当前缓冲区添加高亮,并在完成时显示消息。 |
| :HighlightClear | ^X-Q | 清除当前缓冲区的所有高亮,不改变缓冲区的主模式。 |
| :set-highlighting majormode | | 将缓冲区的主模式更改为 majormode 并运行语法高亮器。 |
| :show-filtermsgs | | 显示当前缓冲区的语法过滤错误消息。如果语法过滤器发现任何错误,会报告它们,Vile会在 [Filter Messages] 缓冲区中显示这些消息,并设置错误缓冲区,以便你逐步查看错误发生的位置。 |

每次运行语法过滤器时,它会读取一个或多个包含要高亮关键字的外部文件,以及它们对应的颜色和视频属性(粗体、下划线、斜体)。它使用缓冲区主模式的名称搜索这些以 .keywords 为后缀的文件,搜索规则在在线帮助中有文档说明。你可以使用 :which-keywords 宏查看Vile查找这些文件的位置以及找到的位置,例如“:which-keywords cmode”的示例输出如下:

Show which keyword-files are tested for:
        cmode                           
(* marks found-files)
$cwd                                    
  ./.c.keywords
$HOME
  ~/.c.keywords
  ~/.vile/c.keywords
$startup-path                           
* /usr/local/share/vile/c.keywords

Vile的语法过滤器使用一组通用的颜色类,包括 Action Comment Error Ident Ident2 Keyword Keyword2 Literal Number Preproc Type 。大多数关键字定义引用一个类,这样你只需更改一个文件(通常是 $HOME/.vile.keywords )就能修改所有颜色。在线帮助提供了自定义语法颜色的详细信息。

一方面,由于语法高亮是通过外部程序实现的,因此应该可以为不同语言编写任意数量的高亮器;另一方面,由于这些功能较为底层,对于非程序员来说并不容易实现。在线帮助描述了高亮过滤器的工作原理。 ftp://invisible-island.net/vile/utilities 目录中包含用户贡献的用于着色 makefile input perl HTML troff 的过滤器,甚至还有一个根据RCS文件中行的年龄对其进行着色的宏。

Interesting Features
The vile Editing Model

Vile的编辑模型与vi有所不同,它借鉴了Emacs的概念,提供了按键重绑定和更具交互性的命令行。在vi及其克隆版本中,编辑功能是“硬编码”在编辑器中的,命令字符与功能的关联是固定的,很难更改。而Vile定义了许多命名函数,每个函数执行一个单一的编辑任务,如 delete-next-character delete-previous-character ,并将这些函数绑定到按键上。

Vile在插入、命令和选择模式下有不同的按键绑定,这里主要介绍正常编辑模式下的绑定。更改绑定非常简单,使用 :bind-key 命令,指定函数名和要绑定的按键序列即可。例如,可以在 .vilerc 文件中添加以下命令:

bind-key incremental-search /
bind-key reverse-incremental-search ?

这些命令将 / ? 搜索命令更改为增量搜索。

除了预定义的函数,Vile还包含一种简单的编程语言,允许用户编写过程。用户可以将执行过程的命令绑定到按键序列上。与GNU Emacs使用的强大的Lisp语言不同,Vile的语言相对简单,通用性稍弱。

Vile的命令行也非常交互式,许多命令会显示操作数的默认值,用户可以根据需要编辑或直接按 ENTER 选择。在输入vi模式编辑命令时,状态行会显示操作的反馈信息。例如, :s (替换)命令会提示输入搜索模式、替换文本和任何标志,具体操作如下:
| 按键操作 | 结果 |
| — | — |
| :1,$s | 输入替换命令的第一部分。 |
| / | 提示输入搜索模式,之前的模式会显示供重用。 |
| perl/ | 提示输入替换文本,之前的文本会显示供重用。 |
| awk/ | 提示输入可选标志,如 (g) 全局替换、 ([1 - 9]) 行上的第n个匹配、 (c) 确认、 (p) 打印结果,输入后按 ENTER 。 |

不过,Vile的ex模式解析器比其他编辑器弱,例如不能使用搜索模式指定行范围(如 :/now/,/forever/s/perl/awk/g ),并且移动命令 m 未实现,但在实际使用中,这些未实现的功能似乎不会造成太大阻碍。

Major Modes

主要模式(Major Mode)是一组选项设置,适用于编辑特定类型的文件,这些选项按缓冲区应用,如制表符停止设置。Vile提供了三种类型的选项:
- 通用选项:应用于整个程序。
- 缓冲区选项:应用于内存缓冲区的内容。
- 窗口选项:应用于窗口(这里指“窗格”)。

缓冲区和窗口选项可以是全局值或局部值。任何缓冲区(或窗口)都可以有自己的私有(局部)选项值,如果没有,则使用全局值。主要模式在缓冲区全局和局部值之间增加了一个层次,提供了缓冲区在没有私有值时使用的选项值。

Vile有两个内置的主要模式:
- cmode :用于编辑C和C++程序。在 cmode 下,可以使用 % 匹配C预处理器条件语句( #if #else #endif ),Vile会根据花括号 { } 的位置自动进行源代码缩进,并智能格式化C注释。制表符停止和缩进宽度选项也会按主要模式设置。
- vile mode :用于加载到内存缓冲区的Vile脚本。

用户可以使用主要模式将相同的功能应用于其他语言的程序。例如,以下是定义一个新的主要模式 shmode 用于编辑Bourne shell脚本的示例:

define-mode sh
set shsuf "\.sh$"
set shpre "^#!\\s*\/.*sh\\>$"
define-submode sh comment-prefix "^\\s*/[:#]"
define-submode sh comments       "^\\s*/\\?[:#]\\s+/\\?\\s*$"
define-submode sh fence-if       "^\\s*\\<if\\>"
define-submode sh fence-elif     "^\\s*\\<elif\\>"
define-submode sh fence-else     "^\\s*\\<else\\>"
define-submode sh fence-fi       "^\\s*\\<fi\\>"

上述示例也可以使用更简洁的 ~with 语法:

define-mode sh
~with define-submode sh
        suf             "\.sh$"
        pre             "^#!\\s*\/.*sh\\>$"
        comment-prefix  "^\\s*/[:#]"
        comments        "^\\s*/\\?[:#]\\s+/\\?\\s*$"
        fence-if        "^\\s*\\<if\\>"
        fence-elif      "^\\s*\\<elif\\>"
        fence-else      "^\\s*\\<else\\>"
        fence-fi        "^\\s*\\<fi\\>"
~endwith

Vile通过初始化脚本提供了90个预定义的主要模式,使用 :show-majormodes 命令可以查看可用主要模式的定义。Vile在将文件读入缓冲区时,会根据以下标准决定应用哪种主要模式:
| 标准 | 描述 |
| — | — |
| after | 强制在给定主要模式之后检查定义的主要模式,通常主要模式按定义顺序检查。 |
| before | 强制在给定主要模式之前检查定义的主要模式,通常主要模式按定义顺序检查。 |
| mode-filename (mf) | 描述文件名的正则表达式,匹配的文件将设置为相应的主要模式,该表达式仅应用于去除目录名后的完整路径名部分。 |
| mode-pathname (mp) | 描述路径名的正则表达式,匹配的文件将设置为相应的主要模式。 |
| preamble (pre) | 描述文件第一行的正则表达式,匹配的文件将设置为相应的主要模式。 |
| qualifiers | 说明如何组合前导和后缀标准, all 表示同时使用两者, any 表示使用其中之一。 |
| suffixes (suf) | 描述文件名后缀的正则表达式,匹配的文件将设置为相应的主要模式,该表达式仅应用于文件名中从第一个点开始的部分。 |

下面是一个简单的mermaid流程图,展示Vile选择主要模式的流程:

graph TD;
    A[读取文件到缓冲区] --> B{检查标准};
    B --> C{是否匹配mode - filename};
    C -- 是 --> D[设置对应主要模式];
    C -- 否 --> E{是否匹配mode - pathname};
    E -- 是 --> D;
    E -- 否 --> F{是否匹配preamble};
    F -- 是 --> D;
    F -- 否 --> G{是否匹配suffixes};
    G -- 是 --> D;
    G -- 否 --> H[使用默认模式];

综上所述,Vile编辑器具有丰富的功能和灵活的模式设置,无论是在可视化模式下的文本操作,还是在编程辅助和主要模式方面,都为用户提供了强大的编辑体验。通过合理利用这些功能和模式,用户可以更高效地进行各种类型文件的编辑工作。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值