VIM进阶学习笔记(一) 更友善的学习路线

基于以下的链接:
2021年了,如何上手Vim? - 知乎 https://www.zhihu.com/question/449635303/answer/2079552103

用聪明的方式学习Vim      https://github.com/wsdjeg/Learn-Vim_zh_cn

VIM键位图:            https://www.runoob.com/w3cnote/all-vim-cheatsheat.html

 

在日常学会 iao  ycd hjkl  基础命令后,再整理一些个人的vim进阶学习笔记。

按照第一个回答。。学习vim 的步骤。

作者:匿名用户链接:https://www.zhihu.com/question/449635303/answer/2079552103来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

依我愚见,学习vim应该从`+ - ( ) { } ^e ^y ^f ^b ^u ^d`开始,在翻页上超过鼠标;然后再`:e bn bf :tabnew gt gT sp vsp`,在缓冲区和窗口方面达到鼠标同等水平;最后通过vim实现markdown→html的编辑,先通过类似```:%s/\`\(.\{-}\)\`/\<kbd\>\1\<\/kbd\>/g```的替换+录制宏实现,(顺便注意有哪些重复命令的方法),再通过简单的vim script实现,在匹配替换上超过notepad。

总结一下:首先,不应纠结于怎么编辑,甚至不纠结怎么精细的移动光标(代码里满是+-*/%()<>={}[],;,常人根本算不出来是3w,4w还是5w)

  1. 怎么大段的移动光标、怎么翻页
  2. 怎么能像浏览器一样,在一个vim进程里打开多个tab/buffer
  3. 怎么把小括号换成中括号,即把(你好)都换成【你好】

重点解释一下第三条,**不要逃避正则表达式**!(正则表达式的基本语法只有那么两三个符号,其他的全是语法糖,一边百度一边用就行)。

前两条是让你了解,vim不比vscode更不方便,第三条是让你知道有些复杂文本的处理在vim是能直接实现(而不跳出编辑器需要写一段awk,python,irb),并且能轻易重复这些命令。这时你就理解了【熟练 Vim 能为我带来什么? - 韦易笑的回答 - 知乎 zhihu.com/question/6029】里大佬推荐的视频所表达的的意义。这些意义是通过`2w 3e 4b 567G`学不到的。

 


 

这边来解析下看看,答主说的是什么意思。

学习vim应该从`+ - ( ) { } ^e ^y ^f ^b ^u ^d`开始,在翻页上超过鼠标

这里其实应该说的是VIM 里的一些导航,跳转定位到指定位置的操作方式。

对应到《聪明学vim》 的这一章 “在文件中移动”:  https://github.com/wsdjeg/Learn-Vim_zh_cn/blob/master/ch05_moving_in_file.md


`  是跳转到标注(标记/书签/标签)  ma 可以设置a标签, 然后 `a 跳到a标签

+  是跳到下一行行首

-  是跳到上一行行首

(  跳转上一个句子 

)  跳转下一个句子

{  跳转上一个段落 

}  跳转下一个段落

Ctrl+e   向下滚动一行 

Ctrl+y   向上滚动一行

Ctrl+f     向下滚动一屏

Ctrl+b     向上滚动一屏

Ctrl+u     向上滚动半屏

Ctrl+d     向下滚动半屏

 

附录:

单词导航

w		移动到下一个单词的开头
W		移动到下一个词组的开头
e		移动到下一个单词的结尾
E		移动到下一个词组的结尾
b		移动到前一个单词的开头
B		移动到前一个词组的开头
ge	移动到前一个单词的结尾
gE	移动到前一个词组的结尾

当前行导航

当你在进行编辑的时候,你经常需要水平地在一行中移动,你可以通过0跳到本行第一个字符,通过$跳到本行最后一个字符。 另外,你可以使用^跳到本行第一个非空字符,通过g_跳到本行最后一个非空字符。 如果你想去当前行的第n列,你可以使用n|

0		跳到本行第一个字符
^		跳到本行第一个非空字符
g_      跳到本行最后一个非空字符
$		跳到本行最后一个字符
n|      跳到本行第n列

你也可以在本行通过ft进行行内搜索,ft的区别在于f会停在第一个匹配的字母上,t会停在第一个匹配的字母前。 因此如果你想要搜索并停留在"h"上,使用fh。 如果你想搜索第一个"h"并停留在它的前一个字母上,可以使用th。 如果你想去下一个行内匹配的位置,使用;,如果你想去前一个行内匹配的位置,使用,

FTft对应的向后搜索版本。如果想向前搜索"h",可以使用Fh,使用;,保持相同的搜索方向搜索下一个匹配的字母。 注意,;不是总是向后搜索,;表示的是上一次搜索的方向,因此如果你使用的F,那么使用;时将会向前搜索使用,时向后搜索。

f   在同一行向后搜索第一个匹配
F   在同一行向前搜索第一个匹配
t   在同一行向后搜索第一个匹配,并停在匹配前
T   在同一行向前搜索第一个匹配,并停在匹配前
;   在同一行重复最近一次搜索
,   在同一行向相反方向重复最近一次搜索
 

匹配导航

你可以通过%跳到其中一个括号或另一个上(如果存在)。 你也可以通过这种方法弄清你是否各个括号都成对匹配了。

%    跳转到匹配的括号, 通常用于 (), [], {}
 

行号导航

你可以通过nG调到行号为n的行,例如如果你想跳到第7行,你可以使用7G,跳到第一行使用gg1G,跳到最后一行使用G

