Vim 正常模式(Normal-mode)
本文最后更新于:2024年3月18日 凌晨
Vim 正常模式(Normal-mode)
移动光标
- 如果键盘上有上,下,左,右箭头的导航键,就由这些键来完成光标的移动,另外,可以用下面的键完成同样的移动功能。
- k:上移。
- j:下移。
- h:左移。
- l:右移。
- 上面这4个键将光标位置每次移动一行或一个字符,Vim还提供稍大范围移动光标的命令。
- ctrl+f:在文件中前移一页(相当于 page down)
- ctrl+b:在文件中后移一页(相当于 page up)
更大范围的移动
- *:当光标停留在一个单词上,* 键会在文件内搜索该单词,并跳转到下一处。
- #:当光标停留在一个单词上,# 在文件内搜索该单词,并跳转到上一处。
- (/):移动到前/后句 的开始。
- {/}:跳转到当前/下一个段落的开始。
- g_:到本行最后一个不是 blank 字符的位置。
- fa:到下一个为 a 的字符处,你也可以fs到下一个为s的字符。
- t,:到逗号前的第一个字符,逗号可以变成其它字符。
- 3fa:在当前行查找第三个出现的a
- F/T:和 f 和 t 一样,只不过是相反方向。
- gg:将光标定位到文件第一行起始位置。
- G:将光标定位到文件最后一行起始位置。
- NG或Ngg:将光标定位到第 N 行的起始位置。
- 在屏幕中找到需要的一页时,可以用下面的命令快速移动光标。
- H:将光标移到屏幕上的起始行(或最上行)
- M:将光标移到屏幕中间。
- L:将光标移到屏幕最后一行。
- 同样需要注意字母的大小写,H和L命令还可以加数字,如2H表示将光标移到屏幕的第2行,3L表示将光标移到屏幕的倒数第3行。
行内移动
- 当将光标移到所要的行时,行内移动,光标可以用下面的命令来实现。
- w:右移光标到下一个字的开头。
- e:右移光标到一个字的末尾。
- b:左移光标到前一个字的开头。
- 0:数字0,左移光标到本行的开始。
- $:右移光标,到本行的末尾。
- ^:移动光标,到本行的第一个非空字符。
移动历史光标位置:
-
Control+o:回到之前光标的位置。
-
Control+i:回到之后光标的位置。
搜索匹配
- 和许多先进的编辑器一样,Vim提供了强大的字符串搜索功能,要查找文件中指定字或短语出现的位置,可以用Vim直接进行搜索,而不必以手工方式进行。
- 搜索方法
- 键入字符/,后面跟以要搜索的字符串,然后按回车键。
- 编辑程序执行正向搜索(即朝文件末尾方向),并在找到指定字符串后,将光标停到该字符串的开头,键入n命令可以继续执行搜索,找出这一字符串下次出现的位置,用字符?取代/,可以实现反向搜索(朝文件开头方向),例如。
- /str1正向搜索字符串 str1
- n继续搜索,找出 str1 字符串下次出现的位置。
- N继续搜索,找出 str1 字符串上一次出现的位置。
- ?str2反向搜索字符串 str2
- 无论搜索方向如何,当到达文件末尾或开头时,搜索工作会循环到文件的另一端并继续执行。
- Vim中执行搜索匹配最强大的地方是结合正则表达式来搜索,后续将会介绍。
替换和删除
- Vim常规的删除命令是 d, x (前者删除行,后者删除字符),结合Vim的其他特性可以实现基础的删除功能,将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多个字符或一行,多行,例如。
- rc:用 c 替换光标所指向的当前字符。
- nrc:用 c 替换光标所指向的前 n 个字符。
- 5rA:用 A 替换光标所指向的前 5 个字符。
- x:删除光标所指向的当前字符。
- nx:删除光标所指向的前 n 个字符。
- 3x:删除光标所指向的前 3 个字符。
- dw:删除光标右侧的字。
- ndw:删除光标右侧的 n 个字。
- 3dw:删除光标右侧的 3 个字。
- db:删除光标左侧的字。
- ndb:删除光标左侧的 n 个字。
- 5db:删除光标左侧的 5 个字。
- dd:删除光标所在行,并去除空隙。
- ndd:删除(剪切) n 行内容,并去除空隙。
- 3dd:删除(剪切) 3 行内容,并去除空隙。
- 其他常用的删除命令有。
- d$:从当前光标起删除字符直到行的结束。
- d0:从当前光标起删除字符直到行的开始。
- J:删除本行的回车符(CR),并和下一行合并。
- Vim常规的替换命令有c和s,结合Vim的其他特性可以实现基础的替换功能,不过替换命令执行以后,通常会由编辑模式进入插入模式。
- s:用输入的正文替换光标所指向的字符。
- S:删除当前行,并进入插入模式。
- ns:用输入的正文替换光标右侧 n 个字符。
- nS:删除当前行在内的 n 行,并进入插入模式。
- cw:用输入的正文替换光标右侧的字。
- cW:用输入的正文替换从光标到行尾的所有字符(同 c$ )
- ncw:用输入的正文替换光标右侧的 n 个字。
- cb:用输入的正文替换光标左侧的字。
- ncb:用输入的正文替换光标左侧的 n 个字。
- cd:用输入的正文替换光标的所在行。
- ncd:用输入的正文替换光标下面的 n 行。
- c$:用输入的正文替换从光标开始到本行末尾的所有字符。
- c0:用输入的正文替换从本行开头到光标的所有字符。
删除单个单词
- 要删除最后一个单词,有以下几种选择:
-
先用’b’命令把光标先移动到”l”上,然后执行dw删除整个单词。按键3个。
-
执行反向删除命令’db’(会剩余最后的”e”字符),再执行’x’删除单个字符。按键3个。
-
直接执行daw,删除单词并会删除一个空格,光标停留在下一个单词末尾上。按键3个。
-
复制粘贴
- 从正文中删除的内容(如字符,字或行)并没有真正丢失,而是被剪切并复制到了一个内存缓冲区中,用户可将其粘贴到正文中的指定位置,完成这一操作的命令是。
- p:小写字母p,将缓冲区的内容粘贴到光标的后面。
- P:大写字母P,将缓冲区的内容粘贴到光标的前面。
- 如果缓冲区的内容是字符或字,直接粘贴在光标的前面或后面,如果缓冲区的内容为整行正文,执行上述粘贴命令将会粘贴在当前光标所在行的上一行或下一行。
- 注意上述两个命令中字母的大小写,Vim编辑器经常以一对大,小写字母(如p和P)来提供一对相似的功能,通常,小写命令在光标的后面进行操作,大写命令在光标的前面进行操作。
- 有时需要复制一段正文到新位置,同时保留原有位置的内容,这种情况下,首先应当把指定内容复制(而不是剪切)到内存缓冲区,完成这一操作的命令是。
- yy:复制当前行到内存缓冲区。
- nyy:复制 n 行内容到内存缓冲区。
- 5yy:复制 5 行内容到内存缓冲区。
- "+y:复制 1 行到操作系统的粘贴板。
- "+nyy:复制 n 行到操作系统的粘贴板。
寄存器
- 复制:
"ayy
- 粘贴:
"ap
- 添加:
"Ayy
撤销和重复
- 在编辑文档的过程中,为消除某个错误的编辑命令造成的后果,可以用撤消命令,另外,如果用户希望在新的光标位置重复前面执行过的编辑命令,可用重复命令。
- u:撤消前一条命令的结果。
- ctrl+r:撤销被撤销的命令。
- .:重复最后一条修改正文的命令。
自增与自减
- 自增1:
Control+A
- 自减1:
Control+S
Text-Object
文本对象的类型
1 |
|
文本对象的作用范围
- 以下实例中的红色 [ ] 表示作用范围:
iw
表示inner word,如果键入viw
命令,那么首先v
将进入选择模式,然后iw
将选中当前单词。aw
表示a word,它不但会选中当前单词,还会包含当前单词之后的空格。
1 |
|
文本对象的应用实例
- 使用
ci)
命令,可以删除括号内的所有内容,但保留括号本身,而ca)
命令,则可以删除括号内的所有内容,以及括号本身。
- 在某个开括号上,点击
%
键,光标将可以自动移动到相对应的闭括号上,通过与编辑命令组合,c%
可以实现与ca)
相同的功能,使用%
命令,必须将光标放在括号之上;而使用a)
命令,则光标可以在括号之上或括号内的任何位置,而且%
命令,也是无法实现用i)
命令效果的。
- 使用
cit
命令,你甚至不用将光标移动到Tag之内,就可以快速修改其中的内容。
- 使用
ci"
命令,可以快速修改当前行内第一个双引号其中的内容。
- 使用
ci'
命令,可以快速修改当前行内第一个单引号其中的内容。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!