-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
187 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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` |