vim_tutorial
Carpe Tu Black Whistle

写在前面

今天是 2022-09-09,开始学习vim,感觉vim很神奇也很硬核,慢慢学习掌握吧


现在是 2023-3-17,有了半年的使用和学习经验,重新编辑vim-tutorial

  • 优化内容排版结构
  • 给出更明确的学习路线
  • 这篇文章,看起来内容很多,其实,很多东西可以不用看,没必要(来自半年后的自我否定

学习路线

经过半年多的使用之后,对于vim的学习建议如下:

  1. 先能够习惯/熟练掌握vim的操作方式后再进入配置环境环节。
  2. 在熟练操作方式前,使用ide的vim插件。如vscode的vim插件。
  3. 利用vimtutor学习指令。比直接背网上的指令集(包括我的)有效得多。
  4. 学习MIT的公开课学习vim多模态设计,接触宏(其实我也不用宏和正则表达式)
  5. 大量的练习形成肌肉记忆
  6. 开始接触命令行环境,neovim,以及插件市场。(强烈推荐lazy插件管理器

vim/vimium 学习资料

  • vimtutor,强力推荐,在terminal中输入vimtutor,就会进入vim的官方教程,附带 手把手 带着做的练习题(前提是安装了vim)
  • vimium的知乎文章
  • 安装完vimium后,插件有效页面输入?,会弹出所有指令清单(感觉比我记的大段文本好很多)
  • MIT 公开课the missing semester专门有一章节讲vim,非常推荐

以下资料只能当作补充吧,但感觉有点多余

  • ThePrimeagen 的油管视频,也有阿b搬运 感觉?也就一般
  • vim-adventure: 前3章是免费的,hjkl web为止,但是后面10个地牢需要25美刀的订阅(完全不推荐)

vim及vim-like插件

简单介绍Vim和Vimium

vim

平时都是用 macbook 写的博客,macos 环境会自带 vim,linux 也一样。

vimium

vimium 是 chrome 的一个插件,使用类vim 的指令来控制 chrome 页面,进行一个浪的冲。

vim

这里正式开始vim的tutorial,其他的类似vim操作指令的插件、快捷键配置其实都大差不差,可以举一反三。

有时候觉得,自己的tutorial远不如 MIT的公开课 以及 vimtutor要好。

更多时候,是作为自己查找指令的字典使用。

Lesson 1

这一节主要设计vim的基本移动操作,以及个别模式切换。

vim 的多模态

vim 是一个 多模态(multi-modal) 编辑器

  • normal mode: 正常情况下的模式
  • insert mode: 输入i normal mode->insert mode, esc 退出
  • visual mode: v/V < ctrl-v > 进入可视化模式,分别进入 一般,行可视化,块可视化(其实就是选取文本
  • command-line mode: 输入“:“ 之后接命令

normal 下的基础指令

hjkl

normal模式下主要处于光标移动操作:

1
2
3
4
5
6
h: 光标左移一格
j: 光标下移一行
k: 光标上移一行
l: 光标右移一格

支持在hjkl输入数字来重复输入指令 4h: 左移4个字符

** Typing a number before a motion repeats it that many times. **

复制/粘贴/撤回

分别对应 ctrl+c, ctrl+v, ctrl+z 但是略有不同

1
2
3
4
5
6
7
y: yank 将可视化模式选中的文本,导入寄存器
p: paste 将粘贴存储在寄存器中的文本
u: undo 撤销前一命令的效果
U: UNDO to fix a whole line.
Crtl-R: undo the undos

特别注意: d相关的删除操作,会把删除的文本存入寄存器

WEB 单词级跳跃

w/e/b和W/E/B 能够实现在normal mode 下 wordWORD 级别的跳跃

1
2
3
w: 跳至下一个word的词头
e: 跳至下一个word的词尾
b: 跳至前一个word的词头

word or WORD

word: 在英语文本下,空格隔开的单词。中文环境下是,由字母符号隔开的短句。
WORD: 在英语文本下,单词和符号连起来的由空格隔开的文本段。中文一样。

一些其他关键字

i: (insert)进入insert mode,它有俩常用相关关键字
o: 在所在行下插入空白行,并且进入insert mode.
O: shift+o 可以在所在行上行插入空白行,并且进入insert mode.
A: 跳转至所在行最后,并且进入insert mode.

Lesson 2

normal mode 进阶指令

这个节主要是,进入insert mode 的几种

a/A i/I 0

A:shift+a 跳至行末并且进入 insert mode
a:在光标后,进入 insert mode
I:shift+i 跳至行首并且进入 insert mode
i: 在光标前,进入 insert mode
0: 跳转到本行开头.

d motion

dw: delete the word.
dd: delete the line.
d$: delete the sentence until the end of the line.
d [motion]:

1
2
3
4
5
6
7
8
where:
d - is the delete operation
motion- is what the operation will operate on (list below)

A short list of motions:
w - until the start of the next word, EXCLUDING its first character.
e - to the end of the current word, INCLUDING the last character.
$ - to the end of the line, INCLUDING the last character.

** Typing a number with an operator repeats it that many times. **

In the combination of the delete operator and a motion mentioned above you insert a count before the motion to delete more:

d    number motion
  • 额外补充,D: shift+d 删除本行 cursor 到最后的全部内容

c command

** To change until the end of a word, type ce . **

Notice that
ce deletes the word and places you in Insert mode.
cc does the same for the whole line.

ce 删除并在 插入模式 中替代该词汇
cc 在同一行中做一样的事情

change command 和 delete command 的唯一不同在于,change command会在删除操作后直接进入 insert mode。

  • 而外补充,C: shift+c 删除本行 cursor 到最后的全部内容,并且进入insert mode。

r command

THE REPLACE COMMAND
** Type rx to replace the caracter at the cursor with x. **

在光标所在位置输入用字符 x 替代原字符。

s command

同样的有 s command 删除一个字符(同 x)然后进入 insert mode
S: shift+s 删除整行,然后进入 insert mode。

p command

** Type p to put previously deleted text after the cursor. **

the words or line deleted by d motion will be stored in a Vim register. And then, p command can paste the content below the current line or behind the cursor.

P: shift+p paste the content in the line ABOVE cursor.

Lesson 3

这一节主要涉及一些vim的行间操作,如何在行间进行快速准确的光标跳转。毕竟wwwww,eeeeee挺蠢的。

vim的行间跳转

f/t

f: find, fx 在本行中(cursor后),找到第一个字符是 “x”的位置,并且实现光标跳转。
F: FIND, Fx 在本行中(cursor前),找到第一个字符是 “x”的位置,并且实现光标跳转。
t: to, tx 在本行中(cursor后),找到第一个字符是 ”x“的位置,并跳转到前一个位置。
T: TO, Tx 在本行中(cursor前),找到第一个字符是 “x“的位置,并跳转到后一个位置。

前后查找到的字符切换:
;跳转到后一个查找到的字符。
,跳转到前一个查找到的字符。

Notice:
因为 f/t 扩展了motion的灵活性,所以 d/c command 可以结合 f/t 来实现精准操作。

e.g. command: dt) 能够删除 cursor到)前的所有内容。

/ 查找

等同于各种ide常用的 CTRL+f content <enter>

在normal mode下, 输入command: /content <enter>

这里的检索查找设计与 vimium 是一样的

  1. n 查找下一个关键词
  2. N 查找上一个关键词

Ctrl+D/U 翻页

这个设计跟 vimium 大差不差,只是会加上 CTRL。
CTRL+D: DOWN half page.
CTRL+U: Up half page.

zb: 当前cursor所在处,移动到页面末行。
zt: 当前cursor所在处,移动到页面顶行。
zz: 当前cursor所在处,移动到页面中央。

lesson 4

这节主要是阅读情景下的文页跳转

vim 文本级跳转

G 与 gg

G: 跳转到文本的最后一行行首。
gg: 跳转到文本的第一行行首。
ctrl+g: 会打印光标所在行信息。

光标循迹

: 跳转到之前光标所在的位置。(在文本编辑时,非常有用。

指定行跳转

如果跳转到,xxx行的两种方法:

  • xxxG
  • :xxx
    ** 两种方法的输入一样多,神不神奇 **

当页首尾跳转

H: 跳转到当前页面最上行。
M: 跳转到当前页面的中间行。
L: 跳转到当前页面最末行。

匹配括号跳转

%: 实现了已匹配的括号间跳转。
{ or <shift+[>: 实现了光标跳转到上一个空行。
} or <shift+]>: 实现了光标跳转到下一个空行。

substitute command

  • :s/old/new 在光标所在行首个old用new替代。
  • :s/old/new/g 在光标所在行所有old用new替代。
  • :#,#s/old/new/g 在两#间用的所有old用new替代,#是一种数字。
  • :%s/old/new/g 在全文件范围内进行模式的匹配和替换。
  • :%s/old/new/gc 在全文件范围内进行模式匹配与替换,并显示信息提醒。

Lesson 5

vim 的文件操作

执行拓展指令

** Type :! followed by an external command to execute that command. **

大概就是 :! 后可以接很多命令行,e.g. :! ls 新窗口显示 ls 的打印信息,再次输入 〈Enter〉 恢复

All : commands must be finished by hitting <Enter>

写入文件操作

** To save the changes made to the text, type :w FILENAME **

  • 会保存更改的内容,如果输入 FILENAME,会生成一个叫做 FILENAME 的文件,保存了当前file的内容。

** To save part of the file, type v motion :w FILENAME **

  • 进入 visual mode 后,再执行 :w FILENAME
    • 在选择文段后,输入 :(colon) 会给提示符 ‘<,>’
    • 最后的输入现实为 :’<,>’w TEST

Note: Pressing v starts Visual selection. You can move the cursor around to make the selection bigger or smaller. Then you can use an operator to do something with the text. For example, d deletes the text.

文件的模块式导入

RETRIEVING: 索回,挽回

** To insert the contents of a file, type :r FILENAME **

  • 能将 FILENAME 里面的所有内容直接插入到 cursor 所在处。

Note: we can also read the output of an external command. For example, :r !ls reads the output of the ls command and puts it below the cursor.

SUMMARY

image

Lesson 6

这一节主要是 各种插入 操作,其实在之前的小节已经写过,此处快速浏览

vim 的行插入

** Type o to open a line below the cursor and place you in Insert mode. **
o: 所在行下新增一列,并进入 Insert mode。
O: 所在行上新增一列,并进入 Insert mode。

** Type a to insert text AFTER the cursor. **
a: 所在光标后进入 Insert mode(i是光标前)。
A: 在光标所在行后进入 Insert mode。

** Typa a capital R to replace more than one character. **
R: 输入R后,输入的字符都会往后替代。
r: 紧接着的字符会替代原字符。

SET OPTION

这个设定感觉还挺有意思的。
** Set an option so a search or substitute ignores case **

:set ic, 可以设置大小写识别,取消,:set noic
:set hls, 对于搜索到的 pattern 的进行高亮
:set is, 在输入 pattern 的时候就进行 search

if you want to ignore case for just one searchcommand, use \c in the phrase: .ignore\n <Enter>

SUMMARY

image

Lesson 7

vim 拓展指令

:help

** Use the on-line help system **

Vim has a comprehensive on-line help system.

  • press thekey (if you have one)
  • press thekey (if you have one)
    type :help <Enter>

Read the text in the help window to find out how the help works.

  • Type CTRL-W CTRL-W to jump from one window to another.
    • CTRL-W + hjkl: 进行一个各个小窗的跳转。
  • Type :q <Enter> to close the help window.

Vim script

这个主要是关于 Vim环境配置文件 脚本的编写

** Enable Vim features **

  1. Start editing the “vimrc” file. This depends on your system:
    :e ~/.vimrc for Unix
    :e ~/_vimrc for Windows
  2. Now read the example “vimrc” file contents:
    :R $VIMRUNTIME/vimrc_example.vim
  3. Write the file with:
    :w

‘’’ 这里给出一个配置语法高亮的例子 ‘’’

Completion

** Command line completion with CTRL-D and <TAB> **

在 command mode 下,键入 <CTRL-D> 会打印出 能够补全的所有items
键入<TAB> 会按顺序便利补全内容

vimium

对vimium来说,其实这一part没什么必要看,直接看知乎文章或者直接?看指令集就好了。
不需要背书式的记忆公示,在使用的过程中就会不断掌握的。

页面操作

? 显示帮助对话框以获取所有可用键的列表
h 向左滚动一点
j 向下滚动一点
k 向上滚动一点
l 向右滚动一点
gg 滚动到页面顶部
G 滚动到页面底部
d 向下滚动半页
u 向上滚动半页
f 打开元素定位器,是在当前标签页打开
F 打开元素定位器,是在新标签页打开
r 刷新
gs 查看源码
i 进入插入模式 - 在您按Esc退出之前,将忽略所有命令
yy 将当前网址复制到剪贴板
yf 将链接URL复制到剪贴板
gf 循环到下一帧(尤其在选择网页内置视频的时候很管用)
gF 聚焦主/顶框架

新浏览器操作

o 从URL、书签、历史记录中搜索地址,回车打开
O 从URL、书签、历史记录中搜索地址,回车在新标签页中打开
b 仅从书签搜索地址,回车打开
B 仅从书签搜索地址,回车新标签页中打开
T 搜索当前浏览器的所有标签

使用搜索

/ 进入查找模式 - 输入您的搜索查询并按Enter键进行搜索,或按Esc键取消
n 查找下一个匹配项
N 查找上一个匹配项

浏览历史记录

H 回到历史,也就是回到前一页
L 在历史上前进,也就是回到后一页

标签操作

J, gT 跳到左标签
K, gt 跳到右标签
g0 跳转到第一个标签
g$ 跳转到最后一个标签
^ 回到上一个访问的标签
t 创建一个新的标签
yt 复制当前页面,在新标签页打开
x 关闭当前标签
X 恢复关闭的上一个标签
p 在当前标签页打开剪切板中的URL,如不是URL则默认引擎搜索
P 在新标签页打开剪切板中的URL,如不是URL则默认引擎搜索
T 在当前打开的标签中搜索
W 将当前标签移动到新窗口
<a-p> pin/unpin current tab

标记(锚点)

ma 设置本地标记 a
mA 设置全局标记 A
a 跳转到本地标记 aA 跳转到q全局标记 a
`` 跳回到跳转之前的位置 (也就是说,在执行gg,G,n,N,或/ a 之前的位置)

其他高级浏览命令

<< 当前标签页向左移动
>> 当前标签页向右移动
<a-f> 在新标签中打开多个链接
gi 聚焦页面上的第一个(或第n个)文本输入框
gu 跳转到URL层次的父类(xxx.com/yyy/zzz 跳转到 xxx.com/yyy)
gU 转到URL层次结构的根目录(也就是 xxx.com)
ge 编辑当前URL
gE 编辑当前URL并在新选项卡中打开
zH 向左滚动
zL 向右滚动
v 进入预览模式;使用p / P粘贴,然后使用y来拷贝
V enter visual line mode
<a-m> 开/关静音
<a-p> 固定标签栏

预览模式 visual mode

1
2
3
4
5
6
7
8
9
10
先用 / 定位,找到想要选择的字符
再按 v ,进入模式
然后使用
j:向下一行
k:向上一行
h:向左一个字符或标点(数字+h,可以移动多个字符)
l:向右一个字符或标点(数字+l,可以移动多个字符)
w:下一个标点符号后位置,包括看不见的换行符
e:下一个标点符号前位置
b:取消选中上一个字符,字符和标点算一个字符

网页链接跳转

这个vimium从需求出发设计的指令

输入指令 f 会生成各个链接键的对应指令(指令不分大小写
如果是 F 会打开新tab 但是不会切换到新页面;
如果是 f 会打开新tab 并且切换

写在最后

** 这里主要是 vimtutor 作者的一些留言 **

vimtutor 只是为了让方便入门的一个小文档,
如果想要更近一步 “:help user-manual”

好书推荐
Vim - Vi Improved - by Steve Oualline
Publisher: New Riders

介绍了许多细节,对于初学者相当受益。更多的案例与图片 见 https://iccf-holland.org/click5.html

Learning the Vi Editor - by Linda Lamb
Publisher: O’Reilly &Associates Inc.

这本书比上本书更古早,并且更接近于 Vi 的书,但是仍然推荐。