vim 小总结

1,649 阅读13分钟

vi/vim的介绍及相关命令

在介绍vi/vim的相关命令前,先来了解下什么是vi/vim?为什么学习vi/vim?

什么是vi/vim?

  • vi 是Visual Interface的缩写,即 可视化接口
  • vim是vi iMprove的缩写,即vi的增强版 (具有语法着色功能),Vim是从 vi 发展出来的一个文本编辑器。

为什么学习vi/vim?

  1. 所有的Unix系统上都会默认内置vi/vim编辑器,而不一定带有其他文本编辑器,非常通用;
  2. 很多软件的编辑接口都会默认调用vi/vim;
  3. vi/vim具有程序编辑的能力;
  4. vi/vim程序简单,编辑速度相当快速

vi和vim有什么区别?

  1. 多级撤销:在vi编辑器中,按u只能撤消上次命令,而在vim里可以无限制的撤消
  2. vi编辑器只能运行于unix中,而vim不仅可以运行于unix,还可用于windows、mac等多操作平台
  3. vim可以用不同的颜色来加亮你的代码
  4. 可以把vim当成vi来使用

由于vi与vim在命令上几乎相同,所以这里以vim为例,目前我们使用较多的也是vim编辑器。

vim的4种模式

进入vim模式:在终端里打 vim 回车。

vim一共有4个模式。常用是normalinsert模式, 大部分时候都在两个模式下来回切换

