【Vim 编辑器 入门指南 (上)】用思维的速度写程序

Vim 编辑器 入门指南 (上)

思考速度多快 写程序速度就多快

目录

  • 前言
  • 什麽是 Vim ?
  • 三点好处与坏处
  • 安装 Vim 插件
  • 简单的文本编写
  • 分页与导航
  • 光标移动与定位
  • 插入模式指令
  • 普通模式指令
  • 前置条件

前言

Vim 编辑器的内容,多到可以独立的出一本书来说明。

例如我看过的 「Vim 实用技巧」一书,影片内的部分知识就是取自於此。

这次除了 编辑器的好坏处比较以外,後面指令说明的部分,只会就简单的文本编写动作的延伸介绍。

其他的可视模式、命令行模式、剪贴簿、书签、巨集的功能部分

Vim 编辑器 入门指南 (下) 会继续说明。


什麽是 Vim ?

通常想要提升开发速度的开发者,都会熟记 IDE 的快捷键,以减少手部离开键盘操控滑鼠的时间。

Vim 就是一种:

不使用「滑鼠」,只使用「键盘」的文字编辑器

键盘上的每一个按键,都代表了一种指令 ; 这些指令,就像是语言一样,有自己的语法与逻辑。

001.cmd-mean

熟练地掌握

可以让你用最少的动作 完成最多的事情

三点好处与坏处

依据我这些年使用的开发经验,个人认为 Vim 的编辑器有「三点好处」与「三点坏处」

三点好处

好处一: 速度快

  • 开启档案快

  • 编辑速度也快

    也就是开发速度快

如果是一个非常小的修改任务

使用终端机: 找到目标 -> 开启档案 -> 编辑 -> 修改 -> 完成

这一套流程,可能 IDE 才刚跑完 启动的画面


好处二 : 精准

我希望 :

  • 游标移动到,开头数过来的第三个变数

或者

  • 选取 以双引号为分界的文字字串
大脑想要的编辑动作 -> 键盘精准达成
(不需要滑鼠手眼协调才能大致定位)

002.keyman


好处三 : 酷

身为专业的开发者,肯定是希望「快捷键」高速连按。如此才能满足想像中「骇客」的模样 :

对着黑屏白字的「终端机」,键盘高速连打。

003.hacker


三点坏处

坏处一 : 中文输入不方便

所有的编辑指令,都必须在英文的输入法下才能作用。

如果编辑的文件中有中文的部分,就必须要常常进行输入法的切换。

造成影响

  • 在 Mac 平台 : 觉得还好 -> 因为输入法的切换,几乎没有停顿
  • 在 Windows 平台 : 会被放大 -> 因为切换时,必须要有个明显的停顿点,系统才会顺利的切换
有时候,
指令如果下得太快,没有切换成功,
就会在中英文的交界处,发生严重堵塞。
(此时你可能就会开始思考人生的意义)

坏处二 : 不适用 Windowns 平台

就使用经验而言 Vim 在 Windows 平台不太好用,除了刚才的输入法问题以外

想要使用 Vim ,虽然有 GVim 图形介面可以安装,但相比於 Mac 与 Linux 终端机的各种操作与指令工具,两者还是有很大的差异。

所以我在 Windowns 的平台,不会硬要用终端机来作业

只会在 IDE 安装相关插件

坏处三: 学习曲线高

Vim 的指令与指令之间,可以互相的组合与搭配

彼此的关系并不是,一对一 或者 一对多,而是 多对多的状态

004.cmd-group

要了解这些指令执行後 ,会做了些什麽样的动作,然後前方与後方可以再搭配什麽样的指令

方能在编辑时:

选择最佳的组合 -> 精准且快速的完成目标

安装 Vim 插件

要使用 Vim 的编辑器,如果是 Mac 或 Linux 系统,开启终端机可能就有。

但如果是 Windows 的系统,个人建议可以使用 ,上一部影片介绍的 IntelliJ 安装 Vim 插件 :

  1. 在设定 > 插件 的地方,搜寻 IdeaVim
  2. 安装该插件 以及扩充 IdeaVimExtension

005.IdeaVim

系出同源

  • Android Studio : Android 开发
  • PyCharm : Python 开发

同样可以安装


设定插件快捷键

将 vim 插件的快捷键,设定成: cmd + opt + 1

006.keymap

初期开发时,遇到不熟悉的指令,可以先切回来,用原本的方式完成任务。


简单的文本编写

指令流程

指令操作的部分,建议看影片会比较容易了解

  1. 开启 终端机
  2. 指令 vim VimSE.txt (档案名称)
  3. i 插入模式
  4. 输入一些文字 : Hello World
  5. ESC 退出
  6. :w 储存
  7. :q 结束

