Vim编辑器入门教程:从历史到最新版Vim 9.1的安装与使用
Vim编辑器入门教程:从历史到最新版Vim 9.1的安装与使用
Vim是一款功能强大的文本编辑器,广泛应用于Linux和Unix系统中。本文将带你从零开始学习Vim的基础知识,包括其历史背景、模态编辑的特点,以及如何在WSL Ubuntu系统上安装最新版的Vim 9.1。此外,文章还将介绍一些实用的Vim使用技巧,帮助你快速上手这款强大的编辑器。
第一章 Vim 入门
1 Vim 简史
图 1.1 由 Teletype Corporation 出品的 ASR-33 电传打字机
20世纪中叶,电传打字机(teleprinter)的出现使得远程收发信息成为可能。由于当时只能逐行处理文本,因此出现了基于文本行的编辑工具ed(由Ken Thompson开发)和ex(由Bill Joy开发)。随着显示器的普及,文本编辑工具也得到了升级,功能更加强大。
1976年,Bill Joy推出了vi编辑器,实现了多行编辑功能。如今的vi其实是Vim简化版Vim-tiny的一个快捷方式(symlink)。
以下是Vim各版本的核心功能一览表:
主版本 | 年份 | 核心看点 |
---|---|---|
1.0 | 1991 | Bram Moolenaar为Amiga电脑发布Vi Imitation |
2.0 | 1993 | 更名为Vi Improved正式发布 |
3.0 | 1994 | 支持多窗口 |
4.0 | 1996 | 支持图形界面(GUI) |
5.0-5.8 | 1998 - 2001 | 新增语法高亮、脚本(scripting)和选择模式(select mode) |
6.0-6.4 | 2001 - 2005 | 添加插件支持和fold折叠 |
7.0-7.4 | 2006 - 2013 | 拼写检查、代码自动补全、tag标签、分支历史和undo的持久化 |
8.0-8.2 | 2016 - 2019 | 大量优化、异步I/O支持、内置终端和弹窗 |
9.0 | 2022 | 引入新脚本语言(Vim9script) |
想查看Vim 9.0的新功能,可以在命令模式下执行:
:help version9
2 模态 vs 非模态
主要区别在于对上下文语境的识别:
- 支持模态的编辑器:同样的操作随上下文的不同而不同(智能机);
- 不支持模态的编辑器:各操作一直是静态功能(直板机)。
图 1.2 模态界面之于非模态界面,就如同智能手机之于大多数传统手机的对比
3 Vim 9 的安装(WSL 版)
这一节详细介绍了在不同操作系统上安装Vim 9的方法。这里只展示在WSL Ubuntu v20.04环境下将Vim从v8.1升级到vim 9.1的具体步骤:
$ pwd
/root
# 安装 Unbuntu 构建依赖
$ sudo apt-get install make build-essential libncurses5-dev libncursesw5-dev --fix-missing
# 下载 ncurses 依赖:https://invisible-island.net/ncurses/#download_ncurses
$ cp /mnt/c/Users/ad/Desktop/ncurses.tar.gz .
$ tar -zxvf ncurses.tar.gz
$ cd ncurses-6.3
$ ./configure
$ make
$ sudo make install
# 从 GitHub 下载 Vim 的最新稳定版:https://github.com/vim/vim/tags(vim-9.1.1094.tar.gz)
$ cp /mnt/c/Users/ad/Desktop/vim-9.1.1094.tar.gz .
# 安装过程中一律点确认
$ tar -zxvf vim-9.1.1094.tar.gz
$ cd vim-9.1.1094
$ ./configure --prefix=/usr/local --with-features=huge --enable-python3interp
$ make
$ sudo make install
注意:
--prefix
用于指定安装路径;--with-feature
是限定安装范围(按最完整版本安装);--enable-python3interp
是添加对Python3的语言支持。
安装完毕后,最好重启WSL,并输入vim
+Enter进行确认。
4 创建示例文件
用Vim创建一个用于演示相关操作的Python文件spam.py
:
#!/usr/bin/python
import random
INGREDIENTS = ['egg', 'sausage', 'bacon', 'ham', 'crumpets', 'spam']
def prepare_menu_item(ingredient, with_spam=True):
if with_spam:
return 'spam ' + ingredient
return ingredient
def main():
print('Scene: A cafe. A man and his wife enter.')
print('Man: Well, what\'ve you got?')
menu = []
for ingredient in INGREDIENTS:
has_spam = random.choice([True, False])
menu.append(prepare_menu_item(ingredient, with_spam=has_spam))
print('Waitress: Well, there\'s', ', '.join(menu))
if __name__ == '__main__':
main()
然后运行该程序:
$ python3 spam.py
$ Scene: A cafe. A man and his wife enter.
Man: Well, what've you got?
Waitress: Well, there's spam egg, spam sausage, bacon, ham, spam crumpets, spam
$
5 关于 .swp 交换文件
当Vim会话非正常关闭或远程服务器突然中断时,未及时保存变更的文件会生成一个.swp交换(swap的简写)文件,通常格式为<filename>.swp
或.<filename>.swp
,并存放在目标文件的所在路径下。
想要自定义.swp文件存放的路径,可以通过directory
选项实现(注意末尾为两个斜杠符,否则不生效):
set directory=%USERDATA%\.vim\swap//
若要完全禁用交换文件的生成,则可以在.vimrc中设置:
set noswapfile
6 Vim 光标浏览技巧
主要记住这张示意图:
图 1.3 Vim 光标浏览核心按键示意图
和此前专栏最大的不同,是对e
命令和按段落浏览({和})的强调。e
即end of word
的缩写,可快速定位到光标所在单词(word)的最后一个字符,与b
命令相互呼应。
7 对 undo 与 redo 的持久化相关设置
Vim的undo历史列表并不是线性的。如果需要记得几天以前的历史操作,持久化设置就显得很有必要了:
set undofile
但是这样会在每个正在编辑的文件旁生成一个undo文件。此时可以用下列脚本将它们合并到一起:
" Set up persistent undo across all files.
set undofile
let my_undo_dir = expand('$HOME/.vim/undodir')
if !isdirectory(my_undo_dir))
call mkdir(my_undo_dir, "p")
endif
set undodir=my_undo_dir
8 关于 Vim 帮助文档
Vim还内置了一个交互式的入门文档vimtutor,直接在Vim外运行命令vimtutor
+Enter即可:
图 1.4 Vim 自带的交互式入门文档界面