开源文本编辑器-vim
2013-04-25 16:18:58 阿炯

Vim是从Vi发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的编辑器。第一个版本由布莱姆·米勒在1991年发布。最初的简称是Vi IMitation,随着功能的不断增加,正式名称改成了Vi IMproved。现在是在开放源代码方式下发行的自由软件,其使用了一个有个性的授权协议


Vim is a highly configurable text editor built to enable efficient text editing. It is an improved version of the vi editor distributed with most UNIX systems. Vim is distributed free as charityware.

功能
根据设定可以和原始vi完全兼容
多缓冲编辑
任意个数的分割窗口(横,竖)
具备列表和字典功能的脚本语言
可以在脚本中调用Lua,Perl,Ruby,Python,Tcl,MzScheme
单词缩写功能
动态单词补全
多次撤销和重做
对应400种以上文本文件的语法高亮
C/C++,Perl,Java,Ruby,Python等40种以上语言的自动缩排
利用ctags的标签中跳转
崩溃后文件恢复
光标位置和打开的缓冲状态的保存 复原(session功能)
可以对两个文件进行差分,同步功能的diff模式
远程文件编辑
Omni补全(上下文相关的补全)


简单的来说,vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方,vim 则可以说是程序开发者的一项很好用的工具。目前vim已经迁往Github上,另提供了在windows下的gvim版本。

vi和vim的小差别

Linux 系统会内置 vi 文本编辑器。Vim 具有程序编辑的能力,可以看做是 vi 的增强版本,主动的以字体颜色辨别语法的正确性,方便程序设计;代码补全,编译及错误跳转等方便编程的功能丰富,在程序员中被广泛的使用。由于个别版本的linux默认只安装vi,所以需要额外安装vim的软件包,另外vim在字符界面下不能输入中文,而在图形界面下能否输入中文则取决于系统中是否安装了中文输入法。



Vim 是从 vi 发展出来的一个文本编辑器。具有代码补全、编译及错误跳转等方便编程的功能,在程序员中被广泛使用。简言之,vi 是老式的功能齐全字处理器,vim 的官方网站自己也说 vim 是一个程序开发工具而不是文字处理软件。

vim 键盘图


基本上 vi/vim 共分为三种模式,命令模式(Command Mode)、输入模式(Insert Mode)和命令行模式(Command-Line Mode)。

命令模式

用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符,比如我们此时按下 i,并不会输入一个字符,i 被当作了一个命令。

以下是普通模式常用的几个命令:
i -- 切换到输入模式,在光标当前位置开始输入文本。
x -- 删除当前光标所在处的字符。
: -- 切换到底线命令模式,以在最底一行输入命令。
a -- 进入插入模式,在光标下一个位置开始输入文本。
o:在当前行的下方插入一个新行,并进入插入模式。
O -- 在当前行的上方插入一个新行,并进入插入模式。
dd -- 删除当前行。
yy -- 复制当前行。
p(小写) -- 粘贴剪贴板内容到光标下方。
P(大写)-- 粘贴剪贴板内容到光标上方。
u -- 撤销上一次操作。
Ctrl + r -- 重做上一次撤销的操作。
:w -- 保存文件。
:q -- 退出 Vim 编辑器。
:q! -- 强制退出Vim 编辑器,不保存修改。

若想要编辑文本,只需要启动 Vim,进入了命令模式按下 i 切换到输入模式即可。

命令模式只有一些最基本的命令,因此仍要依靠底线命令行模式输入更多命令。

输入模式

在命令模式下按下 i 就进入了输入模式,使用 Esc 键可以返回到普通模式。

在输入模式中,可以使用以下按键:
字符按键以及Shift组合,输入字符
ENTER,回车键,换行
BACK SPACE,退格键,删除光标前一个字符
DEL,删除键,删除光标后一个字符
方向键,在文本中移动光标
HOME/END,移动光标到行首/行尾
Page Up/Page Down,上/下翻页
Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
ESC,退出输入模式,切换到命令模式

底线命令模式

在命令模式下按下 :(英文冒号)就进入了底线命令模式。

底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。

