【Mastering Vim 2_02】第一章:Vim 基础入门 + 最新版 Vim 9.1 在 WSL Ubuntu 系统的安装实战

发布于:2025-02-11 ⋅ 阅读:(143) ⋅ 点赞:(0)

最新版《Mastering Vim》封面,涵盖 Vim 9.0 版特性

【最新版《Mastering Vim》封面,涵盖 Vim 9.0 版特性】

写在前面
有了《Vim Masterclass》专栏打下的坚实基础,这一章看似散乱的 Vim 开胃菜功能也能轻松驾驭——这就是构建了知识体系的好处,大脑会自动帮你将它们收纳进各自的储物柜中,很快就能找到和之前不一样的地方。希望您也有这样的自学体验。

第一章 Vim 入门

本章概要

  • 主要 Vim 版本间的区别
  • 模态与无模态界面,以及 Vim 的不同之处
  • Vim 的安装与升级
  • gVimVim 的图形界面
  • 配置 VimPython 语言支持和编辑配置文件
  • 常见的文件操作:打开、修改、保存和关闭文件
  • 光标的移动:用箭头键、方向键,按单词、段落等进行导航
  • 对文件进行简单编辑,并将编辑命令与移动命令相结合
  • 持久化撤消(undo)历史
  • 查看 Vim 内置帮助手册

本章源码:https://github.com/PacktPublishing/Mastering-Vim-Second-Edition/tree/main/Chapter01

由于本章绝大部分知识都在《Vim Masterclass》专栏详细介绍过了,这里只梳理与该专栏强调的核心知识不太一样的地方。


1 Vim 简史

图 1.1 由 Teletype Corporation 出品的 ASR-33 电传打字机

【图 1.1 由 Teletype Corporation 出品的 ASR-33 电传打字机】

20 世纪中叶的出现电传打字机(teleprinter)实现了远程收发信息打字。

由于当时只能逐行处理文本,于是出现了基于文本行的编辑工具 edKen Thompson 开发)以及 exBill Joy 开发)。

后来有了带显示器的版本,文本编辑工具也随之升级出更强大的功能。

1976 年,Bill Joy 推出了 vi 编辑器,并实现了多行编辑(此 vi 非彼 vi:如今的 vi 其实是 Vim 简化版 Vim-tiny 的一个快捷方式(symlink))。

Vim 各版本核心功能一览表:

主版本 年份 核心看点
1.0 1991 Bram MoolenaarAmiga 电脑发布 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 + Enter

2 模态 vs 非模态

主要区别:对上下文语境的识别——

  • 支持模态的编辑器:同样的操作随上下文的不同而不同(智能机);
  • 不支持模态的编辑器:各操作一直是静态功能(直板机)。

图 1.2 模态界面之于非模态界面,就如同智能手机之于大多数传统手机的对比

【图 1.2 模态界面之于非模态界面,就如同智能手机之于大多数传统手机的对比】

3 Vim 9 的安装(WSL 版)

这一节讲得很细,各操作系统的 Vim9 安装方案都演示了一遍。我只根据本机情况做了实测,实现了在 WSL Unbuntu v20.04 环境下将原来的 v8.1Vim 通过源码编译的方式升级到了最新的 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 进行确认:

img1.3

按照书中给出的一个 vimrc 配置更新 .vimrc 文件:

syntax on " Enable syntax highlighting.
filetype plugin indent on " Enable file type based options.
set nocompatible " Don't run in backwards compatible mode.
set autoindent " Respect indentation when starting new line.
set expandtab " Expand tabs to spaces. Essential in Python.
set tabstop=4 " Number of spaces tab is counted for.
set shiftwidth=4 " Number of spaces to use for autoindent.
set backspace=2 " Fix backspace behavior on most terminals.
colorscheme murphy " Change a colorscheme.

" DIY: show line numbers
set number

于是得到如下效果(启用 murphy 配色方案):

img1.4

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 光标浏览核心按键示意图

【图 1.3 Vim 光标浏览核心按键示意图】

和此前专栏最大的不同,是对 e 命令和按段落浏览({})的强调。eend of word 的缩写,可快速定位到光标所在单词(word)的最后一个字符,与 b 命令相互呼应。

7 对 undo 与 redo 的持久化相关设置

Vimundo 历史列表并不是线性的。如果需要记得几天以前的历史操作,持久化设置就显得很有必要了:

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 自带的交互式入门文档界面

【图 1.4 Vim 自带的交互式入门文档界面】


网站公告

今日签到

点亮在社区的每一天
去签到