Skip to content

Commit

Permalink
add post: vim usage
Browse files Browse the repository at this point in the history
  • Loading branch information
aimixsaka committed Jan 6, 2024
1 parent c7ebba1 commit c606b07
Showing 1 changed file with 187 additions and 0 deletions.
187 changes: 187 additions & 0 deletions blog/posts/2024-01-01-vim-usage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
---
title: Vim 使用
date: 2024-01-01
categories:
- blog
tags:
- Vim
authors:
- aimixsaka
---

[Vim](https://www.vim.org/) 是一个开源自由的、基于终端的文本编辑器(text editor)。

这是 Vim 系列的第一篇,在本文中我们会专注 Vim 的使用
<!--more-->

## 1. Vim 的使用
### 1.1 终端命令
大多数情况下我们用 `vim [filename]` 打开 Vim 或用 Vim 编辑文件,

若在类Unix系统内,`command | vim -` 亦是常用的技巧。
### 1.2 获取帮助☆
- Vim 内置的文档 通过 `:h <keyword>` 获取,如 `:h digraph-table`(可以使用`tab`进行补全)
- Vim 内置的用户手册 `:h usr_??.txt` `??` 为两位数字,可以用`tab`来补全
### 1.3 编辑模式
**以下内容仅作手册之用,不建议一开始就细看**
- Vim 与其它大多数编辑器不同的一点是 Vim 有着多种编辑模式。
- 可以使用 `h vim-modes` 查看介绍
- 可以通过左下角的标识来判断当前所在的模式(`-- VISUAL --` / `-- SELECT --`)
#### 1.3.1 Normal Mode
在命令行用 Vim 打开文件后,我们默认处于 Vim 的 `Normal Mode`

在此模式下我们只能进行移动或者执行删改相关的命令,而不能从键盘中输入。

我们仍然可以使用键盘上的上下左右键进行移动,

但是更推荐使用 Vim 的方式: `h j k l` 分别代表 `左 下 上 右`

使用它们可以确保手指不会离开键盘的中心区域,提高编辑效率。

另外还有几组移动相关的键位:

在行内:

- 我们常用`w/W``e/E``b/B``ge/gE`来进行单词/词组级别的移动

`w/W` 用于跳到单词的首字母

`e/E` 用于跳到单词的末字母

`b/B``w/W`作用相反

`ge/gE``e/E`作用相反

大小写的区别在于,是否将除空格外的字符认作一个单词,用以下文本试验可知:

`test,line, for motion`

- 对于任意的字符(单词内部),用`f/F``t/T``;/,`相结合来移动是很好的手段

`f <char>`用于移动到当前光标后行内第一个`char`出现的位置,例如对于以下文本(用`|`表示光标位置):

`|test lone for f char`,键入`f o`将会将光标移动到`lone``o`位置,

若要再次执行搜索,比如移动到第二个`o`的位置,只需再键入`;`即可,而要反向搜索,使用`,`

`t/T`类似`f/F`,但只移动到搜索到字母的前一位,与删除相关的命令结合时很有用。

在整个文本内:

- 常用`Ctrl-u/Ctrl-d`进行半屏的上下移动
- 或者用`<num> h/j/k/l`进行重复`num`次的`左/下/上/右`移动
- 亦或用`/<string>回车`利用搜索进行移动

#### 1.3.2 Insert Mode
讲完移动,终于可以开始输入了。

输入在 Vim 的 `Insert Mode` 进行。

`Normal Mode`下,我们常用`i/I``gI``a/A``o/O`进入 `Insert Mode`

`i` 表示在当前光标前插入 `I` 在当前行第一个**非空字符**前插入

`gI` 表示在当前行第一个**字符**前插入

`a` 表示在当前光标后在插入 `A` 在当前行最后一个**字符**后插入

`o/O` 表示在当前行的下方/上方新起一行插入


还有两个特殊些的动词 `c/C` `s/S`

`c` 要与其它 `Normal Mode` 下移动的键组合,比如`ce` `cw`

`C` 表示从光标当前位置删除到行末

`s` 表示删除当前光标下的那个字符

`S` 表示删除当前行


#### 1.3.3 Visual Mode
Vim 的 `Visual Mode` 类似一些编辑器的鼠标选中,但要更精细些

Vim 的选中分三种:

- 字符级别的选中

`Normal Mode` 下,用`v`进入

这种选中类似鼠标选中

- 行级别的选中

`Normal Mode` 下,用`V`进入

与字符级别选中不同,行级别选中后无论是移动还是执行动作,操作都是以行为单位的

- 块级别的选中

`Normal Mode` 下,用`Ctrl-v`进入

选中以行列为单位,整体一般情况下是矩形


你可以用一切能在 `Normal Mode` 移动的键来扩展你的选中区域,

并对选中的区域执行一些动作,比如删除(`x`)、替换(`r <char>`)等


#### 1.3.4 模式之间的转换
`Normal Mode` 到其它模式的转换在之前各模式的介绍里已经提及

从其它模式到 `Normal Mode` 的转换常用 `ESC``Ctrl-[`

### 1.4 Vim 编辑的哲学
#### 1.4.1 总是回到 `Normal Mode`
不应该长时间停留在 `Insert Mode` 或其它模式,应该总是习惯性地回到 `Normal Mode`

#### 1.4.2 动词+名词
Vim 大多数情况下使用的编辑命令都是 动词 + 名词 的形式

动词 指的是形如 `c` `d` `gU` 等单个命令没有任何效果的操作符待决模式命令

名词 指的是 `Normal Mode` 下的移动命令(`h/j/k/l` `w/W`等)或者文本对象(`i{` `at`等)

例如 `Normal Mode``cw` 会删除至单词的开头,`ci{` 会删除`{}`内的内容

这是日常编辑中用得最多的一种编辑模式

#### 1.4.3 移动、修改与撤销
可以看下面这个例子:

`var foo = "method("+argument1+","+argument2+")";` 目的是在每个`+`两边各加一个空格


一个想法是用`f+`移动到`+`号,然后`i`进入`Insert Mode`,键入一个空格,回到`Normal Mode`

然后`a`再键入另一个空格。然后再用`;`重复上一次搜索,移动到下一个`+`,再重复之前的行为。


但是这么做显然需要按过多的键,没有效率可言。究其原因是无法重复使用过去的动作

再来看看另一种编辑方法。

依次的按键:`f+s + <ESC>;.;.;.`

这种方法利用`;`重复搜索,利用点命令(`.`)來重复**一次修改缓冲区的动作(`s + `)**

**一次修改缓冲区的动作**指的是 用`动词+名词`修改了缓冲区的动作 或者 从进入`Insert Mode``Normal Mode`为止

做的修改,例如`cw或de或x或s<someword><ESC>`


详情可以看`:h .` 平时也可以注意一下哪些操作是可重复的


这种编辑模式也是相当有用的,用一键來移动(`f/j等`),另一键來修改(往往是`.`),出现意外的修改时用`u`來撤销

(上面的编辑其实也可以直接用`:s/+/ + /g`來替换,但是有些时候这种移动,重复的编辑模式会比直接替换更合适)



#### END
到这里就暂时结束。现在可以退出 Vim ,喝杯茶休息一下了 :)

`:x`

0 comments on commit c606b07

Please sign in to comment.