模式 英文名 描述 切换操作
正常模式 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

  1. 插入/删除

    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 重做
  2. 拷贝/黏贴/删除

    keys 效果
    y 复制 当前光标所在的一个字符
    x 剪切 当前光标所在的一个字符
    p 粘贴
    xp 交换两个字符
    ddp 交换两行
    yy 拷贝当前行当行于 ddP
    0y$ 0y$ 命令意味着:0 先到行头,y 从这里开始拷贝,$ 拷贝到本行最后一个字符
    ye 从当前位置拷贝到本单词的最后一个字符
    y2/foo 拷贝2个 “foo” 之间的字符串
    dt" 删除所有的内容,直到遇到双引号—— "

    还有很多时间并不一定你就一定要按y才会拷贝,下面的命令也会被拷贝:

    • d (删除 )
    • v (可视化的选择)
    • gU (变大写)
    • gu (变小写)
  3. 光标的移动

    keys 效果
    k l j h 上右下左(↑→↓←) ` 移动到上次编辑文件的位置
    gg 跳到文件开头 G 跳到文件尾
    { 移动到段首 } 移动到段尾
    b 跳到上一个单词的开头 J 合并两行
    e 跳到下一个单词的结尾 w 跳到下一个单词的开头
    0 数字零,到行头 $ 到本行行尾
    ^ 到本行第一个非blank(空格,tab,换行,回车等)字符的位置 ngg 或 nG 或 :n 跳到第n行
    L 移动到底部 L 移动到底部
    H 移动光标到屏幕顶端 M 移动到屏幕中间
  4. 选中

    keys 作用
    v+w 打开选中模式,并向后移动一个单词
    v+b 打开选中模型,并向前移动一个单词
    v+i+w 打开选中模式,并选中当前单词
  5. 修改

    keys 说明
    d s <existing char> 删除两边的指定字符
    c s <existing char> <desired char> 修改两边的指定字符
    y s <motion> <desired char> 修改两边字符
    S <desired char> visual modes 选中指定字符中间的内容
  6. 格式

    • " >>"缩进所有选择的代码
    • "<<" 反缩进所有选择的代码
    • 合并两行" J"
  7. 打开、保存、退出、改变文件

    keys 效果
    :e <path/to/file> → 打开一个文件
    :w 存盘
    :saveas <path/to/file> 另存为 `<path/to/file>
    :xZZ:wq 保存并退出 (:x 表示仅在需要时保存,ZZ不需要输入冒号并回车)(:w 存盘, :q 退出) (陈皓注::w 后可以跟文件名)
    :q! 退出不保存
    :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。
    :bn:bp 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(陈皓注:我喜欢使用:n到下一个文件)
    :help | 显示相关命令的帮助。你也可以就输入:help` 而不跟命令。(陈皓注:退出帮助需要输入:q)
    :e! 若不想保存文件,而重新打开
    :e filename 若想打开新文件
    ctrl + ^ 进行文件切换
  8. 代码注释

    gc 打开或关闭注释 //
    gcc 打开或关闭某一行代码注释 //
    gc2j 打开或关闭两行代码注释
    gC 块代码注释
    gCi) 注释 括号()中的代码
  9. 其他

    • 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 模式,这个时候问题来了,需要手动切换输入法到英文,否则会弹出中文提示。 还好官方给出了解决方案:

  1. 安装 im-select: Switch your input method from terminal
  2. 修改配置
"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引自

简明 VIM 练级攻略

vim配置

VSCode里面配置vim

vim命令大全

附:Linux的常用命令

几个常用的Linux命令如下:

文件和目录

  1. cd 命令,用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径

    cd /home 	||进入 '/ home' 目录' 
    cd .. 	||返回上一级目录 
    cd ../.. 	||返回上两级目录 
    cd 	||进入个人的主目录 
    cd ~user1 	||进入个人的主目录 
    cd - 	||返回上次所在的目录 
    
  2. ls 命令,查看文件与目录的命令,list之意,它的参数非常多,下面列出一些常用的:

    ls 	||查看目录中的文件 
    ls -F 	||查看目录中的文件 
    ls -l 	||显示文件和目录的详细资料 
    ls -a 	||显示隐藏文件 
    ls -d 	||仅列出目录本身,而不是列出目录的文件数据  
    ls -h 	||将文件容量以较易读的方式(GB,kB等)列出来  
    ls -R 	||连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来  
    ls -lR 	||以长数据串的形式列出当前目录下的所有文件  
    ls *[0-9]* 	||显示包含数字的文件名和目录名 
    
  3. mkdir 命令,

    mkdir dir1 	||创建一个叫做 'dir1' 的目录' 
    mkdir dir1 dir2 	||同时创建两个目录 
    mkdir -p /tmp/dir1/dir2 	||创建一个目录树 
    
  4. 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 	||目标文件与源文件有差异时才会复制  
    
  5. mv 命令,该命令用于移动文件、目录或更名,move之意

    mv dir1 new_dir 	||重命名/移动 一个目录,把dir1重命名为new_dir
    mv -f 	||force强制的意思,如果目标文件已经存在,不会询问而直接覆盖  
    mv -i 	||若目标文件已经存在,就会询问是否覆盖  
    mv -u 	||若目标文件已经存在,且比目标文件新,才会更新  
    
  6. rm 命令,用于删除文件或目录,remove之间

    rm -f  	||就是force的意思,忽略不存在的文件,不会出现警告消息 
    rm -i file	||删除文件file,在删除之前会询问是否进行该操作   
    rm -i 	||互动模式,在删除前会询问用户是否操作  
    rm -r 	||递归删除,最常用于目录删除,它是一个非常危险的参数  
    rm -rf dir1 	||删除一个叫做 'dir1' 的目录并同时删除其内容 
    rm -rf dir1 dir2 	||同时删除两个目录及它们的内容 
    
  7. 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  
    
  8. pwd 命令,显示工作路径

  9. tree 命令,显示文件和目录由根目录开始的树形结构(1)

  10. lstree 命令,显示文件和目录由根目录开始的树形结构(2)

  11. ln -s file1 lnk1 命令,创建一个指向文件或目录的软链接

  12. ln file1 lnk1 命令,创建一个指向文件或目录的物理链接

  13. cat命令,用于查看文本文件的内容,后接要查看的文件名,通常可用管道与more和less一起使用,从而可以一页页地查看数据。

    cat text | less 	||查看text文件中的内容  
    # 注:这条命令也可以使用less text来代替 
    

摘自linux最常用的20个命令