vim

Vim

基本概念

vim有三种状态,分别是命令行模式(command mode)、输入模式(Insert mode)和底线命令模式(last line mode),这 3 种工作模式可随意切换。

命令行模式

我们使用vim编辑文件的时候,默认进入文件时是命令行模式。

Vim输入模式

在vim 输入模式下,可以对有写入权限的文件进行写操作;通常在命令模式下直接通过命令进入输入模式:iIaAoO等插入命令就可以进入;当我们编辑完文件之后按esc键就可以退出出入模式返回命令模式:

快捷键 功能描述
i 在光标的左侧输入文本,光标右侧文本向右移动
I 在光标所在行的行首输入文本,相当于在行首执行了i命令
a 在光标的右侧输入文本
A 在光标所在行的尾部进行输入文本,相当于在光标行尾执行a命令
o 在光标所在行的下一行增添新的一行,光标停留在新行的行首
O 在光标所在行的上一行增添新的一行,光标停留在新行的行首

底线命令模式

在命令模式下按:(注意是英文冒号),此时vim的窗口左下方会出现一个:符号,这时就已经进入了底线命令模式了。

注意:指令执行之后会把自动返回到命令行模式的。

作用:底线命令模式可以对文件中指定的内容进行保存、替换、查询、删除等等操作。

常用指令快捷键如下图:

快捷键 功能描述
:q 退出vi编辑器
:q! 不保存文件,直接退出vi编辑器
:w 只保存文件,但不退出vi编辑器
:wq 保存文件且退出vim编辑器
:start,endd 从第start行开始到end行进行删除操作 最后一个d标识删除
:%d 清空文件内容(跳到行首dG执行也可删除)
:! command 暂时离开vim编辑器去到指令模式下执行 command 命令显示结果
:%d 清空文件内容(跳到行首dG执行也可删除)

常用命令 + 快捷键

打开文件

① 正常打开一个文件默认光标在第一行

➜  ~ vim filename  -- filename指文件名

② 正常打开一个文件默认光标在文件尾部

➜  ~ vim + package.json  -- package.json打开的文件名或者文件路径

③ 正常打开一个文件默认让光标定位在第几行

➜  ~ vim +num package.json -- num 标识光标定位到第几行

其他

① 字符移动命令

① h 将光标向左移动一格

② j 将光标向下移动一格

③ k 将光标向上移动一格

④ l 将光标向右移动一格

### 注意注意

这些移动的指令我们也可以带上一次移动多少,例如:2j -- 表示向下移动2格

② 单词移动命令

① w 将光标向右移动到下一个单词的词首

② b 将光标向前移动到前一个单词的词首

③ e 将光标跳转到当前或下一个单词的词尾

③ 首尾行移动命令

① $ 将光标移动到当前行的尾部

② 0 将光标移动到当前行的行首 -- 0 表示数字零 不是字母O 

③ gg 将光标跳转到文件第一位置

④ G 将光标跳转到文件的末尾

⑤ num+G 将光标跳转到文件的第几行 -- num表示文件的第几行

⑥ :num 底线命令模式下,直接给出行号,同样可以实现跳转  -- num 跳转行数

④ 退出命令

① :wq 保存文件且退出vi编辑器

② :w  保存文件,但是不退出vi编辑器

③ :q  退出vi编辑器

④ :q! 不保存文件,直接退出vi编辑器                

⑤ 翻页键命令

① ctrl+d 将光标向下翻半屏,通常每次翻屏12行

② ctrl+u 将光标向上翻半屏,通常每次翻屏12行

③ ctrl+f 将光标向下翻满屏,通常每次翻屏24行

④ ctrl+b 将光标向上翻满屏,通常每次翻屏24行

⑥ 剪切和粘贴键命令

① d  删除指定位置的文本且临时存储到缓存区;可使用p访问缓存区;常常这样使用:d、:num,numd、dd(删除整行)、.. 

② y  将指定文本复制到临时缓存区;可使用put操作符访问;常常这样使用:y、yy(复制整行)

③ p  将指定缓存区内容放在光标位置之下;整行文本放在行下面,若是非整行文本则放在光标后面

④ P  将指定缓冲区的内容放到当前光标的位置之上;整行文本放在行下面,若是非整行文本则放在光标后面

⑦ 文本修改键命令