有时你不知道你想去的位置的具体行号,但是知道它大概在整个文件的70%左右的位置,你可以使用70%跳过去,可以使用50%跳到文件的中间。

gg      跳转到第一行
G       跳转到最后一行
nG      跳转到第n行
n%      跳到文件的n%

滚动

在文件中滚动,你有三种速度可以选择: 滚动一整页(CTRL-F/CTRL-B),滚动半页(CTRL-D/CTRL-U),滚动一行CTRL-E/CTRL-Y)。

Ctrl-e    向下滚动一行
Ctrl-y    向上滚动一行
Ctrl-f    向下滚动一屏
Ctrl-b    向上滚动一屏
Ctrl-u    向上滚动半屏
Ctrl-d    向下滚动半屏
 

你也可以相对当前行进行滚动

zt    将当前行置于屏幕顶部附近
zz    将当前行置于屏幕中央
zb    将当前行置于屏幕底部

搜索导航

通常,你已经知道这个文件中有一个字段,你可以通过搜索导航非常快速的定位你的目标。 你可以通过/向下搜索,也可以通过?向上搜索一个字段。 你可以通过n重复最近一次搜索,N向反方向重复最近一次搜索。

/   向后搜索一个匹配
?   向前搜素一个匹配
n   重复上一次搜索(和上一次方向相同)
N   重复上一次搜索(和上一次方向相反)

你可以通过*快速的向前搜索光标下的文本,通过#快速向后搜索光标下的文本。 如果你的光标位于一个字符串"one"上,按下*相当于/\<one\>。 /\<one\>中的\<\>表示整词匹配,使得一个更长的包含"one"的单词不会被匹配上,也就是说它会匹配"one",但不会匹配"onetwo"。 如果你的光标在"one"上并且你想向后搜索完全或部分匹配的单词,例如"one"和"onetwo",你可以用g*替代*

*   向后查找光标所在的完整单词
#   向前查找光标所在的完整单词
g*  向后搜索光标所在的单词
g#  向前搜索光标所在的单词

 

位置标记: 

位置标记

你可以通过标记保存当前位置并在之后回到这个位置,就像文本编辑中的书签。 你可以通过mx设置一个标记,其中x可以是a-zA-Z。 有两种办法能回到标记的位置: 用 `x精确回到(行和列),或者用'x回到行级位置。

ma    用a标签标记一个位置
`a    精确回到a标签的位置(行和列)
'a    跳转到a标签的行
 

a-z的标签和A-Z的标签存在一个区别,小写字母是局部标签,大写字母是全局标签(也称文件标记)。

我们首先说说局部标记。 每个buffer可以有自己的一套局部标记,如果打开了两个文件,我可以在第一个文件中设置标记"a"(ma),然后在另一个文件中设置另一个标记"a"(ma)。

不像你可以在每个buffer中设置一套局部标签,你只能设置一套全局标签。 如果你在myFile.txt中设置了标签mA,下一次你在另一个文件中设置mA时,A标签的位置会被覆盖。 全局标签有一个好处就是,即使你在不同的项目中,你也可以跳转到任何一个全局标签上,全局标签可以帮助你在文件间切换。

使用:marks查看所有标签,你也许会注意到除了a-zA-Z以外还有别的标签,其中有一些例如:

''   在当前buffer中跳转回到上一次跳转前的最后一行
``  在当前buffer中跳转回到上一次跳转前的最后一个位置
`[  跳转到上一次修改或拷贝的文本的开头
`]  跳转到上一次修改或拷贝的文本的结尾
`<  跳转到最近一次可视模式下选择的部分的开头
`>  跳转到最近一次可视模式下选择的部分的结尾
`0  跳转到退出Vim前编辑的最后一个文件
 

除了上面列举的,还有更多标记,我不会在这一一列举因为我觉得它们很少用到,不过如果你很好奇,你可以通过: marks查看。

 

跳转

跳转

最后,我们聊聊Vim中的跳转你通过任意的移动可以在不同文件中或者同一个的文件的不同部分间跳转。 然而并不是所有的移动都被认为是一个跳转。 使用j向下移动一行就不被看做一个跳转,即使你使用10j向下移动10行,也不是一个跳转。 但是你通过10G去往第10行被算作一个跳转。

'   跳转到标记的行
`   跳转到标记的位置(行和列)
G   跳转到行
/   向后搜索
?   向前搜索
n   重复上一次搜索,相同方向
N   重复上一次搜索,相反方向
%   查找匹配
(   跳转上一个句子
)   跳转下一个句子
{   跳转上一个段落
}   跳转下一个段落
L   跳转到当前屏幕的最后一行
M   跳转到当前屏幕的中间
H   跳转到当前屏幕的第一行
[[  跳转到上一个小节
]]  跳转到下一个小节
:s  替换
:tag  跳转到tag定义
 

我不建议你把上面这个列表记下来,一个大致的规则是,任何大于一个单词或超过当前行导航的移动都可能是一个跳转。 Vim保留了你移动前位置的记录,你可以通过:jumps查看这个列表,如果想了解更多,可以查看:h jump-motions

为什么跳转有用呢? 因为你可以在跳转列表中通过Ctrl-oCtrl-i在记录之间向上或向下跳转到对应位置。 你可以在不同文件中进行跳转,这将是我之后会讲的部分。

 

posted @   应晚星  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示