Vim基础学习

作者: WhiteStruggle | 来源:发表于2020-08-09 11:06 被阅读0次

    简介

    Vim编辑程序有三种操作模式

    • 编辑模式
    • 插入模式
    • 命令模式

    Vim 的 -b 选项是告诉 Vim 打开的是一个二进制文件

    基本操作

    1. i 进入插入模式,输入内容
    2. Esc 退出编辑
    3. 输入 :wq + Enter 退出保存

    编辑模式

    Vim编辑方式的主要用途是在被编辑的文件中 移动光标 的位置。

    可以进行 剪切粘贴正文块,删除正文和插入新的正文

    跳转

    → 或 k          # 上移
    ← 或 j          # 下移
    ↑  或 h          # 左移
    ↓  或 l          # 右移
    
    #       当光标停留在 单词上 ,# 会在文件内搜索该单词,每按一次就会跳转到 "上一个"
    
    *       当光标停留在 单词上 ,* 会在文件内搜索该单词,每按一次就会跳转到 "下一个"
    
    |       跳转到 "当前行开头"
    0       数字零,跳转到 "当前行开头"
    
    $       跳转到 "当前行末尾"
    
    段落区分:即通过空行进行分割,每一块称为一个段落
    {       跳转到 "当上一段落结尾",若为开头,就跳转当 "前段落开头"
    }       跳转到 "当前段落结尾"
    
    
    g_      跳转到本行最后一个不是 blank 字符的位置。
    
    G         跳转到 "最后一行开头"
    gg        跳转到 "第一行开头"
    nG 或 ngg 跳转到 "第n行"
    例如: 
          4G    # 表示跳转到第四行
          5gg   # 表示跳转到第五行
          
    L       跳转到 "屏幕最后一行"
    M       跳转到 "屏幕中间行"
    H       跳转到 "屏幕的第一行"
    
    可以采用 "数字 + L/H"  的方式
    例如: 
        3H    # 表示跳转到当前屏幕的第三行
        2L    # 表示跳转到当前屏幕的倒数第二行
    

    字母移动

    w       移动到 "下一个单词开头"
    
    e       当光标位于 "单词中",会移动到 "单词末尾"
            当光标位于 "单词结尾",会移动到 "下一个单词末尾"
            
    b       当光标位于 "单词中",会移动到 "当前单词开头"
            当光标位于 "单词开头",会移动到 "上一个单词开头"
    

    当内容过多,造成分页时

    ctrl+f      在文件中前移一页(相当于 page down)
    ctrl+b      在文件中后移一页(相当于 page up)
    

    搜索匹配

    /str     # "从前往后" 搜索 str,找到第一个就停止
    
    ?str     # "从后向前" 搜索 str,找到第一个就停止
    

    替换和删除

    替换

    rc          # 用 "字符c" 替换光标位置的内容
    nrc         # 用 "n" 个 "字符c" 替换光标及其后 "n-1" 个字符
    

    删除

    x       # 删除当前光标的字符
    nx      # 删除当前光标的字符以及其后 "n-1" 个字符
    
    dw      # 删除光标及其 "后边" 字符,直到遇到空字符,或结尾
    例如:
            "HelloWorld"  光标在 W 上,删除之后还剩下 "Hello"
            "Hello world" 光标在 e 上,删除之后还剩下 "Hworld"
            "Hello world" 光标在 o 上,删除之后还剩下 "Hellworld"
            "Hello world" 光标在 单词之间的空白 上,删除之后还剩下 "Helloworld"
    ndw     # 删除 光标后 "n 个 单词",包括分隔用到空字符或者换行字符
    例如:
        "this is delete , there are problems" 光标 在this的 h 上 ,键入 "3dw" ,结果还剩下 "t, there are problems"
    
    db      # 删除光标及其 "左边" 字符,直到遇到空字符,或开头
    ndb     # 删除 光标前 "n 个 单词" ,包括分隔用到空字符或者换行字符
    
    dd      # 删除(剪切)所在行,移除删除时留下的空行
    ndd     # 删除(剪切)光标n行,移除删除时留下的空行
    

    常用删除

    d$      # 删除本行 光标之后 的全部内容
    
    d0      # 删除本行 光标之前 的全部内容
    
    J       # 删除本行的回车符( CR ),与下一行合并,用 空格间隔
    

    Vim常规的替换命令有 cs
    ,并由 编辑模式 进入 插入模式

    s       # 删除 "光标处的字符",并开启插入模式
    ns      # 删除 "光标处及其后 n-1 个字符",并开启插入模式
            # 当到达行尾就不再删除
    
    S       # 删除 "本行的全部内容",并开启插入模式
    nS      # 删除 "光标行及其后 n-1 行的全部内容",并开启插入模式
    
    cw 或 cW # 删除光标 "右边" 的内容,直到遇到空格或换行,并开启插入模式
             # 类似于 "dw",但会开启插入模式
    ncw      # 删除 光标后 "n 个 单词",包括分隔用到空字符或者换行字符,并开启插入模式
             # 类似于 "ndw",但会开启插入模式
    
    cb 或 cB # 删除光标 "左边" 的内容,直到遇到空格或换行,并开启插入模式
             # 类似于 "db",但会开启插入模式
    ncb      # 删除 光标后 "n 个 单词",包括分隔用到空字符或者换行字符,并开启插入模式
             # 类似于 "ndb",但会开启插入模式
    
    cd      # 删除 "当前行",并开启插入模式
            # 类似于 "dd",但会开启插入模式
    ncd     # 删除 "n行" ,并开启插入模式
            # 类似于 "ndd",但会开启插入模式
    
    c$      # 删除本行 "光标之后" 的全部内容,并开启插入模式
            # 类似于 "d$",但会开启插入模式
    c0      # 删除本行 "光标之前" 的全部内容,并开启插入模式
            # 类似于 "d0",但会开启插入模式
    

    复制粘贴

    粘贴:

    p       # 小写字母 p,将 "缓冲区" 的内容粘贴到光标的 "后面";
    P       # 大写字母 P,将 "缓冲区" 的内容粘贴到光标的 "前面"。
    

    复制:

    yy      # "复制当前行" 到 "缓冲区"
    nyy     # "复制n行" 到 "缓冲区"
    
    "+yy     # 复制 当前行 到 剪切板
    "+y      # 复制 当前行以及下一行
    "+nyy    # 复制 n行 到 剪切板
    
    "+ 一些vim可能不支持
    查看是否支持clipboard(clipboard 前是 - 号就不支持) :  vim --version | grep "clipboard"
    不支持,就安装图形化界面 :sudo apt-get install vim-gnome
    

    撤销和重复

    u       # 撤销上一步操作
    
    .       # 重复最后一条修正的命令
    

    退出

    ZZ      # 保存并退出vim编辑界面
    

    插入模式

    输入 i 进入插入模式

    i           # 启动插入模式,在光标左侧添加内容
    I           # 启动插入模式,光标移动到所在行开头
    a           # 启动插入模式,光标向右移动一位,然后在左侧添加内容
    o           # 启动插入模式,在光标所在行的下一行产生新行,并跳到新行
    O           # 启动插入模式,在光标所在行的上一行产生新行,并跳到新行
    A           # 启动插入模式,光标跳到所在行末尾
    

    退出

    ESCCrtl+[ 退出插入模式

    命令模式

    在编辑模式下键入 : ,光标就跳到屏幕最后一行,并在那里显示冒号,便进入 命令模式

    :w

    保存当前编辑的文件

    :w
    

    当前文件另存为

    :w 另存文件的路径
    

    :e

    在启动的Vim中打开一个文件

    :e 文件路径
    

    :q

    退出编辑程序

    :q          # 在未修改的情况下退出
    
    :q!         # 放弃所有修改,退出编辑
    

    :wq

    保存并退出

    :wq
    

    :n

    移动光标到指定行

    :n          # 将光标移动到第  n 行
    
    • 数值 用来指定 绝对行号
    • 字符 “.” 表示光标 所在行的行号
    • 字符符 “$” 表示正文最后一行的行号
    :5              # 将光标移动到第  5 行
    :5 w file       # 将第五行写入 file 文件(file文件不能存在)
    :2,5 w file     # 将2 到 5 行的内容写入到 file 文件中(file文件不能存在,原文件的行数必须存在)
    :.,.+5 w file   # 将当前行以及其后 5 行 写入到file文件中
    :1,$ w file     # 将全部内容写入到file文件中(file文件不能存在),相当于 ":w file "
    

    :r

    读取文件内容,插入到光标所在行的后面

    :r              # 将本文件的内容插入到当前光标所在行的末尾
                    # 注意保存,若不保存只会复制上一次保存的内容
    
    :r file         # 将file文件的内容,插入到当前光标所在行的末尾
    

    :f

    查看当前文件的名称、状态

    文件位置,行数,是否保存,光标所在行

    :f
    

    复制当前文件

    :f file         # 将当前文件复制到file
    

    字符串搜索

    字符串搜索,给定字符串,可以通过搜索该字符串,到达 该 字符串出现的行

    正向搜索

    :/str/          # 以光标所在行为基础, 将光标移到下一个包含 字符串str 的行 的开头
    

    反向搜素

    :?str?          # 以光标所在行为基础,将光标移到上一个包含 字符串str 的行 的开头
    

    注意:当要搜索的字符串出现在光标所在行,进行搜索时,会被忽略

    例:

    :?str1?,/str2/ w file 
    :/str1/,?str2? w file 
    :?str1?,?str2? w file 
    :/str1/,/str2/ w file       
    
    # 将匹配到的两行及其之间的行写入 file文件中
    
    注意某些情况下,会产生 "逆向范围",会将这两行之间的所有内容写入到文件file中
    

    正则表达式

    Vim在进行指定字符串搜索时,可以包含特殊含义的字符,这些特殊字符的搜索字符串称为 正则表达式

    ^str           # 搜索以str "开头" 的行
    
    元字符 说明
    . 匹配任意非空字符,不包括换行符
    [abc] 匹配括号内的任意一个字符,可以用 - 表示字符范围
    [^abc] 匹配方括号之外的任意字符
    \d 匹配数字,等同于[0-9]
    \D 匹配数字之外的任意字符,等同于[^0-9]
    \x 匹配十六进制的数字,等同于[0-9A-Fa-f]
    \X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
    \w 匹配数字和字母,等同于[0-9A-Za-z]
    \W 匹配数字和字母以外的任意字符,等同于[^0-9A-Za-z]
    \t 匹配 tab 字符
    \s 匹配空白字符,等同于[ \t],即 空格 和 tab
    \S 匹配非空字符,等同于[^ \t],
    元字符 说明
    * 匹配0-任意个
    \+ 匹配1-任意个
    \? 匹配0-1个
    \{n,m} 匹配n-m个
    \{n} 匹配n个
    \{n,} 匹配n-任意个
    \{,m} 匹配0-m个
    元字符 说明
    $ 匹配行尾
    ^ 匹配行首
    \< 匹配单词词首
    \> 匹配单词词尾

    正文替换

    利用 :s 命令可以实现字符串的替换。

    "%"     # 表示替换范围是所有行,即全文
    
    "s"     # 表示后面跟着一串替换命令
    
    "g"     # 放在命令的末尾,表示对搜索字符串进行替换,(多次替换)
    
    默认情况下,不加 "g" ,表示只对搜索字符串的首次出现进行替换
    
    `g` 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作;
    

    存在问题:当替换的字符串长度大于原字符串,在替换时,覆盖文本中其他字符串

    :s/str1/str2/       # 用 str2 替换 "光标所在行" ,出现的 "首个 str1"
    
    :%s/str1/str2/      # 用 str2 替换   "所有行"  ,出现的 "首个 str1"
    
    :%s/str1/str2/g     # 用 str2 替换   "所有行"  ,出现的 "所有 str1"
    
    :.,$ s/str1/str2/   # 用 str2 替换   "光标所在行到最后一行"  ,出现的 "所有 str1"
    
    :1,$ s/str1/str2/   # 用 str2 替换   "第一行到最后一行"  ,出现的 "所有 str1"
    
    :g/str1/s /str2/g   # # 用 str2 替换   "所有行"  ,出现的 "所有 str1"
    

    统计文件中字符串出现的次数:

    :%s/str1/&/gn
    

    删除正文

    :d              # 删除光标所在行
    :nd             # 删除指定行,n为数字
    :.,$ d          # 删除当前行到结尾的全部内容
    :/str1/ , /str2/d   # 以光标所在行为基准,删除 从 str1 到 str2 的所有行
                        # 若光标所在行以下内容不存在,而光标以上内容,存在则会提示 "逆向范围"
                        # 这个存在着很多的问题,谨慎使用
    

    Vim的删除命令 :d,高级删除命令 一般结合 正则表达式 实现

    恢复文件

    Vim在编辑文件时,会产生一个临时文件,通常以 . 开头,以 .swp 结尾

    Vim正常退出时,该文件会被删除

    若意外退出,没有保存修改,则可以使用 :recover 来恢复文件,也可以在启动 Vim时用 -r选项

    使用vim创建了一个2.txt,但没有保存直接退出
    vim -r /mysh/2.txt
    

    恢复时的提示:

    使用交换文件 "/mysh/.2.txt.swp"
    "/mysh/2.txt" [新文件]
    恢复完毕。请确定一切正常。
    (你可能想要将这个文件另存为别的文件名
    and run diff with the original file to check for changes)
    You may want to delete the .swp file now.
    
    请按 ENTER 或其它命令继续
    

    选项设置

    利用 :set 命令可以设置选项

    语法:
        :set options        # options 选项设置
    

    option取值:

    ignorecase      # 忽略规则表达式中大小写字母的区别
    
    autoindex       # 正文自动缩进
    
    number          # 显示正文行号
    
    ruler           # 在屏幕底部显示光标坐在行 、列的位置,应该不需要设置吧,默认就显示
    
    tabstop         # 设置tab键,跳过的空格数
    

    Shell切换

    在vim中执行执行linux命令

    :!linux命令     # 执行完linux命令,会返回vim界面
    

    分屏

    打开一个Vim程序只能查看一个文件,若想要查看多个文件,需要使用 Vim分屏与标签页功能

    分屏:

    :split     简写: :sp      # 上下分屏
    
    :vsplit    简写: :vsp     # 左右分屏
    

    启动 Vim 时分屏

    
    

    切换分屏

    Crtl+w+k        # 切换到上分屏
    Crtl+w+j        # 切换到下分屏
    
    
    Crtl+w+h        # 切换到左分屏
    Crtl+w+l        # 切换到右分屏
    
    Ctrl+w+w        # 来跳转分屏,方向则是在当前Vim窗口所有分屏中,按照逆时针方向跳转。
    

    设置分屏的长 宽

    Ctrl+W =            # 设置分屏的宽高平均分配
    Ctrl+W +            # 增加当前分屏的 "高度"
    Ctrl+W -            # 降低当前分屏的 "高度"
    
    Ctrl+W >            # 增加当前分屏的 "宽"
    Ctrl+W <            # 降低当前分屏的 "宽"
    

    标签页

    一个标签页打开一个Vim的窗口,一个Vim的窗口可以支持N个分屏。

    新建标签命令:

    :tabnew
    或
    :tabe
    

    新建标签页并打开一个文件

    :tabnew 文件路径
    或
    :tabe 文件路径
    

    Vim的每一个标签都有唯一的数字标号,第一个标签页的序号是 0,从左向右依次 +1

    
    :tabn           # 跳转到 "下一个" 标签
    :tabn n         # 跳转到 当前页"右边第 n 个" 标签
    
    :tabN           # 跳转到 "上一个" 标签
    :tabN n         # 跳转到 当前页"左边第 n 个" 标签
    
    :tabp           # 跳转到 "上一个" 标签
    :tabp n         # 跳转到 当前页"左边第 n 个" 标签
    
    :tabr           # 跳转到 "第一个" 标签
    :tabfir         # 跳转到 "第一个" 标签
    
    :tabl           # 跳转到 "最后一个" 标签
    
    :tabc           # 关闭当前标签
    :tabo           # 关闭除了当前的所有标签 ( 关闭前都需要保存,否则不能关闭 ) 
    
    :tabm n         # 跳转到 "第 n 个" 标签
    
    :tabf path      # 在打开的标签页中 寻找 'path' ,
                    # 若 'path' 的路径下文件已经打开,就跳转
                    # 若 'path' 的路径下文件没有打开,则会直接打开
                    # 若 'path' 的文件不存在,就会报错
                    
    :tabs           # 查看当前打开的所有标签页的信息
    
    :tabdo                  为每个标签页执行命令
    

    参考: Vim入门基础

    相关文章

      网友评论

        本文标题:Vim基础学习

        本文链接:https://www.haomeiwen.com/subject/zldldktx.html