Vim 指令

vim {档案名称}

ex: vim VimSE.txt 

使用 vim 的编辑器开启 VimSE.txt 档案

007-1.cmd-vim

开启时,会有两种情况 :

  • 档案已经存在 -> 直接开启
  • 档案尚未存在 -> 储存後,档案建立

普通模式

vim 指令输入後的画面,是 Vim 的「普通模式」, 也是编辑器的预设模式

方向键上下左右,可以移动光标。

007-2.normal-mode

但与多数的编辑器不同输入任一按键并不会出现文字。这个是 Vim 独特的地方,它具有多种模式

各种强大的编辑指令都是藉由此模式(普通模式)的状态,进行指令下达

插入模式

一般常用的文字编辑状态,在 Vim 中称之为「插入模式」

按键 i 进入该模式,进入後左下角的部分,会出现了 INSERT 的 文字

010.insert-mode

输入完想要输入的文字以後,按键 ESC 就可以退出这个模式,回到的地方就是预设的普通模式


命令行模式

编辑完成了,输入 冒号 (:) 左下角的部分, 也出现了一个冒号

011-1.command-line-mod

这个是 Vim 的「命令行模式」, 可以像终端机一样输入指令

:w

w 代表的是 存档(write)

:q

q 代表的是 离开(quit)

:wq

两者可以结合起来,代表存档後离开


延伸功能

到了这一步骤,已经可以安全地从编辑器离开

未来如果在一个不得不使用 vim 的情况下,例如:

  • 连线进 linux 主机 编辑配置档案

    你已经掌握最少可以行动的知识

但我想你要的不仅仅是可以动就好。


说好的快跟精准呢 ?

简单的编辑一个档案,还要经过三个模式,有够麻烦。

接下来就会说明刚才流程中,还可以使用的其他进阶功能。

011.oper-extend


分页与导航

如果对 vim 的操作没有概念的话,同样建议看影片会比较容易了解

012.cmd-vim

Vim 指令

  • vim {档案名称}
  • vim . 清单列表

开启其他档案指令

  • : e {档案名称}
  • : e . 清单列表

分页指令

  • : tabe {档案名称}
  • : tabe . 清单列表

切换分页指令

  • 下一页 : g t
  • 上一页 : g T

关闭分页指令

两者皆可

  • : close
  • : clos

光标移动与定位

普通模式下使用

基本的光标移动

光标的移动,除了方向键还可以使用小写 h j k l 移动

007.move-hjkl

  • h 与 l 分布在两侧, 分别是 左 与 右
  • j 跟 k 则是 下与上

方便的记法

j 看起来 像是箭头 下, 所以 j 是 方向键 下, k 则是 方向键 上

善用普通模式的方向键

可以让你的双手,随时保持在键盘的中央,而不会歪斜在右下角。

008.keyboard-center

当然一切还是以你的习惯为基准,不要为了用而用, 
偶而使用方向键,也不是什麽大不了的事。
(书籍 : Vim 实用技巧 建议)

也听说过有人把,方向键改成 wsad 第一人称游戏的移动方式

009.move-wsad


基本的光标移动 + 数字

通常 vim 的指令,前方都可以加上数字来指定执行的次数

hjkl 就是光标移动的指令,所以也可以加上数字来搭配使用

例如

  • 10j 向下移动 10 行
  • 10k 向上移动 10 行
  • 5l 向右移动 5 个字元
  • 5h 向左移动 5 个字元
个人是常常使用 11j 22j 33j 或者 11k 22k 33k
重复的两个数字加上方向,用来当作翻页的功能

光标垂直移动与定位

当然 vim 编辑器,并不是主要以这种方式移动,也有一些指令可以让你一步到位

页面定位

  • 页面底端 : G
  • 页面顶端 : gg

翻页指令

  • 向下半页 : control + d
  • 向上半页 : control + u
  • 向下整页 : control + f
  • 向上整页 : control + b
  • 向下一行 : control + e
  • 向上一行 : control + y

光标定位

  • 置中 : zz
  • 行首 : zt
  • 行尾 : zb
  • 画面顶行 : H
  • 画面尾行 : L

跳转行数

  • : {行数}
  • {行数} G

为什麽会有两种方式 ?

个人认为
冒号加数字是普通模式下,一般操作比较直觉好用
数字加G则是使用在录制巨集时,为了输入的连贯性避免进入到其他模式,造成操作的混乱情况

查找指令

  • / {查找文字}
  • 下一个 : n
  • 上一个 : N

光标水平移动与定位

假设已经找到目标行数了,接下来就是要使用光标的水平移动指令

