首页
归档
友情链接
关于
Search
1
在wsl2中安装archlinux
80 阅读
2
nvim番外之将配置的插件管理器更新为lazy
58 阅读
3
2018总结与2019规划
54 阅读
4
PDF标准详解(五)——图形状态
33 阅读
5
为 MariaDB 配置远程访问权限
30 阅读
心灵鸡汤
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
菜谱
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
登录
Search
标签搜索
c++
c
学习笔记
windows
文本操作术
编辑器
NeoVim
Vim
win32
VimScript
Java
emacs
linux
文本编辑器
elisp
反汇编
OLEDB
数据库编程
数据结构
内核编程
Masimaro
累计撰写
308
篇文章
累计收到
27
条评论
首页
栏目
心灵鸡汤
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
菜谱
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
页面
归档
友情链接
关于
搜索到
59
篇与
的结果
2022-04-27
vim 从嫌弃到依赖(8)——使用命令模式编辑文本
通过前面的文章,我们已经介绍了vim的普通模式、插入模式、可视模式。接下来让我们接着介绍vim中另一个强大的模式——命令行模式命令模式简介命令模式可以说在vim中的使用频率不亚于普通模式,像我们平时使用 :w 将缓冲区的内容写入文件,使用 :q 退出vim,这些都是在命令行模式下执行命令。vim最早是由 ed 编辑器发展而来,中间经历过了 ed --> ex --> vi --> vim 的流程,vim继承了vi的模式区分以及ex的一些处理文本的命令,这也就是为什么有时候会将vim命令行模式中执行的命令叫做ex命令在普通模式下,按下: 会切换到命令行模式,这个时候vim会等待我们输入一个命令,最后以回车(\<CR>) 结束输入并执行在vim 中有许多自带的的命令,而且我们安装第三方插件的时候,插件也会提供一些使用的命令,这里我们主要还是战士如何在命令模式中操作文本。其他相关的命令在后面结合其他功能给出在命令行中的操作与在插入模式中类似,只是插入模式会将键盘输入写入缓冲区,而命令行模式则会将输入显示在命令行位置。二者的操作符也类似,例如可以适用 <Ctrl-w> 和 <Ctrl-u>来删除至上个单词的开头和行首。也可是使用 <Ctrl-v> 和 <Ctrl-k> 来输入键盘上找不到的字符。也可是使用方向键来移动光标,或者使用退格键删除命令。如果中途不想执行输入的命令,可以使用<Esc> 退回到普通模式。在普通模式下,我们需要使用 operator +motion 来操作指定范围的文本,这通常伴随着光标的移动。在命令行模式下,可以操作任意范围内的文本,这表示在某些情况下,使用命令相对于在普通模式下有着更高的效率我们可以在一个或者多个连续行上执行命令,例如print("hello world1") print("hello world2") print("hello world3") print("hello world4") print("hello world5") print("hello world6")假设光标在第一行的行首位置,我们输入 :print ,它会打印当前行。我们看到执行print 之后会打印光标所在行配合范围使用命令与普通模式下 operator 配合一个 motion 来指定操作的文本范围类似,ex命令也可以带有一个范围值来指定操作的范围。这里我们给出一个使用范围的格式格式command = {startpoint},{endpoint} + cmd其中 startpoint 表示开始位置,endpoint表示结束位置,他们中间用,隔开,后面紧跟着一个命令。如果不加范围,则表示操作的范围是光标所在行,例如 :print 表示打印光标所在行的文本如果只输入一个数字,vim会首先将光标移动到对应的行上,然后针对该行文本执行操作,例如如果输入 :2print 它会将光标移动到第二行,然后对第二行文本执行打印操作。使用数字代表对应行下面再看一个例子:print("hello world1") print("hello world2") print("hello world3") print("hello world4") print("hello world5") print("hello world6") print("hello world7")我们要删除第三到第5行范围内的文本,就可以输入 :3,5d, 其中d 代表 delete 是删除的命令通过上述例子发现,在使用命令模式的时候,不需要在意光标所在位置,如果我们采用普通模式的解法,就需要先使用 3gg 跳转到第三行,然后使用3dd 删除三行。或者在第三行使用V 进入可视模式,然后选中3行,接着使用d 删除选中。对比这么几种方式来看,使用命令模式更加的灵活使用特殊符号代表对应行除了使用数字来代表对应行号所在行外,还是使用一些特殊符号来表达一些特殊含义,例如我们可以使用 . 来代表当前光标所在行,所以针对上述操作,我们还有一个解法:使用3gg 跳转到第三行,然后使用 :.,5d 删除当前行到第5行的内容除了使用. 来作为相对行号以外,命令模式中还有其他常用符号,这里列举一些供大家参考:.: 当前行$: 文件末尾0: 虚拟行,位于文件第一行的上方1: 文件第一行'm: 包含标记m的行<: 高亮选区的起始行>: 高亮选区的结尾行%: 整个文件,相当于 :1,$介绍了这些操作符之后,如果我们需要删除整个文件,那么有这么几种方法方法1:普通模式下,使用 0 跳转到第一行, 然后使用dG 第一行到最后一行的内容方法2: 命令模式下,使用 :1,$d 删除第一行到最后一行的内容方法3: 命令模式下,使用 :%d 删除所有使用位置偏移量来微调操作范围在 {startpoint}, {endpoint} 中二者均为绝对地址,除了使用绝对地址,我们也可以使用绝对地址+偏移地址的方式来定义操作范围。可以在绝对地址上使用 + 或者 - 来定义如何进行偏移,例如 $-3 会定位到导数第4行。假设我有超过1000行的文本,我想保留前3行和后3行,使用命令的时候可以使用:4,$-3d将可视模式的选区作为操作范围手动指定范围的时候,有时候需要我们去手工数开始行号和结尾行号,数数也算是一个比较累的体力活。除了使用之前的方式外,还可以使用可视模式。将可视模式的选区作为操作区。我们还是来看上面的删除第一行到第5行的例子,配合可视模式就可以这么做:先使用V 进入可视模式,然后使用 2j 选中两行,然后输入:d 进行删除 我们发现在选中一个选区后,按下: ,在左下角会出现 <,> 的字样,根据前面的列表知道 他们代表的是被选中的高亮选区。其他操作文本的命令在上面的例子中,我们主要使用了 d 这个命令来删除文本,除了它还有其他一些处理文本的命令,每个类型的命令接收的参数都各有千秋,但是也很好理解,这里我以 t (拷贝粘贴) 和 m (移动)为例,希望可以做到抛砖引玉的作用,帮助大家理解其他一些常用的命令。使用t 命令t 命令代表拷贝和粘贴,可以理解为 CopyTo。它需要两个参数,一个范围代表拷贝哪个范围的文本,一个位置,代表要将拷贝的内容放置在哪个位置。它的形式如下::range + t + address第一个range 代表的是范围,要将哪个范围内的文本进行粘贴,第二个address 代表的是一个行号,要将粘贴的内容放置到哪个位置这里我们给出一个示例来说明如何使用今日完成工作情况 1. fixbug 1 2. fixbug2 3. fixbug3 4. fixbug4 明日计划 5. fixbug5 6. fixbug6 7. fixbug7假设有这么一个日报,但是我今日工作完成之后发现离下班还有点时间,为了获得内卷达人的称号,我决定先看看明天的 bug5但是又不想为此加班太多,只是简单的看看,然后在工作日报上进行汇报,也就是说我要将fixbug5 复制一份放到今天的任务中。我们可以使用 :7t5 来将第7行的内容复制到第5行下方当然也可以先使用 7gg 跳转到第7行,然后使用 yy 复制该行,接着使用 5gg 跳转到第5行,最后使用p 进行粘贴。对比这种方式使用命令更加简洁,它省略了几次光标跳转的过程。由此看来,在需要大范围操作或者跳转的时候,使用命令会更加简洁也会更加高效还是以这个日报为例,随着我不要命的卷,终于在今天把bug5给修复了,虽然拉着其他同事陪我加了“一会班”,但是我超额完成了任务,老板承诺的绩效和年终奖马上要到手了,想想就觉得心里美滋滋,我要把明天修复的bug5提前到今天。想到这里我使用 :7m5 完成这一操作之后,打卡下班,未来可期如果再卷点,我能把明天要修复的bug全都在今天修完了,所以我这个时候想在工作日报中把明日计划工作全部移动到今天来,假设当前光标处于 bug5的位置,我可以执行:.+2,$m.。至此我带着出任总经理,担任CEO,迎娶白富美,走向人生巅峰的美梦沉沉睡去。总结到此为止,这篇文章的内容就完了,最后给大家总结一下主要内容命令模式是vim中又一重要的模式,使用率不亚于普通模式命令可以配合数字或者其他符号使用,代表将要操作的文本范围主要以 t 和 m 命令介绍了操作文本命令的用法最后再给出一些命令和范围的总结供大家查阅文本操作命令命令简写用途:[range]delete [x]d删除指定范围内的行[到寄存器 x 中]:[range]yank [x]y复制指定范围的行[到寄存器 x 中]:[line]put [x]pu在指定行后粘贴寄存器 x 中的内容:[range]copy {address}t把指定范围内的行拷贝到 {address} 所指定的行之下:[range]move {address}m把指定范围内的行移动到 {address} 所指定的行之下:[range]joinj连接指定范围内的行:[range]normal {commands}narm对指定范围内的每一行执行普通模式命令 {commands}:[range]substitute/{pattern}/ {string}/[flags]s把指定范围内出现{pattern}的地方替换为{string}:[range]global/{pattern}/[cmd]g对指定范围内匹配{pattern}的所有行,在其上执行Ex 命令{cmd}有些命令暂时还不知道怎么用,不着急,后面说到对应部分,自然会提到的范围符号符号用途.当前行$文件末尾0虚拟行,位于文件第一行的上方1文件第一行'm包含标记m的行<高亮选区的起始行>高亮选区的结尾行%整个文件,相当于 :1,$
2022年04月27日
7 阅读
0 评论
0 点赞
2022-04-25
vim 从嫌弃到依赖(7)——可视模式
vim 的可视模式下可以选择一个区域,然后针对区域进行操作。可视模式有点类似于在其他编辑器上使用鼠标选中一块区域然后针对区域进行操作。vim中有3种可视模式,分别用来处理不同范围的文本:处理字符的可视模式处理行的可视模式处理列块的可视模式在普通的文本编辑器中,例如在写博客的时候会发现有些地方表述不太正确,这个时候一般会选择先用鼠标选择一句或者一段,然后按退格或者删除键删除所选内容。vim的可视模式也是相同的逻辑,先选区然后对选区进行操作。选区时可以使用之前介绍的motion 来移动光标进行选区,操作选区的时候可以使用 operator 进行。直接说可能有点抽象,下面看一个例子:我们将 there is one more line 改为 there is one line。在上述例子中,我们使用 v 进入可视模式,在处理字符的可视模式下会在左下方显示 VISUAL 字样表示进入了处理字符的可视模式。在该模式中使用e 选中一个单词,然后使用d 删除它我们发现在可视模式下操作的逻辑与在普通模式下的操作逻辑不太相同,可视模式下先使用motion 移动光标选中部分内容,然后调用operator 来对选中部分做操作。而普通模式下先调用 operator 声明需要进行的操作,再使用motion 传入要操作的文本范围。但是可视模式下的操作逻辑确与一般的文本编辑器类似,都是现选中一个部分,然后再针对这部分进行操作。选择模式在一般的编辑器中,选中一段文本后,输入任意字符会先删除选中部分然后再插入输入的字符,但是vim的可视模式并没有这么做。从上面的例子也可以看出来,vim的可视模式保持了普通模式中使用操作符操作区域的逻辑。但是vim也提供了类似于普通编辑器一样的体验,这个体验就是选择模式。在可视模式下使用 <Ctrl +g> 进入选择模式,下面是一个选择模式的例子在进入可视模式后,使用<Ctrl +g> 进入选择模式,此时左下角的字样已经变为 SELECT,表示此时进入了选择模式。在选择模式中,随便输入一个字符,它会删除选中然后输入对应的内容。相信能看到这里的小伙伴已经很熟练的使用vim进行文本操作了。这个模式主要是为了迎合那些想让 vim 像其他编辑器那样的用户。这种模式效率并不高,而且也不太推荐使用这种模式。可视模式的3种子模式可视模式下有3种处理不同情况的子模式,分别为:处理字符的可视模式、处理行的可视模式、处理列的可视模式处理字符的可视模式与普通的motion 配合使用,可以选中光标移动所经过的字符。可以在普通模式下按v 进入处理行的可视模式可以与行操作的motion 配合,一次选中一行,可以在普通模式下按 V 进入处理列的可视模式可以与一般的motion 配合,一次选中一列,行操作可以选中多列,而h l 则可以选中多列。3种模式下可以互相转化,按键与上面介绍的相同。例如从处理字符的选择模式切换到处理行的可以使用V ,从处理列的选择模式切换到处理行的,可以使用v。但是如果处在处理字符的可是模式下再次按下v 则会退回到普通模式,在其他模式下类似。重新选择选中区域如果选择到一半发现我们选择错了该怎么办呢?一种方式是退回到普通模式下,然后再重新进入选择模式。但是在这里要介绍一种新的方式——可以按 o 重新选择选区的活动段。选择模式下选区一段固定,另一端可以移动。通过多次按下o 来变更需要移动哪一段例如下面的例子示例上面叽里呱啦说了一堆,可能各位小伙伴都没怎么记住,下面给出一些例子,帮助大家来理解之前说到的一些内容示例1:缩进Python代码假设有这么一段Python代码def fib(n): a , b = 0, 1 while a < n: print(a) a , b = b, a + b fib(42)要将中间两行缩进两次,变为下面的代码def fib(n): a , b = 0, 1 while a < n: print(a) a , b = b, a + b fib(42)解法1: 可以在普通模式下,在对应位置使用 2>> 将两行缩进一次,然后使用 .命令再重复一次解法2:使用>j 缩进两行,然后使用 . 重复,效果与上面的解法1一样,这里就不演示了解法3:使用 V 选中一行,然后使用2> 缩进2次,移动到下一行后使用 .重复解法4:使用V 选中一行,然后使用j 再选中一行,接着使用2>> 将选中两行一次缩进两次 解法5:这里介绍一个在可视模式下的新命令——gv 它可以选中上次选中的区域。结合这个命令可以这么操作,先选择两行,再使用> 缩进一次,然后使用 gv 选中上次选中的两行,再次使用 >针对示例1,我给出了5种解法,有利用普通模式加. 命令的方式,也有利用现学的可视模式的解法。当然也有其他的解法,各位小伙伴有好的方式也可以在底下评论。上面不管哪种解法,大部分都使用了.命令,这里也可以看出. 在处理重复操作时候的威力。虽然它很好用,但是也需要注意:在基于字符的可视模式下 . 命令操作的字符数与上次修改中操作的字符数相等。例如world world1 world11 world111当我们在第一行使用 v 进入选择模式,然后使用e 选中一个单词删除它之后,再在下一行执行. 命令的时候,并没有删除一行,只删除了world这个单词针对示例1给出的几个解法,我们发现使用可视模式在效率上有时候还不如在普通模式下配合. 来使用,这么说是不是说可视模式就失去了它的价值呢?其实也不是,在平时处理文本的操作中,并不是每个任务都需要进行重复,在处理一次性操作的任务时,vim的可视模式在效率上于普通模式其实差距不大,而且有时候要修改的文本所在区域无法准确的通过一两个motion 表达出来,这种情况下可视模式就大大的派上用场了。下面几个列子就可以说明这点。示例2:处理列的可视模式的初步使用假设我们要将下列代码Print("hello world") Print("hello world") Print("hello world") Print("hello world") Print("hello world")变为print("hello world") print("hello world") print("hello world") print("hello world") print("hello world")可以使用 <Ctrl + v> 进入处理列的可视模式,然后选中所有的P,接着使用 u 将其变为小写示例3:添加注释假设现在有一些Python代码需要添加注释,即将下列代码print("hello world") print("hello world") print("hello world") print("hello world") print("hello world") print("hello world")变为#print("hello world") #print("hello world") #print("hello world") #print("hello world") #print("hello world") #print("hello world")可以使用 <Ctrl + v> 进入处理列的可视模式,然后选中所有的p,然后使用 I 在行首进入插入模式,接着输入 # 注释代码,最后使用 <Esc> 退回到普通模式,我们可以看到在插入时它只显示了一行的变化,但是最后回到普通模式后,针对第一行的变化作用到了所有选中行示例3:在每行代码后添加一个分号还是将之前介绍. 命令的那个例子来作为示例,但是这里提供一个使用列处理的可视模式的方式在下列代码的每一行行尾添加一个分号var foot = "foot" var ball = "ball" var football = foot + ball变为var foot = "foot"; var ball = "ball"; var football = foot + ball;现将光标移动到第一行的最后一列,然后使用<Ctrl v> 进入到处理列的可视模式中,然后移动光标到最后一行的行尾。接着使用A 进入插入模式,输入分号,最后使用<Esc> 回到普通模式。这个时候我们发现vim在被选中区域每一行的尾部都添加了一个分号在普通模式下 i I a A 都有自己的用途,而在处理列的可视模式下我们都只是在用 I 和 A ,而且他们的含义与在普通模式下有所不同,在处理列的可视模式中,A 表示在选择区的每个行尾进行同样的操作,而I 表示在选择区的行首进行同样的操作。至于a 和 i 这里则代表要处理的文本对象。到此我们介绍完了vim中又一个常用的模式,再下一篇中,将介绍vim的另一种常用的模式——命令模式。
2022年04月25日
5 阅读
0 评论
0 点赞
2022-04-21
vim 从嫌弃到依赖(6)——插入模式
插入模式是vim中主要用来处理输入的一种模式,在这种模式中,用户的输入的字符会显示在窗口中。该模式中的行为与在普通编辑器中输入类似。由于在该模式中输入的字符会被当做有效输入,因此该模式下涉及的到命令也少,内容也不多,这一篇文章差不多就能讲完进入插入模式的一些命令在前面几节我们在介绍一些例子的时候或多或少接触到了如何进入插入模式,特别是用的比较多的 i、c 等命令。而且还介绍了一些复合命令,有些复合命令同时也肩负着进入插入模式的职责。这里列出一些常用的进入插入模式的方法,也算是对之前的一些命令做一个总结。命令含义i在当前光标前进入插入模式I在行首进入插入模式a在当前光标后面进入插入模式A在行尾进入插入模式o在下一行进入插入模式O在上一行进入插入模式s删除当前光标所在字符并进入插入模式S删除光标所在行并进入模式c + motion删除指定范围的字符,并进入插入模式C删除光标所在位置至行尾的字符,并进入插入模式在插入模式中删除字符在插入模式中输入出错,我们一般会退出到普通模式下使用c或者d之类的指令进行删除操作,然后重新进入插入模式,但是有时候这种方式显的有些啰嗦。其实在插入模式中是可以进行删除操作的,例如如果要删除的字符刚好在光标前面,我们可以使用退格键删除它。另外vim提供了其他几种方式在插入模式中向前删除单词、行: 删除光标前一个词(与退格键相同): 删除光标前一个单词: 删除至行首插入-普通模式从插入模式返回到普通模式可以使用 \<Esc\> 键,或者使用 <C-[>, 但是在某些情况下我主要的经历还是集中在编写代码或者文档上面,之前也说过vim 作为编辑器应该要符合人的一般使用习惯,在文思如泉涌的时候退回到普通模式总有种割裂感,普通模式应该是我们在需要调整思路的时候回去最好。假设我在写文档或者写代码的时候光标已经到窗口的最后一行了,但是我想将光标定位到窗口中央,一般都会先退回到普通模式,然后使用前面介绍过的 zz来完成这一动作,最后再进入插入模式。针对这种情况vim 提供了一种新的模式 插入—普通模式,在插入模式中使用Ctrl + o 来进入该模式。该模式运行用户暂时回到普通模式,然后在执行一条普通模式的命令之后自动回到插入模式中。例如针对上面的例子,可以使用 \<Ctrl +o>zz 来刷新光标位置插入非常用字符在平时输入的时候,除了常用的英文单词或者汉字之类的字符还有一些非常用字符,例如unicode 图标或者ascii 字符,或者其他键盘无法直接打出的字符。vim 支持使用通过字符的二进制编码进行输入 {code}:按照字符的十进制编码输入,这里code只能输入单字节的字符u{code}: 按照字符的16进制编码输入,这里可以支持两个字节的字符输入,例如unicode例如可以使用该方式输入字符A,A在ascii表的十进制值是65,因此在插入模式下使用 <Ctrl v>65 然后回车即可这里再给出一个输入unicode字符的例子,例如我们输入一个安卓的小机器人,通过查询对应的unicode字码表,它的16进制值是 e70e,那么我们就可以输入<Ctrl v>ue70e除了输入字符表中的例子,也可以输入二合字符。可以使用 <C-k>{char1}{char2} 来输入二合字符,例如要输入分数 1/2可以使用<C-v>12 来进行。这个技巧也是 《vim实用技巧》 书中介绍的,可以在vim中使用 :h digraph-table 来查看二合字母表。平时写代码基本用不到这个,所以这里就一笔带过吧。替换模式vim 中的替换模式与改写模式类似。它会将光标所在字符替换为新输入的字符,按照 vim官方文档的说法,替换模式不会变更文本自身的长度,只会在现有长度上替换已有文本。只有在光标超出原有文本长度时才会表现出插入字符这一特性。而且在替换模式下没有删除的操作。在某些情况下替换可能会导致代码格式错乱,如果代码中某些位置存在制表符,而制表符的宽度会根据tabstop 的值不同,而显示不同,例如vim 默认的制表符占8个空格,如果我们使用R 进入替换模式,替换tab键的话,原来的tab键所有空白字符都会被替换,这样会导致文本长度发生变化。如果不希望长度变化,vim提供了一种被称之为虚拟替换模式的方式,可以使用 gR 进入,这样再替换制表符的话,制表符被替换为一个字符+ 多余的空格,源文本长度不变。使用普通的替换模式使用虚拟替换模式除了进入和退出替换模式,如果只是想替换一次,可以使用r{char} 和 gr{char} 暂时进入替换模式,替换一个字符后立即回到普通模式替换模式就我自己来说用的还是比较少的,除非我只需要替换个别字符导致的拼写错误。一般我更习惯删除整个单词,然后重新输入。至于虚拟替换模式解决tab 的问题,我更喜欢使用一些配置将tab 键改为空格,这里我们在配置文件中再添加几行-- nvim lua 配置 vim.o.softtabstop = 4 vim.o.shiftwidth = 4 vim.o.expandtab = true# vimscript set softtabstop=4 set shiftwidth = 4 set expandtab = true这几行会将tab替换为4个空格,并且在一些代码中,如果加入了自动缩进的属性,在输入下一行的时候它会自动以4个空格进行缩进到这里,插入模式下的一些内容都介绍完了,插入模式主要用来做文本输入,与在其他编辑器中输入文本相比并没有太大的区别,所以内容比较少,只需要一篇就结束了。请各位多多支持,订阅专栏,关注作者。方便接收更新推送和日后系统性的回顾,谢谢大家
2022年04月21日
7 阅读
0 评论
0 点赞
2022-04-19
vim 从嫌弃到依赖(5)——普通模式的一些操作
通过前面几章内容的铺垫,基本已经介绍完了普通模式的大部分内容,按照进度下面会依次介绍插入模式、命令模式、选择模式的一些操作。根据不同模式提供功能的多少和使用频率,篇幅会有长有短。本来这篇文章应该介绍插入模式的。但是我在整理最近写的内容的时候发现我忘记了一些不太常用但是很好用的一些小技巧,所以这篇文章我们还是停留在普通模式下。快速翻阅文本跳转光标的操作,之前介绍过 h j k l w等操作,但是在阅读代码的时候,仅仅根据这几个操作,效率着实有点低,即使使用类似 数字 + j/k 的方式来进行行间跳转,效率也一般。这里再介绍几个操作ctrl + f: 向下翻页ctrl + b: 向上翻页这里没有什么具体的例子,各位小伙伴只需要找到一个大一点的文件试试就能看到效果 除了使用这种翻到下一页或者上一页的操作之前,还可以相对于光标滚屏zt: 将光标所在行移动到窗口顶端zb: 将光标所在行移动到窗口底端zz: 将光标所在行移动到窗口中央这个提供两个问题:为什么没有将他们放到前面跟 h j k l 这类的操作一块讲呢,当然是因为我忘记了啊。。。。这个理由虽然很重要,但是并不是主要理由。大家可以先猜猜。既然这个操作能大幅度提高我们阅读代码的效率,那为什么使用频率还会这么低呢有兴趣的小伙伴可以先不看后面的解答,自己操作一下,特别是在认真阅读代码的时候。可能就会有跟我下面说的一样的体验好了,现在公布我的答案:针对问题一,我的答案是,这几个操作并不属于motion 那一类,小伙伴们在试验的时候可以仔细观察一下光标,光标相对于窗口的位置其实并没有发生变化。大家在阅读代码的时候使用它们会不会觉得跳转太多了,每次跳转都感觉跟前面读过的衔接不上呢。体验非常不好,还不如我一直使用 jjjjjjjjj 甚至 10j 之类的操作。现在我采取折中的办法,就是翻页的快捷键我用,但是我将其映射为了 10j (如何映射快捷键以及如何定制自己的vim在后面说)撤销撤销在普通模式下使用 u,反撤销使用 Ctrl+rvim的撤销是撤销上次修改,结合之前介绍的. 命令的部分,我们可以知道上次修改指的是从进入插入模式那一刻起到退回到普通模式为止,进行的一系列的修改。根据这个特征,我们可以很方便的定义撤销哪些内容。例如在写这篇文章的时候我进入插入模式进行编写。然后在需要构思的地方退回到普通模式,想到了一些再次进入插入模式编辑,一旦发现有问题就可以在普通模式下撤销上次的修改。例如下面的例子:我们先使用 cw 替换一个单词,然后删除一行。使用u 恢复上一次的修改,也就是恢复删除的一行使用 ctrl + r 执行反撤销,即再次删除上次恢复的一行u 和 ctrl+u 是操作符,它们符合之前介绍的 operat = 数字 + operator的公式,因此如果想要恢复到最开始的状态,可以使用 2u普通模式下对数字文本进行递增递减操作假设我们这么一段代码var foo = 5 + i;现在希望改为var foo = 10 + i;我们当然可以使用cw 来删除5,然后在插入模式下写入10。但是这里要介绍一个新的方法——使用 Ctrl + a 来在数字文本上进行递增操作,它也是一个操作符。符合之前的公式。这里假设光标在 5 的位置,然后执行 5 Ctrl+a 来实现将5这个数字文本递增5个的操作递减操作使用 Ctrl x 。下面请各位试试这么几种情况:如果光标不在数字位置,执行 Ctrl a 会发生什么呢?假设代码中有不止一个位置有数字,光标也不在某个具体数字上,执行Ctrl + a 又会发生什么呢?当前行没有数字,在后面几行有数字,执行Ctrl a 会发生什么呢?下面公布答案如果光标不在数字所在位置,该命令会在本行往后查找第一个出现数字的地方,并将光标跳转到该处,然后执行加1的操作。花了这么多篇幅总算将普通模式下的一些操作说完了,后面将会进入按照顺序分别讲述,插入模式、选择模式、命令模式。请感兴趣的小伙伴关注一下本专栏,有想要了解的内容也欢迎留言,等我按计划更新完了我想写的内容之后会考虑安排上的,在此谢谢小伙伴的捧场
2022年04月19日
6 阅读
0 评论
0 点赞
2022-04-17
vim 从嫌弃到依赖(4)—— .命令
通过之前几篇文章的介绍,如果各位小伙伴能够勤加练习,并在日常工作上经常使用,那么相信那些内容已经会对工作效率的提升产生好的影响。但是如果那些就是vim的全部的话,我们也就没那么大的必要花这么大的精力来学习如何使用它,而且它也不会在程序员中口口相传,并且令很多程序员对它如此着迷。接下来让我们更加深入到vim中,去学习更多更好的,可以进一步提升效率的技巧Don’t Repeat Yourself. Let vim repeat it for you不要进行重复的操作,让vim替你自动完成这些重复的操作。vim之所以好用,效率高。就是它对重复操作进行了大量的优化,并且提供了一些方式方法能让你不必做重复功。而且尽量让这些方法简单易用。最简单的就是使用. 来重复上次修改(确实是够简单的)废话不多说,还是以例子来说明假设我有这样一段Python代码if user == "vim": print("vim is best!") else: print("vim is not best")我需要将第2行和第3行进行缩进,可以这么做,先使用j 移动光标到第二行,然后使用 >> 缩进代码,接着使用 2j 跳转光标到第四行,然后使用 . 重复上一次修改配合搜索命令可以完成对文本的快速修改,但是我们现在还没介绍到搜索相关操作,所以先按下不表如何定义上次修改不同的编辑器对上次修改的定义不同,有的可能是词、句子、段甚至有的可能按照输入时间来算,一段时间内的输入算作上次修改,而vim可以自己定义上次修改范围是多少。vim一般将从进入插入模式开始,到从插入模式退出这段时间内做的修改做为上次修改,或者在普通模式下将我们使用一次operat = operator + motion 公式作为一次修改,例如我们有这么一段话this is no more one line this is no more one line我们将光标移动到 第一个n 处。然后使用d2w 删除两个单词,然后再下一行再次使用. 发现它执行与上一行一样的操作在进入插入模式时,连同进入插入模式的操作一起与在插入模式下输入的内容一同被算作上次修改,例如this is only one line this is only one line改为this is no more one line this is no more one line我们可以先将光标移动到 only 的首位,然后使用 cw 进入插入模式,输入 no more 退出输入模式,接着使用j 移动到下一行,再使用 2b 移动到第二行同样的位置,最后使用 . 来重复上一次修改仅限于进入插入模式的一次操作,而之前进行的移动光标之类的操作就不再统计为一次修改。例如有这么一段代码var foot = "foot" var ball = "ball" var football = foot + bar我们要在每行的后面加上一个分号。方案一:可以先使用 $移动光标到行尾,然后使用 a 插入模式,接着添加一个分号,在下一行需要先使用$ 移动光标到行尾,然后使用. 直接使用,就会变成这样针对这种情况只有事先手动的调整光标位置,然后使用点命令。这里就不演示了针对这个例子,我们有更高效的方法,可以使用复合命令。使用A 可以直接从行尾进入插入模式方案二:使用 A 在行尾进入插入模式,节省后续移动光标的步骤通过这个例子,我们看到了使用复合命令加上. 可以极大的简化重复操作,提高效率。在这里再给出一些类似的复合命令给各位小伙伴参考复合命令等效长命令含义A$a在行尾进入插入模式I^i在行首进入插入模式oA\<CR>在下一行进入插入模式Oko(k$a\<CR>)在上一行进入插入模式S^c$删除当前行并进入插入模式Cc$删除当前光标位置到行尾的内容并进入插入模式scl删除光标后的一个字符并进入插入模式在《vim实用技巧》这本书中,作者介绍了一个实用vim的经典范式——一个键移动、另一个键操作。例如上述实用. 命令的操作中,使用j 来移动行,然后使用. 来执行操作。后续将有许多操作使用该范式。最后还是做一个总结:本篇讲述了vim中比较强大的一个命令——. 命令,它能重复上次修改。但是需要注意以下几点:上次修改是从进入插入模式开始,到回到普通模式为止这段时间内做的修改,或者在普通模式下使用一条命令进行的修改. 命令并不关心上次修改的位置,只会简单的重复上次修改。所以在使用前尽量考虑该使用哪些命令能最大限度的让. 重复更多操作。使用复合命令不光能减少输入字符数,配合. 命令将产生强大的效果
2022年04月17日
6 阅读
0 评论
0 点赞
2022-04-14
vim 从嫌弃到依赖(3)——vim 普通模式
在上一篇中,我们提到vim的几种模式,并且给出了一些基本的操作命令,包括移动光标,删除、替换操作。并且给出了几个重要的公式,理解这个公式对于理解vim和提高使用vim的效率来说至关重要。所以在这篇文章里面我打算再围绕这几个公式给出一些示例,希望能给各位理解公式提供一些帮助。行内查找字符串vim操作的效率很大程度上取决于移动光标的效率,平时在修改代码的时候很大程度上都是需要在特定位置修改,下面介绍到的操作很大程度上能提高我们移动光标和修改的效率行内查找字符使用 f{char} 来进行,即使用f后面加一个字符,会快速跳转到行内第一个出现该字符的位置,例如下面一段话vim.o.relativenumber = true假设光标位于行首的s 处,我们可以使用 fr 将光标移动到单词 字符 r出现的位置根据公式motion = [数字] + 移动光标我们可以使用 2fr 跳转到第二个r 位置我们也可以使用 t 来跳转光标到搜索的字符处,它与 f 的区别在于 f 直接跳转光标到指定字符处,t 跳转光标到指定字符的前一个位置例如使用 tr 跳转到第一个r的左边使用3tr 跳转到第三个r的左边我们可以使用 F 和 T 实现向前查找,它门跳转的规则与 f 和 t 类似,这里就不再给出具体的示例了,有小伙伴感兴趣的可以自行尝试大范围移动之前只演示了基本的行内移动和多行移动,但是多行移动是基于上述公式实现重复向下移动一行多次的。vim中提供了一些大范围移动光标的方式。H 移动光标到窗口首行M 移动光标到窗口中间L 移动光标到窗口尾行gg 移动光标至第一行G 移动光标到最后一行要演示这几个操作光靠一屏就可以显示完的简短的文本是不行的,这里我采用 ~/.bashrc 小伙伴可以随便打开一个系统的配置文件,只要它超过一屏就行假设光标在文件最后一行,使用H 将光标移动到窗口首行假设光标在文件最后一行,使用 M 移动光标到窗口中间假设光标在文件第一行,使用 L 移动光标到窗口末尾假设光标在文件的第一行,使用 G 移动光标到最后一行后面的 gg 也就不演示了,从上面这些演示来看不难发现窗口和文件不是同一个东西,在窗口中跳转只能在文件的部分区域间进行跳转,而在文件中跳转则能浏览文件中的任意行根据上面的公式,他们前面也是可以添加数字的,但是在这些操作的前面加上数字表示重复又有什么,例如gg 可以跳转到文件首行,我执行3次跳到行首又有什么用呢。要解释这个问题,我们先看一个例子例如使用 3gg 可以跳转到文件的第三行。这里我们假设光标在文件的最后一行这些算是之前将的公式含义的特例吧,他们并不表示重复,这里我仅仅列出他们的含义吧,具体该如何理解我也不清楚,暂时记住,后续会使用即可数字 + gg, 表示跳转到文件的第几行数字 + G, 也表示跳转到文件的第几行。但是我平时都使用 gg 这种跳转方式,毕竟在一个键位上按两次可比按它的大写字母要快的多数字 + L, 移动到窗口的倒数第几行数字 + H, 移动到窗口的第几行数字 + M, 与单纯的使用M 效果一样结合跳转指令的操作下面在列举一些操作符配合光标移动指令的例子,帮助大家理解例1,我们来针对之前的配置文件来做修改假设光标在 relativenumber 的词首我们可以使用cw 来删除该单词并输入number可以直接使用 dtn 来删除字符 n 前面 relative例2 将 hello world!! 改为 hello world!!!使用 2f! 将光标移动到对应位置,然后使用 a 进入插入模式插入对应字符使用 2f" 移动到行尾,然后使用i 进入插入模式插入对应字符使用$ 跳转到行尾,使用 i 进入插入模式进行修改从上面的例子来看,使用 f t 之类的指令相比使用 l、w 更加高效,毕竟数单词个数和字符格式是很低效而且容易出错的例3:将 "hello world" 改为 "nice to meet you"我们假设光标位于h处使用 d2w 删除两个单词并进入插入模式使用 dt" 删除对应单词,然后进入插入模式使用 ci" 删除对应字符并进入插入模式文本对象看到这里,肯定很多小伙伴会有一脑袋问号,这个 i 是什么东西,i 不是进入插入模式嘛,为什么我光标在行首它也能准确的删除引号内的字符呢。这就涉及到vim中一个非常重要的概念——文本对象还记得最开始我们说过,vim将文本分为 字符、单词、句子、段落嘛,这可不是为了方便而人为划分的,而是vim在处理文本的时候就是真么做的。文本对象是vim 描述这些划分的。文本对象只能跟在 operator 后,由 a 和 i 开头,后面跟文本范围来组成,表示我们要针对哪个范围的文本进行何种处理。其中 i 表示 inner 不包含表示范围的字符, 而 a 会包含表示范围的字符。例如上述例子中,如果使用 i 则会保留 " ,使用 a 则不会保留。感兴趣的小伙伴可以自行尝试。下面给出各种文本范围的表格文本范围代表含义wword 词ssentence 句pparagraph 段ttag(HTML/XML) 标签[或]由[]包裹的部分(或)由()包裹的部分<或>由<>包裹的部分{或}由{} 包裹的部分"由""包裹的部分'由''包裹的部分\`由\`\`包裹的部分文本对象看似抽象,实际上只需要多使用几次基本就能掌握它了。熟练掌握它之后,将会大大提高我们编辑文本的效率接下来让我们再给出一个最后的例子,并且以本示例来结束该文假设有这么一段文本<div class = "example"> <div> This is vim example</div> </div>我们希望将其变为<div class "example"> vim is so good </div>我们将光标移动到最外层的div上,然后使用 cit 删除div中的内容,然后输入 "vim is so good"
2022年04月14日
6 阅读
0 评论
0 点赞
2022-04-12
vim 从嫌弃到依赖(2)——vim 模式
在上一篇文章中我们获取到了neovim 并对它进行了基础配置。现在已经具备一般编辑器的基本功能了。让我们先学会如何使用vim基本功能进行编辑,后面再看如何进行配置,以达到某某IDE或者编辑器的效果vim 为何高效这里我们先聊聊vim为何高效。一般进行编辑工作,不管是使用Word,记事本,写PPT,对于文本的操作无外乎这么几种操作移动光标到指定位置输入删除替换(删除 + 输入)而vim之所以高效就是将这几个部分分解为几个模式,不同的模式针对这些场景进行了一些优化。下面是几个简单的示例将多行文字合并为1行删除前5行将每行后面的数字+1这些操作先卖个关子,暂时不去管他们,接下来简单说说vim的几种模式,然后了解一下移动光标的一些命令,最后提供一个能描述vim操作逻辑的公式vim的几种模式vim主要分为一下几个模式普通模式 (normal mode) 不出意外的话,在使用vim的时候大部分时间停留在普通模式下,并且很多操作都是在普通模式下完成的,例如上述的几个例子全都是在普通模式下完成的。移动光标、切换模式都是在普通模式下进行的插入模式 (insert mode) 插入模式主要用来编辑文本,在该模式下输入的字符都会作为文本的一部分进行保存,在该模式下可以进行文本的编辑操作可视模式(visual mode) 该模式主要用来选择一部分文本,实现的功能跟用鼠标选中一段文本一样,后续可以输入命令针对被选中的文本进行处理命令行模式(command mode) 可以在普通模式和可视模式下输入 : 进入命令行模式,严格意义上来说,它并不是一个真正的模式。许多复杂的操作其实都可通过一个简单的命令来完成。在命令行中,我们可以执行 vim 自带的命令,也可以执行自定义的命令(例如很多插件都有一些自定义命令)。例如使用 :w 来将缓冲区中的内容写入一个文件中,或者使用:q 来退出vim。vim 移动光标的几种方式移动光标可以说是vim 中所有操作里面最基础的操作了。因为 删除, 输入 和 替换 这三个操作都是以光标所在位置为基础做的。可以说,高效的文本处理大多依赖于光标移动的效率,而如何高效的把光标移动到 “目标” 处是一个不小的学问。一般来说普通的编辑器移动光标的方式都是通过手去移动鼠标,通过鼠标来定位到光标要移动的位置,这么做并不高效。原因是在移动鼠标的过程中涉及到将手由键盘移开,将手放到鼠标上、找到对应位置然后移动光标,最后再将手由鼠标移动到光标上。这些动作不仅打断了键盘输入,同时也打断了我们输入的思路。要做到高效移动光标首要的就是手不要离开键盘(尽量不要大范围的移动手)。vim 的普通模式完美的解决了这个问题,在普通模式下提供了丰富的操作来移动光标,下面列举一些常用的h: 向前移动一个字符l: 向后移动一个字符j: 向下移动一行k: 向上移动一行b: 向前移动一个单词w: 向后移动一个单词e: 移动光标到单词尾部^: 移动光标到行首第一个非空字符处$: 移动光标到行末最后一个非空字符处gg: 移动光标至文件首行的首个非空格字节G: 移动光标至整个文本最后一行的首个非空格字节()%: 移动光标到匹配括号的另一端0: 移动光标至行首说句题外话,vim 使用 h j k l 来代替 ← ↓ ↑ → 主要是因为当年创建 vi 的时候键盘张这样如果仅仅使用上述介绍的内容进行移动光标,一次移动一个字符、一个单词、一行,这效率也太低了,无法处理需要大幅度跳转光标的需求。这里介绍一个公式数字 + 移动光标例如上述介绍的移动光标的方式都可以采用这个公式。前面的数字表示按同意的操作移动光标的次数,例如 2w 表示向后移动两个单词,3j 表示向下移动3行。我们把这个公式总结为motion = [数字] + 移动光标上述公式可以理解为 motion就是定义了如何移动光标vim 基础操作之删除和替换移动光标之后,接下来应该就是进入输入模式进行输入操作,但是这里我们先不谈输入模式。其实在忽略在输入模式下的各种操作技巧,输入模式中剩下的就是输入各种字符完成输入操作,相对比较基础,这里先不谈它。我们先来说说在普通模式下的删除和替换操作。删除操作使用 d(你可以理解为英文单词 delete 的首字母),替换操作使用 c(也就是 change)我们输入 d 或者 c 发现操作卡住了,其实这个时候vim在等用户输入对应的范围即 motion ,表示针对哪个范围的文本进行该操作,这里我们引入第二个公式operate = operator + motion公式可以理解为,一个操作等于我们想要多多大范围的文本进行何种操作。例如cw 表示针对一个单词进行替换操作,d2w 表示对光标后2个单词进行删除操作,这么写也比较符合我们平时使用的日常语言,例如 d2w = delete 2 words (删除两个单词)示例: 使用 c2w 删除两个单词并进入插入模式示例: 使用 d$ 删除光标后至行尾的所有内容其实类似 d 和 c 的操作还有很多,例如\>: 右缩进<: 左缩进=: 自动缩进y: 赋值p: 粘贴gu: 变为小写gU: 变为大写g~: 反转大小写示例:使用>G 将当前行至文件尾部的代码进行缩进我们也可以在 operator 前添加数字,表示执行操作重复次数,这里我们的公式就可以进行改写operat = [数字] + operator + motion例如2dw 表示删除一个单词并将该操作执行两遍。它与前面演示的 d2w 能达到相同的操作,但是含义不同。d2w 表示一次删除两个字符。理解了这个,这里我提出一个简单的问题 2d2w 的等效操作是哪两个呢,欢迎评论区给出。以行为单位的操作例如我们要删除一行,根据以上学习的内容可以想到使用 dj ,但是实际尝试的时候发现它删除了两行。我们还可以想到先使用 0将光标移动到行首,然后使用 d$ 删除整行,但是会发现它会留下一个空白行。如果想针对行本身进行操作的话,需要将同样的操作同时按两下,即dd 表示删除一行,>> 表示缩进当前行。这里我们可以扩展一个公式operat = [数字] + 2 * operator即重复按下两次同样的操作命令表示针对行进行操作,前面加上数字表示重复多少次。举几个例子5dd 删除5行4>> 将4行代码进行缩进2cc 更改接下来的两行,并进入插入模式最后的总结本篇到这里就结束了,最后做一下总结,我们提到几个公式motion = [数字] + 移动光标 operat = [数字] + operator + motion operat = [数字] + 2 * operator根据这些公式我们可以根据具体情形自由发挥想象。它是vim的基础也是体现它高效的一个地方。另外还介绍了一些常用的移动光标的方式和常用的操作符,这里再次将他们列举出来以供查阅几种常用motionmotion含义h左移j下移k上移l右移动w向后移动一个词b向前移动一个词e移动光标至词末$移动光标至行末0移动光标至行首^移动光标至本行首个非空格字节gg移动光标至文件首行的首个非空格字节G移动光标至整个文本最后一行的首个非空格字节()%移动光标到匹配括号的另一端几种常用操作符operator含义c修改,删除当前并切换到insert moded删除,该命令与motion配置使用,表示删除光标移动过的所有内容>右缩进<左缩进=自动缩进y赋值p粘贴gu变为小写gU变为大写g~反转大小写
2022年04月12日
6 阅读
0 评论
0 点赞
2022-04-08
vim 从嫌弃到依赖(1)——安装和定位vimrc
在上一篇文章中,我们简单开了一个头,阐述了下学习vim的必要性,这章开始,会慢慢由浅入深的学习它的一套完整的,高效的文本编辑方式方法。废话不多说,咱们正式开始吧安装NeoVim相对于vim来说,neovim更加现代化,配置也更加友好。而且之前vim相关配置可以很容易的就移植到neovim上。对于mac平台来说,可以使用homebrew来安装brew install neovim对于linux平台来说,neovim支持现有的软件包管理工具,例如针对debian及其衍生系统来说可以使用apt install neovim对于其他发行版Linux来说,请参考neovim的官方网站来确定如何安装针对windows平台,可以使用// 使用Scoop scoop install neovim // 或者chocolatey choco instal neovim然后可以在终端中使用nvim 来打开,但是由于我之前大量使用vim,在习惯上仍然喜欢输入vim启动,因此这里我使用别名来将vim映射为nvimalias vim='nvim'使用vimrc进行基本的设置刚开始为了后面使用方便,需要对vim进行一些基础配置,这里的配置也是为了日后更好的使用vim相关功能而必须要进行的配置macOS 和 Linux上neovim配置文件位于~/.config/nvim/init.lua,Windows上的配置文件位于C:/User/用户/AppData/Local/nvim/init.lua。这里我们也可以将文件名改为init.vim这样我们可以使用vimscript,.lua可以使用lua语言进行配置。这里给出vimscript和lua的最基础的配置" vimrc 配置 set number "设置行号 syntax on " 打开语法高亮 set relativenumber "设置相对行号 set nocompatiable "设置与vi不兼容 set wrap "设置自动换行 set ruler "设置右侧底部显示输入命令 set incsearch "设置搜索高亮-- lua配置 vim.o.syntax = "enable" vim.o.relativenumber = true vim.o.wrap = true vim.o.ruler = true vim.o.incsearch = true好了,这次就到这里结束了。不要着急,这只是一个开胃菜,后面将陆续介绍相关技巧
2022年04月08日
4 阅读
0 评论
0 点赞
2022-04-04
vim 从嫌弃到依赖(0)——概述
最近我想开一个新的系列,记录我使用vim的相关心得。初次接触vim是在大学操作系统实践课程中,跟着Linux一块进行学习的。当初我是百般嫌弃它的,想要进行编辑还要按下其他键,我想要移动光标居然还的切换到普通模式下,这些种种我一直认为是反人类的。后来经过无数次的尝试、放弃、再尝试的过程,如今我已经离不开它了,不管用何种编辑器、用何种IDE,我首先会找是否有相关的vim模拟插件。这个文章标题也是我使用vim的心路历程,我采用这个标题,也是希望我写出来的文章,能给我的读者带来一些帮助,使各位读者也能像我一样从恶语相向到爱不释手。当我们在谈论vim的时候我们在谈什么什么是vim?通过各种百科它会告诉你vim是由vi发展而来的,然后会告诉你vim分为好几个模式,给出一堆命令,例如如何移动光标、如何切换模式、如何搜索等等一系列vim命令。但是这些仅仅只是皮毛上的东西,远远无法告诉我们,为什么要选择vim。我觉得当我们谈论vim的时候,应该要谈论如何使用vim提高编程的效率,一般来说是指快速定位代码,快速修改代码、避免一些繁琐的重复工作等等一系列方式来提升工作效率。以达到编程的速度跟得上思维的速度,即快速将脑海中的想法通过代码展示出来。所以我这里不打算像一般的vim教程那样上来就是一堆命令,告诉你如何进行普通的文本编辑。或者告诉你该使用哪些插件来扩展你的vim,让它像某某编辑器一样好用。以我来看,这些都是邪路,有那个时间去折腾如何将vim变成某某IDE,不如直接使用那个IDE,还能节省大量时间。如果仅仅停留在了解vim的基本命令,将vim作为记事本来使用,那么vim也就失去了它的价值。vim的操作逻辑不管使用何种工具来编写文本,键盘操作总是比鼠标要高效的,即使是使用word和excel完成工作的人,熟练使用各种快捷键的总是会比使用鼠标点选各种功能的要快的多,但是像word、excel或者其他IDE来说,功能实在太多,这样就导致需要映射的快捷键过多,很快键盘上的键就不够用了,这个时候部分编辑器选择只映射常用的,而另外的编辑器则选择增加快捷键的层数,一层不够就两层、两层不够久三层,这个emacs就是典型的例子。而vim为了有效键位映射到足够多的快捷键上,使用了各种模式,各种模式相互独立,完成不同的工作,这样有几个好处:在普通模式下,键盘上的键不再作为输入键,可以针对常见操作进行键位优化,不用长时间按住ctrl了可以提供更多功能,可以方便的进行扩展,基本最顺手的键位就是最常用的键位关于vim的一些说法1. vim上手难度高,学习曲线陡峭vim其实学起来并不难,很多人觉得难主要是因为:vim官方的教程又臭又长,以它来作为学习的资料,在初期会显的啰嗦,而且很多内容不知道该如何在日常中去运用,导致理论与实践脱节vim 中有大量的快捷键、模式要记忆,很难像普通编辑器那样开箱即用vim编辑器的逻辑与其他不同,需要长时间练习以便形成肌肉记忆vim有众多插件,而且插件文档质量参差不齐。很多文档都没介绍使用它能带来如何的效率提升2. vim不如其他编辑器(不如emacs、不如visual studio code)很多人都说vim是上个世纪的老古董,不如现如今一些现代编译器好用。从某种程度上来看,确实是对的,毕竟世面上有那么多的如何将你的vim变成visual studio code、变成idea等等一系列教程。但是还是那句话,我们学习vim并不是学习如何查找、下载、配置各种插件,万物都用vim来进行。而是取其精华,学习它一整套操作逻辑,以便提升自己的编码效率。至于像调试、一键部署、等等操作,这个都不是vim擅长的。记住vim擅长的仅仅只有文本编辑而已。3. 学习vim浪费时间现在有很多很好用的IDE,他们提供了例如代码补全、代码跳转等一系列好用的功能,而最原始的vim无法提供这些功能,得折腾一些配置和插件才能勉强达到其他IDE 60%到70%的功能。vim已经没必要学习了。作为程序员,应该时刻想着如何偷懒,如何提高个人工作效率,以便早早完成工作,按时下班,保证充足的摸鱼时间。为了这个目标,就有必要稍微花点时间研究如何提升如何使用现有工具,如何更好的使用现有的IDE。而vim作为现在业界公认的文本输入的最佳效率工具,对于想提升自己编码速度的程序员来说,很有必要花时间研究、学习它。最后一些说明本教程致力于通过vim的学习,学会一些高效的文本操作术。如何使用一些技巧来提升输入效率。而不会讲述如何将vim配置成ide。本教程合适一些有编程经验,而不是刚入门的编程萌新,对于刚入门编程的萌新来说,现阶段最要紧还是巩固相关基础。由于本人用macos做主力机,所以本教程将采用macos作为演示,针对Windows上的用户,有些操作可能跟windows自身快捷键冲突,或者Windows vim本身的问题,导致有些操作不支持的,目前我也不太清楚。就写作之时,使用的vim为neovim。好了开坑相关说明已经完成,后面就是正式进入vim之旅了。。。。
2022年04月04日
6 阅读
0 评论
0 点赞
1
...
5
6