在底线命令模式中,基本的命令有(已经省略了冒号):
:w:保存文件。
:q:退出 Vim 编辑器。
:wq:保存文件并退出 Vim 编辑器。
:q!:强制退出Vim编辑器,不保存修改。

按 ESC 键可随时退出底线命令模式。可以将这三个模式想成底下的图标来表示:


按键说明

除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。

第一部分:一般模式可用的光标移动、复制粘贴、搜索替换等

移动光标的方法
h 或 向左箭头键(←)光标向左移动一个字符
j 或 向下箭头键(↓)光标向下移动一个字符
k 或 向上箭头键(↑)光标向上移动一个字符
l 或 向右箭头键(→)光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键,亦即加上想要进行的次数(数字)后,按下动作即可!
[Ctrl] + [f]屏幕『向下』移动一页,相当于 [Page Down]按键(常用)
[Ctrl] + [b]屏幕『向上』移动一页,相当于 [Page Up] 按键(常用)
[Ctrl] + [d]屏幕『向下』移动半页
[Ctrl] + [u]屏幕『向上』移动半页
+光标移动到非空格符的下一行
-光标移动到非空格符的上一行
n<space>那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n个字符。例如 20<space> 则光标会向后面移动 20 个字符距离。
0 或功能键[Home]这是数字『 0 』:移动到这一行的最前面字符处(常用)
$ 或功能键[End]移动到这一行的最后面字符处(常用)
H光标移动到这个屏幕的最上方那一行的第一个字符
M光标移动到这个屏幕的中央那一行的第一个字符
L光标移动到这个屏幕的最下方那一行的第一个字符
G移动到这个档案的最后一行(常用)
nGn 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg移动到这个档案的第一行,相当于 1G 啊!(常用)
n<Enter>n 为数字。光标向下移动 n 行(常用)
搜索替换
/word向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可!(常用)
?word向光标之上寻找一个字符串名称为 word 的字符串。
n这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说,如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
N这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词!
:n1,n2s/word1/word2/gn1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:
『:100,200s/vbird/VBIRD/g』。(常用)
:1,$s/word1/word2/g:%s/word1/word2/g从第一行到最后一行寻找 word1 字符串,并将该字符串取代为word2 !(常用)
:1,$s/word1/word2/gc:%s/word1/word2/gc从第一行到最后一行寻找 word1 字符串,并将该字符串取代为word2 !且在取代前显示提示字符给用户确认 (confirm)是否需要取代!(常用)
删除、复制与贴上
x, X在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键)(常用)
nxn 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符,『10x』。
dd剪切游标所在的那一整行(常用),用 p/P 可以粘贴。
nddn 为数字。剪切光标所在的向下 n 行,例如 20dd 则是剪切 20 行(常用),用 p/P 可以粘贴。
d1G删除光标所在到第一行的所有数据
dG删除光标所在到最后一行的所有数据
d$删除游标所在处,到该行的最后一个字符
d0那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy复制游标所在的那一行(常用)
nyyn 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20行(常用)
y1G复制游标所在行到第一行的所有数据
yG复制游标所在行到最后一行的所有数据
y0复制光标所在的那个字符到该行行首的所有数据
y$复制光标所在的那个字符到该行行尾的所有数据
p, Pp 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行!举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后,那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢?那么原本的第 20 行会被推到变成 30 行。(常用)
J将光标所在行与下一行的数据结合成同一行
c重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u复原前一个动作。(常用)
[Ctrl]+r重做上一个动作。(常用)
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
.不要怀疑!这就是小数点!意思是重复前一个动作的意思。如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了!(常用)

第二部分:一般模式切换到编辑模式的可用的按钮说明

进入输入或取代的编辑模式
i, I进入输入模式(Insert mode):
i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。(常用)
a, A进入输入模式(Insert mode):
a 为『从目前光标所在的下一个字符处开始输入』, A为『从光标所在行的最后一个字符处开始输入』。(常用)
o, O进入输入模式(Insert mode):
这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行;O 为在目前光标所在的上一行处输入新的一行!(常用)
r, R进入取代模式(Replace mode):
r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下ESC 为止;(常用)
上面这些按键中,在 vi 画面的左下角处会出现『--INSERT--』或『--REPLACE--』的字样。由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时,一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔!
[Esc]退出编辑模式,回到一般模式中(常用)

