vi/vim的介绍及相关命令
在介绍vi/vim的相关命令前,先来了解下什么是vi/vim?为什么学习vi/vim?
什么是vi/vim?
- vi 是Visual Interface的缩写,即 可视化接口
vim
是vi iMprove的缩写,即vi的增强版
(具有语法着色功能),Vim是从 vi 发展出来的一个文本编辑器。为什么学习vi/vim?
- 所有的Unix系统上都会默认内置vi/vim编辑器,而不一定带有其他文本编辑器,非常通用;
- 很多软件的编辑接口都会默认调用vi/vim;
- vi/vim具有程序编辑的能力;
- vi/vim程序简单,编辑速度相当快速
vi和vim有什么区别?
- 多级撤销:在vi编辑器中,按u只能撤消上次命令,而在vim里可以无限制的撤消
- vi编辑器只能运行于unix中,而vim不仅可以运行于unix,还可用于windows、mac等多操作平台
- vim可以用不同的颜色来加亮你的代码
- 可以把vim当成vi来使用
由于vi与vim在命令上几乎相同,所以这里以vim为例,目前我们使用较多的也是vim编辑器。
vim的4种模式
进入vim模式:在终端里打 vim 回车。
vim一共有4个模式。常用是normal
和 insert
模式, 大部分时候都在两个模式下来回切换
。
模式 | 英文名 | 描述 | 切换操作 |
---|---|---|---|
正常模式 | normal-mode | 用于查看文本,也可复制、粘贴、撤销、重做等 | - 默认进入的是正常模式 - 不论位于什么模式,按下 <Esc>键 (有时需要按两下)都会进入正常模式 |
插入模式 | insert-mode | 也即编辑模式,用于编辑文本 | - 正常模式下,按下i, a, o, I,A,O 键,进入插入模式 |
命令模式 | normal-mode | 用于输入指令 如:保存、运行、切换标签、切割屏幕等 | - 正常模式下,按下:(英文冒号)键 ,进入命令模式 |
可视模式 | visual-mode | 相当于高亮选取文本后的正常模式 可视模式中的操作有些像拿鼠标进行操作 | - 在正常模式下,按下v,V,<ctrl>+v ,可以进入可视模式 |
退出vim
指令 | 描述 |
---|---|
:q | 直接退出(无更改) |
:wq | 保存退出 |
:q! | 放弃修改,强行退出 |
1、-normal- 正常
模式下
启动vim后默认位于正常模式。不论位于什么模式,一般情况,按下<Esc>键(有时需要按两下)都会进入normal(正常)模式。
正常模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作。
在VIM的Normal模式下,所有的键就是功能键了
返回 Normal 模式,请按 ESC
键
返回 Insert 模式,请按 i
键
-
插入/删除
keys 效果 keys 效果 a 光标之后插入 A 行尾插入 o 下一行插入 O 上一行插入 i 光标之前插入 I 行首插入 s 删除字符插入 S 删除正行插入 dd 删除一行,并把删除的行存到剪贴板里 "cc"或者"S" 删除后进入插入-insert-模式 dw 删除一个单词 cw 删除一个单词进入插入-insert-模式 x 或 dl 删除一个字符 s 或 cl 删除一个字符进入插入模式 cw 替换从光标所在位置后到一个单词结尾的字符 "D"或"C" 删除到行尾可以 dt" 删除所有的内容,直到遇到双引号—— "
u 撤销 ctrl + r 重做 -
拷贝/黏贴/删除
keys 效果 y 复制 当前光标所在的一个字符 x 剪切 当前光标所在的一个字符 p 粘贴 xp 交换两个字符 ddp 交换两行 yy 拷贝当前行当行于 ddP
0y$ 0y$
命令意味着:0 先到行头,y 从这里开始拷贝,$ 拷贝到本行最后一个字符ye 从当前位置拷贝到本单词的最后一个字符 y2/foo 拷贝2个 “foo” 之间的字符串 dt" 删除所有的内容,直到遇到双引号—— "
还有很多时间并不一定你就一定要按y才会拷贝,下面的命令也会被拷贝:
d
(删除 )v
(可视化的选择)gU
(变大写)gu
(变小写)
-
光标的移动
keys 效果 k l j h 上右下左(↑→↓←) ` 移动到上次编辑文件的位置 gg 跳到文件开头 G 跳到文件尾 { 移动到段首 } 移动到段尾 b 跳到上一个单词的开头 J 合并两行 e 跳到下一个单词的结尾 w 跳到下一个单词的开头 0 数字零,到行头 $ 到本行行尾 ^ 到本行第一个非blank(空格,tab,换行,回车等)字符的位置 ngg 或 nG 或 :n 跳到第n行 L 移动到底部 L 移动到底部 H 移动光标到屏幕顶端 M 移动到屏幕中间 -
选中
keys 作用 v+w 打开选中模式,并向后移动一个单词 v+b 打开选中模型,并向前移动一个单词 v+i+w 打开选中模式,并选中当前单词 -
修改
keys 说明 d s <existing char>
删除两边的指定字符 c s <existing char> <desired char>
修改两边的指定字符 y s <motion> <desired char>
修改两边字符 S <desired char>
visual modes 选中指定字符中间的内容 -
格式
- " >>"缩进所有选择的代码
- "<<" 反缩进所有选择的代码
- 合并两行" J"
-
打开、保存、退出、改变文件
keys 效果 :e <path/to/file> → 打开一个文件 :w 存盘 :saveas <path/to/file> 另存为 `<path/to/file> :x
,ZZ
或:wq
保存并退出 ( :x
表示仅在需要时保存,ZZ不需要输入冒号并回车)(:w
存盘,:q
退出) (陈皓注::w 后可以跟文件名):q! 退出不保存 :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。 :bn 和
:bp你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(陈皓注:我喜欢使用:n到下一个文件) :help | 显示相关命令的帮助。你也可以就输入
:help` 而不跟命令。(陈皓注:退出帮助需要输入:q):e! 若不想保存文件,而重新打开 :e filename 若想打开新文件 ctrl + ^ 进行文件切换 -
代码注释
gc 打开或关闭注释 // gcc 打开或关闭某一行代码注释 // gc2j 打开或关闭两行代码注释 gC 块代码注释 gCi) 注释 括号()中的代码 -
其他
- gd - Go to definition, 跳转到定义。
- gb - af - VISUAL 模式命令, 依据语法分析, 将选择区域向外扩展。
- gh - 等同于将鼠标移至光标所在单词, 方便查看定义以及报错。
- :set nu 显示行号
- :set nonu 不显示行号
- :nohl 不高亮显示
2、–insert– 插入
模式下
所谓插入模式就是进入到一个可以编辑文本文档的模式,常规的方式就是按小i进入编辑模式,左下角显示“--insert插入--”状态。
在 normal 模式下转 insert 模式,有三种途径。
- a 光标之后插入, A 行尾插入。
- i 光标之前插入, I 行首插入。
- o 下一行插入 ,O 上一行插入。
删除
操作 | 效果 |
---|---|
ctrl+h | 删除前一个字符 |
ctrl+w | 删除前一个单词 |
ctrl+u | 删除前面一行所有字符 |
3、-command- 命令
模式
在normal(正常)模式中,按下:
(冒号)键,会进入命令模式。
在命令模式中可以执行一些输入并执行一些vim或插件提供的指令,就像在shell里一样。这些指令包括 设置环境、文件操作、调用某个功能等等。
以:冒号开头的命令
操作 | 效果 | 操作 | 效果 |
---|---|---|---|
:wq 或:x | 保存退出 | :set nu | 显示行号 |
:wq! | 强制保存退出 | :set nonu | 不显示行号 |
:q! | 强制退出 | :nohl | 不高亮显示 |
注意::wq 或:x 都是保存退出,类似wq 如果在更改文件之后去操作2者的效果完全相同。
但是有一种情况不同,如果文件仅仅只是打开只看了一眼,这个时候使用wq会修改Mtime,更改成文件查看的那一刻,也就是输入wq那个时间。如果使用x那么就不会更改Mtime时间
4、-visual- 可视
模式
在正常模式按下v, V, <Ctrl>+v
,可以进入可视模式。
可视模式中的操作有点像拿鼠标进行操作,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。
可视块模式有一个很好的使用:多选注释 加注释 :
- 移动光标,选中的位置会有高亮显示
- shift + i,进入 insert 模式
- 输入//
- esc
去注释 :
- 移动光标,选中的位置会有高亮显示
- 按d
小技巧
vim的资源占用
近期笔者发现VSCode在vim 模式下CPU占用经常是200%左右,卡顿非常严重,看了官方issue。 关闭easymotion 和 statusbarcolorcontrol 可以解决此问题。
"vim.easymotion": false,
"vim.statusBarColorControl": false
复制代码
中文输入法切换问题
vim 常用是normal 和 insert 模式。 大部分时候都在两个模式下来回切换,如果在insert 模式下是中文输入,按esc 或者 ctrl+[ 切到了 normal 模式,这个时候问题来了,需要手动切换输入法到英文,否则会弹出中文提示。 还好官方给出了解决方案:
"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.defaultIM": "com.apple.keylayout.US",
"vim.autoSwitchInputMethod.obtainIMCmd": "/usr/local/bin/im-select",
"vim.autoSwitchInputMethod.switchIMCmd": "/usr/local/bin/im-select {im}"
复制代码
需要注意的是,mac下需要查明模式英文输入法是US 还是British ,然后修改defaultIM这个设置,否则会不起作用。
复制黏贴
在vscode下面,我们只需要对vim的相关配置进行设置就行。具体如下: 在【首选项】中进行设置。
"vim.useSystemClipboard": true
复制代码
进行了上面的设置之后。就可以使用系统的剪切板了。
配置
到用户目录下新建文件为 .vimrc,然后在其中写下如下配置
syntax enable //语法高亮
set number //显示行号
set cursorline //突出显示当前行
set ruler //打开状态栏标尺
set shiftwidth=4 //设定 << 和 >> 命令移动时的宽度为 4
set softtabstop=4 //使得按退格键时可以一次删掉 4 个空格
set tabstop=4 //设定 tab 长度为 4
复制代码
vim引自
附:Linux的常用命令
几个常用的Linux命令
如下:
文件和目录
-
cd 命令,用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径
cd /home ||进入 '/ home' 目录' cd .. ||返回上一级目录 cd ../.. ||返回上两级目录 cd ||进入个人的主目录 cd ~user1 ||进入个人的主目录 cd - ||返回上次所在的目录 复制代码
-
ls 命令,查看文件与目录的命令,list之意,它的参数非常多,下面列出一些常用的:
ls ||查看目录中的文件 ls -F ||查看目录中的文件 ls -l ||显示文件和目录的详细资料 ls -a ||显示隐藏文件 ls -d ||仅列出目录本身,而不是列出目录的文件数据 ls -h ||将文件容量以较易读的方式(GB,kB等)列出来 ls -R ||连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来 ls -lR ||以长数据串的形式列出当前目录下的所有文件 ls *[0-9]* ||显示包含数字的文件名和目录名 复制代码
-
mkdir 命令,
mkdir dir1 ||创建一个叫做 'dir1' 的目录' mkdir dir1 dir2 ||同时创建两个目录 mkdir -p /tmp/dir1/dir2 ||创建一个目录树 复制代码
-
cp 命令,该命令用于复制文件,copy之意,它还可以把多个文件一次性地复制到一个目录下
cp file1 file2 ||复制一个文件 cp dir/* . ||复制一个目录下的所有文件到当前工作目录 cp -a ||将文件的特性一起复制 cp -a /tmp/dir1 . ||复制一个目录到当前工作目录 cp -a dir1 dir2 ||连同文件的所有特性把文件dir1复制成文件dir2 cp -p ||连同文件的属性一起复制,而非使用默认方式,与-a相似,常用于备份 cp -i ||若目标文件已经存在时,在覆盖时会先询问操作的进行 cp -r ||递归持续复制,用于目录的复制行为 cp -u ||目标文件与源文件有差异时才会复制 复制代码
-
mv 命令,该命令用于移动文件、目录或更名,move之意
mv dir1 new_dir ||重命名/移动 一个目录,把dir1重命名为new_dir mv -f ||force强制的意思,如果目标文件已经存在,不会询问而直接覆盖 mv -i ||若目标文件已经存在,就会询问是否覆盖 mv -u ||若目标文件已经存在,且比目标文件新,才会更新 复制代码
-
rm 命令,用于删除文件或目录,remove之间
rm -f ||就是force的意思,忽略不存在的文件,不会出现警告消息 rm -i file ||删除文件file,在删除之前会询问是否进行该操作 rm -i ||互动模式,在删除前会询问用户是否操作 rm -r ||递归删除,最常用于目录删除,它是一个非常危险的参数 rm -rf dir1 ||删除一个叫做 'dir1' 的目录并同时删除其内容 rm -rf dir1 dir2 ||同时删除两个目录及它们的内容 复制代码
-
find 命令,是一个基于查找的功能非常强大的命令,相对而言,它的使用也相对较为复杂,参数也比较多,所以在这里将给把它们分类列出:
# 与时间有关的参数: find -mtime n ||n为数字,意思为在n天之前的“一天内”被更改过的文件; find -mtime +n ||列出在n天之前(不含n天本身)被更改过的文件名; find -mtime -n ||列出在n天之内(含n天本身)被更改过的文件名; find -newer file ||列出比file还要新的文件名 # 例如: find /root -mtime 0 # 在当前目录下查找今天之内有改动的文件 # 与用户或用户组名有关的参数: find -user name ||列出文件所有者为name的文件 find -group name ||列出文件所属用户组为name的文件 find -uid n ||列出文件所有者为用户ID为n的文件 find -gid n ||列出文件所属用户组为用户组ID为n的文件 # 例如: find /home/ljianhui -user ljianhui # 在目录/home/ljianhui中找出所有者为ljianhui的文件 # 与文件权限及名称有关的参数: find -name filename ||找出文件名为filename的文件 find -size [+-]SIZE ||找出比SIZE还要大(+)或小(-)的文件 find -tpye TYPE ||查找文件的类型为TYPE的文件,TYPE的值主要有:一般文件(f)、设备文件(b、c)、 目录(d)、连接文件(l)、socket(s)、FIFO管道文件(p); find -perm mode ||查找文件权限刚好等于mode的文件,mode用数字表示,如0755; find -perm -mode ||查找文件权限必须要全部包括mode权限的文件,mode用数字表示 find -perm +mode ||查找文件权限包含任一mode的权限的文件,mode用数字表示 # 例如: find / -name passwd # 查找文件名为passwd的文件 find . -perm 0755 # 查找当前目录中文件权限的0755的文件 find . -size +12k # 查找当前目录中大于12KB的文件,注意c表示byte 复制代码
-
pwd 命令,显示工作路径
-
tree 命令,显示文件和目录由根目录开始的树形结构(1)
-
lstree 命令,显示文件和目录由根目录开始的树形结构(2)
-
ln -s file1 lnk1 命令,创建一个指向文件或目录的软链接
-
ln file1 lnk1 命令,创建一个指向文件或目录的物理链接
-
cat命令,用于查看文本文件的内容,后接要查看的文件名,通常可用管道与more和less一起使用,从而可以一页页地查看数据。
cat text | less ||查看text文件中的内容 # 注:这条命令也可以使用less text来代替 复制代码