【Vim 编辑器 入门指南 (下)】用程序来写程序

巨集 x 寄存器 x 命令行模式

目录

  • 前言
  • 可视模式
  • 剪贴簿指令
  • 书签指令
  • 巨集指令
  • 命令行模式
  • 终端机

前言

延续 Vim 编辑器 入门指南 (上)

文章

https://ithelp.ithome.com.tw/articles/10255325

影片

https://youtu.be/Yk4s-WLjxug

接着说明 Vim 编辑器 :

  • 可视模式 (选取功能)
  • 剪贴簿指令
  • 书签指令
  • 巨集指令
  • 命令行模式

其中搭配「寄存器」一起使用的「巨集」功能,以及命令行模式的指令工具。

可以让程序来帮你写程序,有效的提高开发效率。

可视模式

滑鼠,除了垂直移动、水平移动与定位编辑的功能以外,还有一个最常使用的功能是「文字的选取」。

按键 v 指令 左下方出现 VISUAL,代表的是「可视模式」或者「视觉模式」

001.visual

在这个模式中,方向键上下左右,可以扩大选择的范围


可以搭配使用,先前光标水平与垂直移动的方法

  • vw : 向後选取一个单字
  • vt" : 向後选取到 引号的前一格位置

不过这种方式,对於 :

光标的初始位置有精准的要求

日常开发中 使用上不是那麽的方便。


vi / va 指令

这种情况可以使用

「 viw 」指令

  • v 是 选择模式
  • i 是 inner 内部
  • w 是 word 单词

三者构成的意思 :

就是选取一个单词,不管光标是在单词的哪一个位置。

「 vaw 」指令

  • v 是 选择模式
  • a 是 「 a 」 一个
  • w 是 word 单词

三者构成的意思 :

也是选取一个单词,不管的光标的位置,
只不过这个指令,会再多选取包含空格的部分。

以 vaw 的指令来看,适用的场景并不是很多,但可以将 va 与 vi 当成一组独立的指令。

文字被符号包覆

001-1.symbol
小括号 () 中括号 [] 大括号 {} 单引号 ' 双引号 "

vi) -> 选取括号内的文字

001-2.symbol

va" -> 选取包含引号的文字

001-3.symbol

「 i 与 a 指令」之前,加上数字

「 v2i) 」 -> 选择第二层的小括号范围

「 vit / vat 」指令
t 代表的是 tag

网页 html 文件中的 xml 标签格式:

「 vit 」-> 两个标签中的文字
「 vat 」-> 包含标签的整个元素

选择模式「三种状态」

小写 v 指令

选取以字元为单位

大写 V 指令

以行为单位,左下方出现的是 VISUAL LINE

001-5.visual-line

选取方式,仅可以使用垂直的移动指令。

例如:

「 V3j 」-> 向下选择 3 行 
「 ggVG」-> 全部选取

control + v 指令

垂直的方向进行选取

个人是认为这个指令使用起来并不是那麽的直觉,如果是在 IDE 中,我通常会用 IDE 的游标扩展功能。


例如 :

IntelliJ 的 opt 两次 + 方向会较为直觉并且容易使用

002.IntelliJ-N-Edit


剪贴簿指令

选取文字後,常见的编辑指令

  • 「 c 指令 」 取代
  • 「 d 指令 」 删除
  • 「 y 指令 」 拷贝
  • 「 p 指令 」 覆盖

其中的「 d y p 」剪贴簿指令,普通模式延伸 :

  • 「 dd 指令 」-> 可以删除单行文字
  • 「 yy 指令 」-> 可以拷贝单行文字
  • 「 小写 p 与 大写 P 指令 」-> 在不同的位置贴上

搭配光标的移动指令组合使用

  • 「 de 指令 」 -> 删除一个单字
  • 「 y$ 指令 」 -> 拷贝到结尾的文字
  • 「 yt" 指令 」 -> 拷贝到引号前一格的字元

寄存器

registers

使用的方法:

剪贴指令前方再加上「引号」与 「任一 a 到 z 的小写字母」或者 「数字 0 ~ 9」

003-1.clipboard-register

例如 :

"q3yy -> 将拷贝的 3 行文字内容,保存到 q 的寄存器位置

003-2.register-text

