使用Linux的同学们都应该用过vim。vim用的熟练绝对是可以事半功倍。这里我们不讨论编辑器孰优孰劣,只是列出一些vim常用命令和使用技巧,方便大家查询。

基本命令

  1. 最基本的操作

    i          当前光标处插入
    a          当前光标后插入
    x          删除当前光标所在的一个字符
    :w         存盘
    :q         退出
    :wq        存盘并退出
    :x         存盘并退出,同:wq
    :q!        强制退出
    
  2. 光标操作

    0         数字0,移到行首
    ^         移到当前行的第一个非空白符
    $         移到行尾
    -         移到上一行的行首
    +         移到下一行的行首
    w         移到下一个单词,将空白符和标点符号,括号等都视为单词分割符
    W         移到下一个单词,只将空白符视为单词分割符
    b         移到上一个单词,将空白符和标点符号,括号等都视为单词分割符
    B         移到上一个单词,只将空白符视为单词分割符
    e         移到当前字符的词尾,将空白符和标点符号,括号等都视为单词分割符
    E         移到当前字符的词尾,只将空白符视为单词分割符
    3G        移到第3行行首
    :3        同上,移到第3行行首
    G         移到最后一行行首
    gg        移到第一行行首
    Ctrl+f    向下翻页
    Ctrl+b    向上翻页
    
  3. 复制粘贴

    v/V            进入可视化(Visual)模式,可上下左右选择高亮区间,小写v按字母选择,大写V按行选择
    d/y            在可视化模式中,d剪切高亮区间,y复制高亮区间
    yy             复制当前行的内容
    p/P            小写p在当前位置后粘贴,大写P在当前位置前粘贴
    :n1,n2 co n3   将n1行到n2行间的内容(包括n1和n2行)复制到第n3行的下方
    :n1,n2 m n3    将n1行到n2行间的内容(包括n1和n2行)移到第n3行的下方
    
  4. 插入命令

    I          当前光标所在行的行首插入
    A          当前光标所在行的行尾插入
    o          当前光标所在行的下面另起一行,光标停留在新行行首,并等待插入
    O          大写字母O,当前光标所在行的上面另起一行,光标停留在新行行首,并等待插入
    
  5. 删除命令

    X          删除当前光标前面的那个字符
    dd         删除当前行,并把删除的行存到剪贴板里
    d^         删除从当前位置至行首的内容,不包括光标位
    d$         删除从当前位置到行尾的内容,包括光标位
    D          同上,删除从当前位置到行尾的内容,包括光标位
    dw         删除从当前位置到光标当前所在的单词尾的内容
    dG         删除从当前行到文档结尾的所有内容,包括当前行
    dgg        删除从当前行到文件头的所有内容,包括当前行
    di[sign]   [sign]可以是(),[],{},',"。当光标在括号或引号的范围内,该命令可以删除括号或引号里的内容
    dt[sign]   [sign]可以是任意符号。如果在光标后同一行上存在这个符号,则删除从光标开始到符号前的内容
    :n1,n2 d   将n1行到n2行间的内容(包括n1和n2行)删除
    
  6. 撤销回复操作

    u          Undo,撤销上一步操作,可反复撤销
    Ctrl+r	   Redo,恢复下一步操作,可反复恢复
    :e!        撤销之前所有操作,重新编辑当前文件
    
  7. 查找

    /string    向后查找字符串"string"
    ?string	   向前查找字符串"string"
    
  8. 文件操作

    :e file           打开文件file
    :r file           将文件file内容复制到当前光标处
    :w file           另存为文件file
    :n1, n2 w file    将n1行到n2行间的内容另存为文件file
    
  9. 屏幕操作

    zz        将当前行置为屏幕正中央
    zt        将当前行置为屏幕顶端
    zb        将当前行置于屏幕底端
    Ctrl+g    显示当前行列号
    