第三部分:一般模式切换到指令行模式的可用的按钮说明

指令行的储存、离开等指令
:w将编辑的数据写入硬盘档案中(常用)
:w!若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入,还是跟你对该档案的档案权限有关啊!
:q离开 vi (常用)
:q!若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
:wq储存后离开,若为 :wq! 则为强制储存后离开(常用)
ZZ这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出)
ZQ不保存,强制退出。效果等同于 :q!
:w [filename]将编辑的数据储存成另一个档案(类似另存新档)
:r [filename]在编辑的数据中,读入另一个档案的数据。亦即将 『filename』这个档案内容加到游标所在行后面
:n1,n2 w [filename]将 n1 到 n2 的内容储存成 filename 这个档案。
:! command暂时离开 vi 到指令行模式下执行 command 的显示结果!例如
『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!
vim 环境的变更
:set nu显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu与 set nu 相反,为取消行号!



2021年11月9日,开源文本编辑器 Vim 作者 Bram Moolenaar 发布了庆祝 Vim 30周年的生日邮件,Vim 已诞生 30 周年。它的第一个版本由 Bram Moolenaar 在 1991 年发布,最初的简称是 Vi IMitation,因为当时 Bram 的目标只是完全复制 Vi 的功能,所以名字也是 Vi IMitation(模拟)的简称。1992 年,1.22 版本的 Vim 被移植到了 UNIX 和 MS-DOS 上。从那个时候开始,随着功能的不断增加,Vim 的全名就变成 Vi IMproved(改进)。时至今日,Vim 是最受欢迎的文本编辑器之一,尤其是在程序员中被广泛使用,它也经常会被拿来跟 Emacs 作比较。

Vim 最新的稳定版本是大约两年前发布的 Vim 8.2,第 9 版正处于开发阶段,在发布前还有许多工作需要完成。Bram 表示此版本将更容易使用,例如使用与流行的编程语言相类似的关键词和语法,提供类型检查功能。并且还会提升运行脚本的速度,将执行速度提升 10-100 倍。在这过程中会产生一些不向后兼容的变更。例如,不使用字典和列表来表示函数的参数的字典和列表,因为这对每个函数的调用都会造成太大的开销。当然,如果不习惯新版本,可以继续使用旧版本,旧版本会保持兼容性。此外 Vim 9 还需要保证可靠性,目前它的代码覆盖率是 88.75%,未来还会一直增加。

Vim 之父 Bram Moolenaar 因病逝世

Vim 文本编辑器作者 Bram Moolenaar 的家人于2023年8月5日在 Google Groups 论坛中公布了其(1961年 - 2023年8月3日)去世的消息,享年 62 岁:我们怀着沉重的心情通知您,Bram Moolenaar 于 2023 年 8 月 3 日去世。Bram 的病情在过去几周内迅速恶化。Bram 将他生命中的大部分时间都奉献给了 VIM,他为 VIM 这个大家庭感到非常自豪。作为家人,我们正在安排 Bram 的葬礼,葬礼将在荷兰举行,用荷兰语进行。具体日期、时间和地点尚未确定。 如果您希望参加他的葬礼,请发邮件至 funer...@gmail.com。考虑到我们现在的家庭状况,这个电子邮件地址也可以用来就其他事宜与家人取得联系。


Vim 是一个功能强大、多功能且免费的开源文本编辑器。项目最初的简称是 Vi IMitation,因为当时 Bram 的目标只是完全复制 Vi 的功能,所以名字也是 Vi IMitation(模拟)的简称。他在 1991 年发布了第一个版本;1992 年,1.22 版本的 Vim 被移植到了 UNIX 和 MS-DOS 上。从那个时候开始,随着功能的不断增加,Vim 的全名就变成 Vi IMproved(改进)。它是目前最受欢迎的文本编辑器之一,尤其是在程序员中被广泛使用,和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。Bram 一生的大部分时间都在致力于 Vim,创建、维护并不断改进该软件;他为开源软件运动做出了不可磨灭的重大贡献。除了开发 Vim 之外,Bram 还是 ICCF Holland(一个支持乌干达艾滋病患者的非政府组织)的倡导者。他使用 Vim 作为推动慈善捐赠的平台。每次用户下载 Vim 时,系统都会提示他们考虑向 ICCF Holland 捐款。