水平移动指令

  • 移动到最後 : $
  • 移动到最前 : 0
  • 移动到最後(忽略空格符号) : ^
  • 移动到最前(忽略空格符号) : g_
  • 单字开头 : w
  • 单字结尾 : e
  • 上一个单字开头 : b
  • 单字开头(以空格符号为基准) : W
  • 单字结尾(以空格符号为基准) : E
  • 上一个单字开头(以空格符号为基准) : B

字符查找指令

  • 移动到字符 : f
  • 移动到字符前一格 : t
  • 反向移动到字符 : F
  • 反向移动到字符後一格 : T
  • 重复上一次的查找指令 : ;

example:

  • 3w -> 移动三个单词
  • 3fa -> 移动到第三个 a 的字符
至此光标垂直与水平移动的指令,已经可以绝大多数的取代滑鼠的功能(起码可以比滚轮的作用更加精准)

插入模式指令

要像滑鼠点击哪里,就可以从哪里开始编辑一样直觉。

光标移动指令加上插入模式 i 指令,两个以上的组合指令,并不是一个直觉的方法。

除了 i 指令, 可以进入该模式以外,还有以下可以指定进入模式的方法

进入插入模式指令

  • 光标位置 : i (insert)
  • 光标後方 : a (append)
  • 光标下方 : o (open)
  • 取代字符 : s (substitute)
  • 取代文字 : c (change)

取代文字 example:

  • cw -> 替换一个单词
  • c$ -> 替换到结尾的文字
  • cf" -> 替换到第一个引号

大写的指令

  • 当前的行首 : I
  • 当前的行尾 : A
  • 当前的上一行 : O
  • 取代整行文字 : S
  • 取代到行尾 : C ( 等同於 c$ )

退出插入模式

  • ESC
  • control + [

普通模式指令

普通模式要延伸补充的,是尚未归类到上方的分类,但又不得不提非常有用的指令。

  • 删除字元 : x
  • 删除前一个字元 : X (普通模式的退格键)
  • 取代字元 : r (replace)
  • 取代模式 : R
  • 删除单行文字 : dd
  • 拷贝单行文字 : yy
  • 贴上文字 : p
  • 光标的上方贴上文字 : P
  • 缩排 : > >
  • 反向缩排 : < <
  • 重复上一次的指令动作 : .
  • 恢复 : u (undo)
  • 重做 : control + r (redo)
  • 一次性恢复单行指令 : U

数字递增与递减

  • 递增 : control + a
  • 递减 : control + x

前置条件

此篇先只着重在简单的文本编写相关功能的延伸上,後续的可视模式、命令行模式
以及跟寄存器功能相关的剪贴簿、书签、巨集,会在下一篇章中接着介绍。

013.next-content

我觉得光是前面说明的指令部分,应该就需要花一些时间消化吸收。


在更近一步说明之前,关於发挥 Vim 编辑器的威力,

还有一个更重要的前置条件必须要具备 :

那就是「盲打的能力」,也就是打字的时候不用看着键盘

假设输入 Vim 的指令时,视线还要来回於键盘和萤幕之间,即便 指令背的在熟,速度也快不起来。


提供一个, 我刚开始练习时 找到的简单方法 :

打开编辑器,键盘 a 到 z 的顺序,以百次为单位练习, 
每天练习 3 ~ 5 次,刚开始速度不用快,
先追求每次的正确性,逐渐熟悉後,速度自然就会起来。

014.practice-typing

一个礼拜的练习,应该就能很快看到效果。


参考资料

官方教程

  • 指令: vimtutor

维基百科

https://zh.wikipedia.org/wiki/Vim

简明 Vim 文字编辑器操作入门教学

https://blog.techbridge.cc/2020/04/06/how-to-use-vim-as-an-editor-tutorial/

简明VIM 练级攻略

https://coolshell.cn/articles/5426.html

书籍

  • Vim 实用技巧

<<:  新手任务

>>:  迟迟无法在Google搜寻到我的网站

【领域展开 10 式】真的需要看教学文,正式启用布景主题 Soledad 与网站做绑定

购买後需详阅公开声明书 会下这标题的原因是,主题真正购买後的安装设定,真的需要参考网路文章才能少走很...

Day 31 DEV TOOL

在开发时,总缺少不了 bug 的存在, 那如何 debugger 就是所有开发者都很在意的问题了, ...

【第十九天 - Binary Tree题目分析】

先简单回顾一下,今天预计分析的题目:94. Binary Tree Inorder Travers...

Day-12 函式与变数

承前文,在函式中的结构中,包括变数。使用变数,就须宣告,因此宣告所及的范围(Scope)成为函式、乃...

Day6# 流程控制

在第六天开始前,先祝各位朋朋中秋节快乐! 在写程序时,时常必须根据不同的状况做出不同的对应机制,而处...