参数设置

  1. 设置格式

    :set number           每行行首显示行号
    :set nu               同上,每行行首显示行号
    :set ruler            屏幕右下角显示行列号
    :set tabstop=4        将tab的显示宽度定位4个空格,默认为8
    :set softtabstop=4    根据情况决定按tab时插入空格还是制表符,如设为4,按1次tab为4个字符,按2次为1个制表符
    :set expandtab        用空格替代tab,空格的个数由上面softtabstop设置确定,默认为8
    :syntax on            开启语法高亮显示
    :set syntax=java      指定语法高亮的程序语言
    :set showmatch        高亮显示括号(), [], {}的匹配情况
    :set encoding=utf-8   设置字符编码
    :set history=50       设置保留历史个数
    :set vb               即visualbell,用屏幕闪烁代替bi的提示音
    :set noeb             即noerrorbells,不发出bi的错误提示音
    :set no[option]       将设置取消,[option]可以是上述所有不使用赋值操作的设置选项
    
  2. 保存格式设置。将上一步的设置存放到用户根目录.vimrc文件里

    $ vi ~/.vimrc
    

高级技巧

  1. 通用技巧

    .                重复上一个命令
    n[command]       将"command"命令重复执行n次。如:
    3dd              删除从当前行开始往下的3行
    5yy              复制从当前行开始往下5行的内容
    
  2. 缩进

    :set autoindent     设置自动缩进,新增加的行和前一行使用相同的缩进形式
    :set cindent        设置自动缩进,可以很好的识别出C和Java等结构化程序设计语言
    :set smartindent    设置自动缩进,新增加的行和前一行使用相同的缩进形式,并可自动识别出花括号
    :set shiftwidth=4   设置缩进宽度为4个字符,默认为8
    >>                  对当前行增加缩进
    >G                  对从当前行到文件结尾的所有行增加缩进
    <<                  对当前行减少缩进
    <G                  对从当前行到文件结尾的所有行减少缩进
    ==                  对当前行自动缩进
    =G                  对从当前行到文件结尾的所有行自动缩进
    5==                 对从当前行开始往下5行自动缩进,<<和>>操作也相同
    
  3. 插入模式下自动补全

    Ctrl+n           单词自动补全,根据已经输入的字母,列出上下文已有的相近单词,默认选中列表中第一个
    Ctrl+p           单词自动补全,根据已经输入的字母,列出上下文已有的相近单词,默认选中列表中最后一个
    Ctrl+x Ctrl+k    单词自动补全,根据已经输入的字母,列出词典中的相近单词
    Ctrl+x Ctrl+l    行自动补全,根据已经输入的字母,列出上下文已有的相近行
    Ctrl+x Ctrl+f    文件名自动补全,根据已经输入的字母,列出当前目录下的文件名
    :set dictionary=./dict.txt      设置词典文件,文件中每行一个单词
    :set dictionary+=./dict.txt     添加词典文件
    :set dictionary-=./dict.txt     去除词典文件
    
  4. 格式转换

    :%!xxd           按十六进制查看当前文件
    :%!xxd -r        从十六进制返回正常模式
    
  5. 内容与命令映射

    :ab [abbr] [phrase]    定义缩写,用于插入模式中替换内容。如:ab ma int main() {
    :ab                    列出当前已定义的所有缩写
    :unab                  撤销缩写定义。如:unab ma
    :map [co] [commands]   命令映射,用于普通模式中替换命令组合,如:map f yyp,按f键会复制当前行
    :map                   列出当前已定义的所有命令映射
    :unmap                 撤销命令映射定义。如:unmap f
    :mapclear              清空所有已定义的命令映射
    :noremap               避免递归的命令映射,防止map b a, map c b后,c等同于a的情况
    :imap                  插入模式中的内容映射,等同于ab
    :vmap                  Visual模式中的命令映射
    :map <c-a> <esc>ggVG   实现类似于Windows下的Ctrl+a全选
    :inoremap ( ()<esc>i   插入模式下输入"("后自动补全")",同理还可以实现"[","{"
    
  6. 字符替换

    :retab!         将所有Tab转换为空格
    :%s/aaa/bbb/g   将文档中所有"aaa"字符串替换为"bbb",这里支持正则表达式
    gU              将当前字符转化为大写
    gu              将当前字符转化为小写
    gUw             将当前光标后面的单词转化为大写;guw则转化为小写
    gUnw            n为数字,如gU5w,将当前光标后面的5个单词转化为大写;gu5w则转化为小写
    gU0             从光标所在位置到行首,都转化为大写;gu0则转化为小写
    gU$             从光标所在位置到行尾,都转化为大写;gu$则转化为小写
    gU1G            从光标所在位置到文章第一个字符,都变为大写;gu1G则转化为小写
    gUG             从光标所在位置到文章最后一个字符,都变为大写;guG则转化为小写
    gggUG           所有字符都转化为大写,gg即光标移动到文件首字符,gU转化为大写,G一直到文件末尾
    
  7. 其他技巧

    */#              移动到与光标当前单词所匹配的单词,*移动到上一个,#移动到下一个
    gd               移动到光标当前单词第一次出现的位置,可用于查找变量或函数的声明
    %                移动到与当前括号"(, [, {"相匹配的括号,光标行上必须有括号
    :w !sudo tee %   使用管理员权限将当前文件保存
    :!gcc %          不退出vim,用gcc命令执行当前文件,"!"后可以是任意Shell命令,可不加%而指定文件名
    :r !date         读取系统时间并插入到当前行的下一行,"!"后可以是任意Shell命令
    :%TOhtml         分割一个新窗口,并在其中生成一个HTML来显示当前文本的内容
    

分屏操作

  1. 开启分屏

    $ vi -o f1 f2     打开f1和f2两个文件并分屏显示。小写o上下分屏,大写O左右分屏。可以打开两个以上文件
    :sp [file]        上下分屏打开文件file,没有[file]则表示将当前文件显示两屏
    :vsp [file]       左右分屏打开文件file,没有[file]则表示将当前文件显示两屏
    :new [file]       上下分屏创建一个新文件file,没有[file]则保存时需输入文件名
    :vnew [file]      左右分屏创建一个新文件file,没有[file]则保存时需输入文件名
    
  2. 分屏中的操作

    Ctrl+w w           按住Ctrl键并按两次w,在分屏窗口中切换
    Ctrl+w 方向键       按Ctrl+w后按方向键,切换到指定方向的屏幕
    Ctrl+w s           按Ctrl+w后按s,对当前文件分屏。等同于:sp
    Ctrl+w o           按Ctrl+w后按o,关闭其他分屏,仅显示当前屏的内容
    Ctrl+w q           按Ctrl+w后按q,关闭当前的分屏。如果当前只有一个屏,则等同于:q
    :ls                列出所有已打开的文件
    :bn                将当前屏的内容切换到已打开文件列表中的下一个文件
    :bp                将当前屏的内容切换到已打开文件列表中的上一个文件
    :b#                将当前屏的内容切换到已打开文件列表中的第#个文件
    
  3. 分屏中的文件比较

    $ vi -d f1 f2      左右分屏打开f1和f2两个文件,并对两个屏内容作比较
    :difft             先在第一个屏输入:difft,再切换到第二个屏输入:difft,即可对这两个屏的内容作比较
    :diffs file        上下分屏打开文件file,将当前屏的内容和新的屏作比较
    :vert diffs file   左右分屏打开文件file,将当前屏的内容和新的屏作比较
    :diffo             当前屏退出比较
    :diffo!            所有屏都退出比较
    :diffu             刷新比较信息
    ]c                 光标移到下一个diff点,前面加上数字可跳过多个diff点
    [c                 光标移到上一个diff点,前面加上数字可跳过多个diff点
    dp                 将当前行的diff内容复制到另一个屏中
    do                 将另一个屏中的diff内容复制到当前行