R.I.P


最新版本:8.0
经过了3个月的稳定,共计修复了323项缺陷,到如今的 7.4.2012 中,所有功能基本都已经准备就绪,Vim 8.0 正在做最后的收尾工作,接下来将以一个新tag的形式发布出来。Vim 的作者 Bram Moolenaar 说道:“在过去的几个月中 Vim 8.0 的所有新功能都已经被实现并稳定,包括异步通信,任务系统,时钟系统等。大量报上来的BUG也被逐一解决。这说明相关功能已经达到了可以面向终端用户的质量标准。目前还有一些小的 patch 需要 merge。”

具备了异步机制以后的 Vim 可以方便的实现诸多特性,比如内嵌终端,异步编译,Grep,Lint,代码实时诊断。调用一个外部工具再也不需要停下整个 Vim 等待其完成了。而要体验 Vim 8.0 的异步功能可以下载最新的 Vim 7.4.2012 即可(如果你不了解 VimScript,可以使用插件 vimmake 来为你的 Vim 添加各种异步任务)。Windows 版本的用户可以用最新的 GVim Nightly Build。其他还会有一些默认配置的改变,比如所有人都会设置的"set nocompatible" ,今天应该已经很少人用 vi的兼容模式了,Bram打算在 Vim 8 中直接变为默认值,类似的还有:"set backspace=indent,eol,start" 之类的常用设置都将在 Vim 8 中变为默认值,用不着在每个 vimrc中都重新写一遍。

最新版本:8.2
距推出 Vim 8.1 已过去一年多,Vim 8.2 也终于在近日发布了。除了修复错误、更新文档和改进测试覆盖率等常规更新外,此版本还带来了一些有趣的新功能。开发团队的成员表示,在去年的 VimConf 2018 做主题演讲之前,他向 Vim 插件开发者询问了他们对 Vim 的功能需求。其中““弹出窗口(Popup Windows)”和“文本属性(Text Properties)”这两项呼声最大。经过一年多的开发,这两个新功能已顺利实现。

先简单介绍一下“弹出窗口”,这是 Vim 8.2 新引入的概念,此功能的正式名称为"Popup Windows",用于在正在编辑的窗口的最前方显示文本(消息框、函数原型、代码片段以及其他信息),而且显示的位置也非常灵活:它们可以相对于文本定位在绝对位置或仅在屏幕中间。窗口的大小可以修改,并调整以适应文本。设置"zindex"值就能指定 popup window 在其他窗口前面。另一项同样重要的新功能是“文本属性(Text Properties)”,用于处理语法高亮显示等特性,而不是使用基于模式的高亮显示。

其他值得关注的新功能:
"const"命令,用于声明一个不能改变的变量:
const TIMER_DELAY = 400

用于方法调用的函数链
mylist->filter(filterexpr)->map(mapexpr)->sort()->join()

通过指派 Heredoc 样式,可以轻松地将行列表指派给变量,而无需引用或 line continuation:
let lines =<< trim END
    line one
    line two
END

为 Windows 10 添加了 ConPTY 支持,可以在控制台中显示全彩色,更多详细更新内容请查看这里

最新版本:9.0
将 Vim 9.0 版本献给 Sven Guckes,他于 2022 年 2 月去世。Sven 是 Vim 的核心维护者,他注册了 vim.org 域名并创建了第一个 Vim 网站,我们将以此纪念他。经过多年的逐步改进,Vim 现于2022年6月下旬推出了一个重要版本,向前迈出了一大步。除了许多小的补充改进之外,该版本的重点是 Vim 脚本语言的一个新的变化:Vim9 Script。上一个版本是 2019 年 12 月发布的 8.2 版。由于最新的源代码总是会在 GitHub 上提供,因此许多用户已经安装了后来的补丁版本(有超过 5000 个),这些变化也已经被许多用户试用过了。在 8.2 的基础上,许多错误得到了修复、安全问题得到了解决,代码覆盖率得到了极大的提升。这个版本比以前的任何版本都更可靠。

