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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
iw ...inner word
aw ...a word
iW ...inner WORD
aW ...a WORD
is ...inner sentence
as ...a sentence
ip ...inner paragraph
ap ...a paragraph
it ...inner tag
at ...a tag
i( or i) ...inner block
a( or a) ...a block
i< or i> ...inner block
a< or a> ...a block
i{ or i} ...inner block
a{ or a} ...a block
i[ or i] ...inner block
a[ or a] ...a block
i" ...inner block
a" ...a block
i` ...inner block
a` ...a block

文本对象的作用范围

  • 以下实例中的红色 [ ] 表示作用范围:
    • iw表示inner word,如果键入viw命令,那么首先v将进入选择模式,然后iw将选中当前单词。
    • aw表示a word,它不但会选中当前单词,还会包含当前单词之后的空格。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
iw	This is a [test] sentence.
aw This is a [test ]sentence.
iW This is a [...test...] sentence.
aW This is a [...test... ]sentence.
is ...sentence. [This is a sentence.] This...
as ...sentence. [This is a sentence. ]This...
ip End of previous paragraph. [This is a paragraph. It has two sentences.]
The next.
ap End of previous paragraph. [This is a paragraph. It has two sentences.
]The next.
i( or i) 1 * ([2 + 3])
a( or a) 1 * [(2 + 3)]
i< or i> The <[tag]>
a< or i> The [<tag>]
i{ or i} some {[ code block ]}
a{ or a} some [{ code block }]
i[ or i] some [[ code block ]]
a[ or a] some [[ code block ]]
i" The "[best]"
a" The[ "best”]
i` The `[best]`
a` The[ `best`]

文本对象的应用实例

  • 使用ci)命令,可以删除括号内的所有内容,但保留括号本身,而ca)命令,则可以删除括号内的所有内容,以及括号本身。

  • 在某个开括号上,点击%键,光标将可以自动移动到相对应的闭括号上,通过与编辑命令组合,c%可以实现与ca)相同的功能,使用%命令,必须将光标放在括号之上;而使用a)命令,则光标可以在括号之上或括号内的任何位置,而且%命令,也是无法实现用i)命令效果的。

  • 使用cit命令,你甚至不用将光标移动到Tag之内,就可以快速修改其中的内容。

  • 使用ci"命令,可以快速修改当前行内第一个双引号其中的内容。

  • 使用ci'命令,可以快速修改当前行内第一个单引号其中的内容。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!