在介绍vi/vim的相关命令前,先来了解下什么是vi/vim?为何学习vi/vim?html
什么是vi/vim?linux
- vi 是Visual Interface的缩写,即 可视化接口
vim
是vi iMprove的缩写,即vi的加强版
(具备语法着色功能),Vim是从 vi 发展出来的一个文本编辑器。为何学习vi/vim?git
- 全部的Unix系统上都会默认内置vi/vim编辑器,而不必定带有其余文本编辑器,很是通用;
- 不少软件的编辑接口都会默认调用vi/vim;
- vi/vim具备程序编辑的能力;
- vi/vim程序简单,编辑速度至关快速
vi和vim有什么区别?github
- 多级撤销:在vi编辑器中,按u只能撤消上次命令,而在vim里能够无限制的撤消
- vi编辑器只能运行于unix中,而vim不只能够运行于unix,还可用于windows、mac等多操做平台
- vim能够用不一样的颜色来加亮你的代码
- 能够把vim当成vi来使用
因为vi与vim在命令上几乎相同,因此这里以vim为例,目前咱们使用较多的也是vim编辑器。shell
进入vim模式:在终端里打 vim 回车。vim
vim一共有4个模式。经常使用是normal
和 insert
模式, 大部分时候都在两个模式下来回切换
。windows
模式 | 英文名 | 描述 | 切换操做 |
---|---|---|---|
正常模式 | normal-mode | 用于查看文本,也可复制、粘贴、撤销、重作等 | - 默认进入的是正常模式 - 不论位于什么模式,按下 <Esc>键 (有时须要按两下)都会进入正常模式 |
插入模式 | insert-mode | 也即编辑模式,用于编辑文本 | - 正常模式下,按下i, a, o, I,A,O 键,进入插入模式 |
命令模式 | normal-mode | 用于输入指令 如:保存、运行、切换标签、切割屏幕等 |
- 正常模式下,按下:(英文冒号)键 ,进入命令模式 |
可视模式 | visual-mode | 至关于高亮选取文本后的正常模式 可视模式中的操做有些像拿鼠标进行操做 |
- 在正常模式下,按下v,V,<ctrl>+v ,能够进入可视模式 |
指令 | 描述 |
---|---|
:q | 直接退出(无更改) |
:wq | 保存退出 |
:q! | 放弃修改,强行退出 |
正常
模式下启动vim后默认位于正常模式。不论位于什么模式,通常状况,按下<Esc>键(有时须要按两下)都会进入normal(正常)模式。bash
正常模式通常用于浏览文件,也包括一些复制、粘贴、删除等操做。app
在VIM的Normal模式下,全部的键就是功能键了less
返回 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 选中指定字符中间的内容 |
格式
打开、保存、退出、改变文件
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) | 注释 括号()中的代码 |
其余
插入
模式下所谓插入模式就是进入到一个能够编辑文本文档的模式,常规的方式就是按小i进入编辑模式,左下角显示“--insert插入--”状态。
在 normal 模式下转 insert 模式,有三种途径。
删除
操做 | 效果 |
---|---|
ctrl+h | 删除前一个字符 |
ctrl+w | 删除前一个单词 |
ctrl+u | 删除前面一行全部字符 |
命令
模式在normal(正常)模式中,按下:
(冒号)键,会进入命令模式。
在命令模式中能够执行一些输入并执行一些vim或插件提供的指令,就像在shell里同样。这些指令包括 设置环境、文件操做、调用某个功能等等。
以:冒号开头的命令
操做 | 效果 | 操做 | 效果 |
---|---|---|---|
:wq 或:x | 保存退出 | :set nu | 显示行号 |
:wq! | 强制保存退出 | :set nonu | 不显示行号 |
:q! | 强制退出 | :nohl | 不高亮显示 |
注意::wq 或:x 都是保存退出,相似wq 若是在更改文件以后去操做2者的效果彻底相同。
可是有一种状况不一样,若是文件仅仅只是打开只看了一眼,这个时候使用wq会修改Mtime,更改为文件查看的那一刻,也就是输入wq那个时间。若是使用x那么就不会更改Mtime时间
可视
模式在正常模式按下v, V, <Ctrl>+v
,能够进入可视模式。
可视模式中的操做有点像拿鼠标进行操做,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。
可视块模式有一个很好的使用:多选注释 加注释 :
去注释 :
近期笔者发现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
复制代码
几个经常使用的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来代替
复制代码