Vim9 Script:Vim 的脚本随着时间的推移而不断发展,同时保留了向后的兼容性。这意味着过去的错误选择往往无法改变,与 Vi 的兼容性也限制了可能的解决方案。因此执行速度相当慢,每次执行时都要对每一行进行解析。主要目标是极大地提高性能。这是通过将命令编译成可以有效执行的指令来实现的,执行速度有望提高 10 到 100 倍。次要目标是避免 Vim 特有的结构,使其更接近于常用的编程语言,如 JavaScript、TypeScript 和 Java。

性能的提高只能通过不 100% 向后兼容来实现。例如通过创建一个 "a:" 字典使函数参数可用涉及到相当多的开销,在 Vim9 函数中,这个字典不再可用。对于那些有大量传统脚本的开发者来说也不用过于担心,这些脚本依然可以像以前一样使用。目前没有计划放弃对传统脚本的支持,变化不会像 Python 2 到 Python 3 那样剧烈。

有趣的功能:为了从加速中获益,一个函数必须用 def 来定义,必须指定参数和返回类型。这不仅是为了使执行速度更快,也有助于在函数被编译成字节码时及早发现错误。变量需要用 var 来声明的,并且也有一个类型,可以是明确的,也可以是从分配的值中推断出来的。

行的延续不需要使用反斜杠,这是在传统脚本中使用的机制。函数调用不需要 call,赋值不需要 let,表达式的求值不需要 eval。这使得 Vim9 Script 看起来更像大多数编程语言。将一个大的脚本分割成小块如今也变得简单多了。在一个脚本中, export 被用来使特定的函数和变量对其他脚本可用,然后在需要使用导出的项目的地方使用 import。结合自动加载机制,这为实现大型插件带来了一种灵活而强大的方式。

现在注释以 # 开头。以前的双引号语法来自古老的 Vi,会干扰字符串的使用。在许多其他语言中,例如 Python 和 shell 脚本,都知道 # 的含义。

未来的工作:在 Vim9 Script 的计划之一是添加类,虽然可以用字典来模拟,但这还远远不够理想。大多数程序员都熟悉类,在 Vim9 Script 中也应该加入这样的东西,目前关键字已经被保留。

更多详情可查看发行说明

2022年9月下旬消息,vim在 9.0.0598 之前版本中的 win_new_width 函数中未对窗口长度变量 width 的值进行限制,当窗口长度为负值时会造成缓冲区溢出漏洞,攻击者可利用此漏洞造成拒绝服务或执行恶意代码(CVE-2022-3324)。升级到 9.0.0598 或更高版本即可解决此问题。

Vim 9.1 现已于2024年1月上旬正式发布,这是一个错误修复版本,包含了数百个错误修复、一些新功能和许多小的改进。新版本最显著的变化是支持 Vim9 classes 和 objects、支持平滑滚动和虚拟文本。此版本谨献给 Vims 30 多年的首席开发者 Bram Moolenaar,他于 2023 年 8 月突然离世。没有他的工作,Vim 项目就不会存在。相关的更新内容如下:
包含对 Vim9 脚本语言的 Vim9 classes 和 objects 支持,参见 :h vim9-class
新增 :defer 命令,帮助清理函数,参见 :h :defer
支持在缓冲区中添加虚拟文本。这对语言服务器功能(如镶嵌提示)非常有用,参见 :h virtual-text
支持平滑滚动。参见 :h 'smoothscroll'
Vim 附带了 EditorConfig 插件。参见 :h editorconfig-install
Vim 已针对 OpenVMS 进行了更新。
xxd 已更新为支持彩色输出,并允许反向位转储。
自 Vim 9.0 发布以来,许多错误已得到修复,包括针对不安全内存访问、内存泄漏、缓冲区溢出和潜在崩溃的各种修复。
有关其他改进,可参阅帮助文件 :h new-other-9.1
对现有行为的更改记录在 :h changed-9.1
添加了一些新功能、自动命令、ex 命令和选项 :h added-9.1
完整的补丁列表见 :h patches-9.1
Vim FTP Server 已退役。它不再用于向用户分发工件。如果你过去使用过它,官方建议更新为使用 git 存储库。
详情可查看官方公告


官方主页:http://www.vim.org/