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
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
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编辑器具有丰富的功能和灵活的模式设置,无论是在可视化模式下的文本操作,还是在编程辅助和主要模式方面,都为用户提供了强大的编辑体验。通过合理利用这些功能和模式,用户可以更高效地进行各种类型文件的编辑工作。
Vile编辑器核心功能解析
超级会员免费看
8

被折叠的 条评论
为什么被折叠?



