LV02-vimscript-01-初见.md

本文主要是vimscript一些基础知识和操作的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
点击查看本文参考资料
点击查看相关文件下载
--- ---

一、 vimscript 简介

什么是 vimScript 呢?我其实也不清楚,这门语言似乎我这辈子都不一定用得到,但是又为什么想要了解它呢?因为在刚开始使用 vim 的时候,总是在抱怨,(此处省略一句国粹),怎么会有这种编辑器,太讨人厌了吧,即便到现在我也主要用其他的 IDE 来写代码,毕竟还是方便。后来在网上看到其他人的 vim 编辑器界面,还有各种神操作,我又忍不住一句国粹😂, vim 原来还能这么玩,出于好奇心,深入了解了下,于是乎就有了这篇学习笔记。

接下来回到正题, Shell 作为命令行工具,它会有自己的 Shell 脚本, vim 也类似, vim 的脚本语言被称为 vimscript ,是典型的动态命令式语言,提供了大多数常见的语言特性:变量、表达式、控制结构、内置函数、用户定义函数、一级字符串、高级数据结构(列表和字典)、终端和文件 I/O、正则表达式模式匹配、异常和集成调试器。

其实,我们之前就已经接触过 vimscript 了,就是我们经常用到的 ~/.vimrc 配置文件,这个文件中的内容就是 vimscript 编写的。

由于门编程语言似乎很少人用到,网上的教程似乎也不像 C/C++ 、 Python 那样丰富,教程嘛,我当时看了这两本书,一本英文,是原版,一本是中文的,在一个网站看到的,自然,对于我这种英语”好的一塌糊涂“的人来说,当然是推荐看中文了😂。

vim教程 https://www.w3cschool.cn/vim/
Learn vimscript the Hard Way https://learnvimscriptthehardway.stevelosh.com/
vim在线文档 http://vimcdoc.sourceforge.net/

二、 vimscript 预备知识

【说明】以下部分所有命令中,带 [ ] 的部分说明是可以省略的。

1. vim 输出

  • echo

在 vim 命令模式下输入以下命令:

1
:echo "Hello, world!"

应该会在 vim 的底部看到 Hello, world! 被打印出来。

  • echom

在 vim 命令模式下输入以下命令:

1
:echom "Hello, world! again!"

应该会在屏幕的底部看到 Hello, world! again! 被打印出来。

  • 有什么区别?

在 vim 命令模式下输入以下命令:

1
:messages

会发现 vim 底部只输出了 Hello, world! again! 。 :echo 命令会打印输出,但是一旦脚本运行完毕,那些输出信息就会消失。使用 :echom 打印的信息 会保存下来,可以执行 :messages 命令再次查看那些信息。

2. vim 注释

有时候为了看懂自己的代码,多少还是要写点注释的,不然上午写的代码,吃过饭忘记了怎么办,总不能推倒重构把😂。

1
" 这是 vimscript 中的一个注释

在 vimscript 中,可以通过 “ 添加注释,但是要注意的是这个注释方法有时候也会给我们带来麻烦(如键盘映射)。

3. 设置选项

vim 中有两种选项可以进行设置,有些会让我们的操作更加的便捷。它主要有两种选项:布尔选项(值为 on 或 off )和键值选项

3.1 布尔选项

3.1.1 设置布尔选项

这里以行号打开或者关闭为例,行号的设置选项为 number ,在命令模式下执行:

1
:set nu[mber]

这个时候我们就会发现, vim 最左侧出现了黄色的行号,当然之前没有开启的话会显示,之前就有的话就什么现象也没有了。

那怎么关闭行号呢?在命令模式中执行:

1
:set nonu[mber]

这个时候,会发现,行号消失了。

3.1.2 查看布尔选项

上边是有现象的命令,可以轻松观察并判断出选项的值,那没有现象的命令,我怎么知道它现在的状态呢?在命令模式执行以下命令:

1
:set nu[mber]?

在命令后边加上一个 ? 就可以打印出想知道的选项的值了。

3.1.3 切换布尔选项

布尔选项只有两种状态,打开或者关闭,这就意味着,我们可以有另一种方式来切换布尔选项,在命令模式下执行:

1
set nu[mber]!

执行一次,有行号的,行号会消失,没有行号的,行号会出现。

3.2 键值选项

3.2.1 设置键值选项

有些选项并不只有打开或者关闭两种状态,它们需要一个值。例如行号显示的宽度等,在命令模式中执行:

1
2
3
:set nu[mber]          " 打开行号显示         
:set numberwidth=20 " 设置 行号宽度为 20,注意等号前后不能有空格
:set numberwidth=1 " 设置行号宽度为 1,注意等号前后不能有空格

会发现行号数字距离左侧边框距离变远了,然后执行完第三条命令又变近了。

3.2.2 查看键值选项

那怎么查看键值选项的值呢?在命令模式中执行:

1
:set numberwidth?

这样, vim 就会在底部输出所查看键值选项的值了。

3.3 设置多个选项

vimscript 支持在一个命令中设置多个选项的值,在命令模式中执行:

1
:set number numberwidth=6

这将会打开行号显示,并将行号的宽度设置为 6 。

【注意】由于这个特性,这也就意味着,在命令模式下键入命令的时候如果一条命令中间有空格出现,那么皆就有可能需要用 \ 进行转义了。

4. 第一个脚本文件

vimscript 脚本文件以 .vim 作为后缀名称。

1
vim test.vim # 在当前路径下新建一个 vimscript脚本文件

在文件中输入以下内容:

1
echo "Hello, world!"

然后按:w,保存。

那么怎么执行脚本呢?我们可以直接在 vim 的命令模式中执行以下指令即可运行该脚本文件。

1
:source test.vim

然后按下 Enter 即可运行该脚本,随后我们应该会在 vim 底行中看到 Hello, world! 被输出。

【注意】要注意文件路径,不在当前目录时,一定要加上路径指明文件位置。另外,脚本文件中不需要像命令模式一样加上 : 。

5. 折行书写

当我们在写脚本文件的时候,如果有一写语句超级长的话,怎么办?从头写到尾嘛,那样也太难以阅读了吧,像 C语言 , Python 啊这些,可以直接换行继续写, vimscript 可不一样,这样直接换行写可能会报错,可能会不执行,这个时候我们应该在折行的开头写上 \ 符号,这就表示这一行与上一行是同一条命令。例如:

1
2
3
4
5
let mydict1 = {'a': 'one', 'b': 2}
let mydict2 = mydict1
let mydict2.a = 1
echo "mydict1="mydict1
\ "\nmydict2="mydict2

这个例子在输出的时候就进行了换行书写,这样也便于区分各部分功能(具体脚本内容后边自然会了解到)。