① x  删除光标位置指定的字符

② dd 删除光标所在的行

③ u 撤销最近的修改,针对所有修改

④ U 撤销对当前行上做的所有修改

⑤ r 替换光标位置上的一个字符,但不会进入insert模式;例如2r:把后面2个字符替换掉

⑥ R 替换从光标位置开始的字符,同时改变vi到文本输入模式

⑦ . 重复上一次的修改  -- 注意该命令是:英文符号点

⑧ 搜索替换命令(需在底线命令模式)

① :/string   从文件首部开始查找到尾部;按n键可以跳到下一个,N上一个,另外按/键后,按上下键可以找到以前查找的记录,同样的也有记录

② :?string  同上,从当前光标向文件首部查找

③ :%s/word1/word2/g   从文件首到尾替换每一行的 word1为 word2

④ :num,num1s/word1/word2/g   从第num行到num1行替换word1为word2

⑤ :num,$s/word1/word2/g   从第num行查询word1字符串,并替换为word2

⑥ :s/str1/str2/g   从光标当前行搜索word1字符串并替换为word2

⑨ 将当前文件中的部分内容另存为另外一个文件

 ### 注意是在底线命令模式下
 
:num,$ w test.lua  -- 将当前文件从第 num 行到最后一行内容,保存到test.lua中

⑩ 将别的文件内容填充在当前文件中

 ### 注意是在底线命令模式下
 
:r /usr/local/var/weixin/test.log  读取指定文件中的内容,插入到当前行的最后面

⑪ vim中批量添加注释命令

① 方法一:块选择模式(常用模式)

    批量注释:
        1、ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,

        2、再按大写的 I 进入行首插入模式输入注释符号;例如:#号或者//(双斜线)

        3、输入完毕之后,按两下 ESC,Vim会自动将你选中的所有行首都加上注释,可能需要等上几秒钟
        
    批量取消注释:
        1、ctrl + v 进入块选择模式,选中你要删除的行首的注释符号

        2、按 d 即可删除注释
        
② 方法二:替换命令(底线命令模式)

    批量注释:
        :start,edns/^/注释符/g  -- start:起始行号;end:结束行号:注释符:#或者//
    
    取消注释:
       :start,edns/^注释符//g   -- start:起始行号;end:结束行号:注释符:#或者//

⑫ 块选择命令

  ① ctrl + v 进入块选择模式,光标移动你要选中的单词
  
  ② 根据 h j k l来选中你需要的模块
  
  ③ 就可以对选中的数据进行各种操作了

⑬ 显示和取消行号

① :set nu    显示行号 也可以输入 set number

② :set nonu  取消行号

⑭ 设置文件内容自动缩进

① :set ai   开启自动缩进

② :set noai 关闭自动缩进

查找到的文本高亮显示

① :set hlsearch   开启文本高亮

② :set nohlsearch 关闭文本高亮

⑮ 多个文件一起编辑

➜~ vim filename1 filename2 filename3 ...  -- 打开多个文件,默认打开第一个

① :prev 切换到上一个文件

② :N    切换到上一个文件

③ :next 切换到下一个文件

④ :n    切换到下一个文件

⑤ :last 切换到最后一个文件

⑥ :first 切换到第一个文件

⑦ :qa :全部退出

⑯ 多窗口功能

## 注意使用

① :sp filename 水平打开一个新窗口,显示新文件,若只输入:sp,则两窗口显示同一个文件

② ctrl+w + s   水平拆分窗口 

③ ctrl+w + v   垂直拆分窗口

④ ctrl + w + j 光标移动到下方窗口

⑤ ctrl + w + k 光标移动到上方窗口

⑥ ctrl + w + q 离开当前窗口

⑰ 删除文本单词命令

① dw  删除当前光标后面的一个单词

② dnw 删除光标后面指定的n个单词 -- n表示要删除的单词数

③ d$  删除当前光标到行尾的全部单词

④ d^  删除当前光标到行首全部单词

⑤ dnj 从当前光标处向下删除n行  -- n表示删除的行数

⑥ dnk 从当前光标处向上删除n行  -- n表示删除的行数

⑦ :g/string/d   删除当前文件中string字符串的行

⑧ :%s/^\n$//g   删除空行
 
### 注意注意:

d指令换成c指令效果是一样的,只是操作完会变成insert模式