取用寄存器方法

"qp -> 贴上 刚才拷贝的 3 行文字

大写的英文代号

"Qyy -> 追加寄存器代号 q 的内容
"qp -> 贴上的除了原始的三行文字还多了刚才拷贝的文字

书签指令

就像阅读书籍的书签一样,可以先在特定的位置做上标记後,使用指令快速到达定位

004-1.bookmark

这个功能必须搭配,方才说到的寄存器一起使用:

「 m 指令 」代表的是 mark,然後在加上任一 「 a 到 z 的小写字母 」或者「 数字 0 ~ 9 」

004-2.mark-register

例如 :

「 mq 指令 」 -> 当前的光标位置,纪录在 q 的寄存器中

移动到其他的位置,想要快速地跳回刚才的地方

「 `q 指令 」-> 跳回刚才的位置 (间格号「 ` 」 : 键盘左上,Esc 下方)

跨档案标记

小写字母的标记仅限於该档案,如果要跨档案的标记定位,则可以使用「大写的字母」

例如 :

「 mQ 指令 」-> 当前的文档的光标位置,纪录在 Q 的寄存器中

切换到其他的档案时 :

「 `Q 指令 」-> 跨档案的移动到刚才的位置

回到上一个位置

如果移动後发现位置不对,想要回到刚才的编辑位置

「 `` 指令 」-> 刚才的位置与跳转的位置进行快速切换

个人习惯

「 `T 指令 」-> 定位在代办清单,列表中的当天日期 (T - todo,list)
「 `N 指令 」-> 定位在最近作业的文件中 ( N - recent)

键盘上总共有 26 个字母加上 10 个数字

004-3.mark-keyboard

日常开发,数量绝对够用

编排一下就会获得在专案文件中瞬间移动的能力!

巨集指令

录制编辑指令,批次执行的编辑动作

「 q 指令 」後方加上「任一 a 到 z 的小写字母」或者「数字 0 ~ 9」

005-1.macro-q

例如 「 qq 指令 」,下方出现「 recording @q 」代表开始纪录指令的执行动作

005-2.macro-recording

在录制时,开头与结尾的位置是特别需要注意 :

开头「 数字 0 指令 」 -> 移动到最前,预先做一个位置校正的动作。
结尾「 0j 指令 」 -> 移动到下一行的开头,为了下一个指令的执行。(执行巨集时才能指定执行的次数)

完成指令的输入以後,再使用一次 「 q 指令 」 结束巨集的录制。


执行寄存器内的巨集

「 @q 指令 」 -> 可以执行一次
「 @@ 指令 」 -> 重复上一次的巨集动作

追加指令录制

使用按键 q 指令 加上大写 Q 就可以补上方才缺少的指令

「 qQ 指令 」 -> 追加代号 q 的巨集指令

005-3.macro-Q

如果录制时忘记加上逗号或者忘记换行,此时就不用重新录制一遍。

005-4.append-cmd


命令行模式

补充 5 个 常用的指令

006-1.comman-line

01. 文字的替代功能

将当前行中第一个旧的文字取代成新的文字

:s/{旧的文字}/{新的文字}
  • s 代表 substitute

将取代文字的动作,作用於整行文字

:s/{旧的文字}/{新的文字}/g
  • g 代表当前一整行的范围

将取代文字的动作作,用於整份文件

:%s/{旧的文字}/{新的文字}/g
  • % 表示当前的档案

搭配 大写 V 行的选取模式

选取後 输入冒号 (:),下方出现这组符号 「 :'<,'> 」输入相同的指令 「 : s/oldText/newText/g 」

替换的文字就只会作用在选取的范围上


02. 提取文件内容的功能

:r {档案路径} 

例如 :

同目录的 Parameter.txt 文件

「 :r Parameter.txt 」-> 不需要切换文本编辑器,就可以继续编辑。

Vim - Live Template

搭配上一个「 文字替代指令 」(:s) ,就可以当成是 vim 编辑器的 Live Template

预先写好许多常用的模板 :

  • r 指令 导入
  • s 指令 取代

03. 复制指定行数

两种情况:

「 :{行数}t. 」 -> 复制单行的情况
「 :{起始行数},{结束行数}t. 」复制多行的情况

例如 :

「 :6t. 」 -> 复制第 6 行的文字内容
「 :6,8t. 」 -> 复制从第 6 到第 8 行的文字内容

使用这个指令

可以让拷贝的动作更加精准,而且也不用光标来回移动,减少多余且繁琐的作业。

04. 移动指定行数

相似於第三个,指令格式完全相同,「 t 指令 」换成「 m 指令 」

「 :6m. 」 -> 移动第 6 行的文字内容
「 :6,8t. 」 -> 移动从第 6 到第 8 行的文字内容

05. 查找档案开启

搜寻当前目录底下的档案

:find {档案名称}

指令直接执行无法使用 :

因为搜索的路径并没有向下定位

路径指令

「 :set path 」指令 -> 预设的路径 「 path=.,/usr/include,, 」

重新设定这个指令,在原始的路径後方加上 「 ** 」

「 :set path=.,/usr/include,,** 」

再使用 find 指令,就可以找到子资料夹的文件。


配置档案

set path 指令,在退出 vim 编辑器後会被重置,
想要这个指令持续的生效,可以在 「 ~/.vimrc」 的文件中加入。

set path=.,/usr/include,,**

如果不想要修改配置档,折衷方案 :

:find **/{档案名称}
:e **/{档案名称} 

也可以发挥相同效果。


终端机

从上集的简单的文本编写开始,一直到方才说明的命令行模式,应该已经知道 Vim 编辑器的威力。

不过在日常开发时,我通常还是 以 IDE 加上 Vim 的插件,作为主要的开发环境。

007-1.IntelliJ-IdeaVim

因为 IDE 提供的文件导航、自动补全与环境配置,对於开发者来说仍是不可或缺的工具。

但若环境许可,初期要熟悉 Vim 的指令与功能,建议还是可以先使用终端机来学习。


三个原因

  1. 终端机上的 Vim 功能肯定是最齐全
  2. 可以克服对终端机黑底白字的恐惧
    • 现在的 IDE 通常都可以在编辑器中开启终端机
    • 不会使用这个工具的话,也等於放弃很多电脑可以帮你迅速做到的事情
  3. 终端机的指令其实超好用
    • Vim 编辑器可以透过命令行模式加上惊叹号 (:!)
    • 调用外部 Python 函式,进行 JSON 文字的格式化排版
    • 为了更方便的使用,还可以在 vim 的配置档中映设成内部指令

调用 python 函式,进行 JSON 文字的格式化

%!python -m json.tool

007-2.python-json-format

~/.vimrc 配置内部指令

command! JSONFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :1

007-3.vimrc-json-format


也就是说:

系统中所有的指令工具,都可以成为 vim 的扩充功能,更甚者还可以用熟悉的程序语言撰写自己想要的功能脚本。

007-4.vim-cmd-tools

这麽做的好处,就是可以比巨集功能,更像是用程序来写程序的方法。
而且如果能够流畅地在终端机下作业,肯定是会更加理解程序语言背後运作的底层原理。

以技术层面来看:

程序的功力,就会再更进一步的提升。

补充资料

Markdown + Vim 绝搭

巨集 @x : 固定配置代办清单的勾选
巨集 @z : 固定配置代办清单的取消
(一不小心就会写出很多 markdown 的笔记)

参考资料

官方教程

  • 指令: 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 实用技巧

<<:  [Day 27] 系统开发导入(上)

>>:  G Suite 教育版更名为 Google Workspace for Education,并取消无限制储存空间限制至 100 TB

[Kata] Clojure - Day 29

Growth of a Population In a small town the populat...

Day15 - BMI计算机

BMI(身体质量指数)是用自己身高、体重的比例,来当作是否过胖的「身高体重指数」 它的计算方法也很简...

[Day-4] 变数宣告以及运算

今天学习了变数以及变数的应用 上次学习到把文字显示於萤幕(命令提示字元)上 这次要来练习将变数存放的...

AE卷轴制作4-Day5

在动画做好之後,因为这个卷轴的做法是分段, 做等速动态,所以今天想调整他的节奏分段做不容易, 所以教...

Day22-D3 基础图表:长条图

本篇大纲:开放资料下载、绘制长条图 今天的一天一图表,我们来画图表世界中最常见的 长条图 吧!长条...