Vim常用指令

前言:
  这篇博文整理记录常用的Vim指令,方便查询。

  • 设置tab为4个空格
    :set tabstop=4

  • 设置换行自动缩进为4个空格
    :set shiftwidth=4

  • 设置显示行号
    :set number

  • 撤销指令(undo)
    普通模式下按u

  • 以root权限运行gvim(否则无文件写入权限)

  • 保存文件
    :w :w!

  • 退出gvim
    :q :q!

  • 插入模式
    光标字符前进入插入模式: i
    光标字符后进入插入模式: a

    光标所在行行首进入插入模式: I
    光标所在行行末进入插入模式: A

    光标下插入新行进入插入模式o
    光标上插入新行进入插入模式O

  • 运行dos指令
    :!cmd
    :! dir /w

  • 切换目录
    :cd E:\

  • 打开文件
    :edit .\DebugLog.h不错在则新建

  • 隐藏或显示菜单栏
    :set guioptions-=m(m小写)
    :set guioptions+=m

  • 隐藏或显示工具栏
    :set guioptions-=T(T大写)
    :set guioptions+=T

  • 左右缩进
    【shift】 <</<<

    多行缩进:
    在可是模式下选中多行【shift】 >/<

  • 分屏打开文件(文件不存在则新建)
    水平分屏:split .\Debug.c
    垂直分屏:vsplit .\Debug.c

  • Undo和Redo
    Undo:普通模式下按u
    Redo:普通模式下按【ctr】 + r

  • 分屏切换
    循环切换ctr w + w
    按方向切换窗口ctr w + k/j/h/l

  • 分屏窗口移动
    按方向移动窗口(移动到最边上)ctr w + K/J/H/L(编程大写)

  • 文件浏览器
    Explore
    窗口浏览器中打开选中的文件(当前路径):
    按回车则打开选中文件(不分屏打开文件,如果是目录则进入该目录)
    o则水平分屏打开选中文件
    v则垂直分屏打开选中文件

  • 可是模式下复制选中的文本
    y

  • 删除游标所在位置的一个单词
    daw(会放入缓存)

  • 复制游标坐在位置的一个单词
    yaw

  • 复制游标所在整行(结尾带换行符)
    yy

  • 分屏窗口修改高度和宽度
    修改高度:
    游标所在需要移动的窗口内输入指令ctr w + -/+注意是+号不是=,需要按住shift打出+号。
    修改宽度:
    游标所在需要移动的窗口内输入指令ctr w + </>

  • 屏幕行与实际行的游标移动
    实际行移动:k/j/h/l 对应上下左右

    屏幕行移动:g + k/j 对应上下移动行; g + 0/$ 对应移至屏幕行行首和尾。

  • 屏幕滚动一行
    往下:ctr + e
    往上:ctr + y

  • 跳转到指定行
    普通模式下行数 + G
    命令模式下:行数

  • 快速跳转到文件首尾巴
    跳转到文件首: gg
    跳转到文件尾: G

  • 显示行末换行符
    显示: set list
    不显示: set nolist

  • 替换游标处的一个字符,并且仍然处于普通模式
    r

  • 删除游标处一个字符,并且删除后在该位置进入编辑模式
    s

  • 当前文件搜索游标处字符串
    shift + *

  • 复制从游标开始往下的n行到缓冲区
    nyy yny

  • 删除n行
    dnd

  • 游标移动到行首(普通模式)
    移动到下一行行首: +
    移动到上一行行首: -

  • 从当前游标位置开始复制到行首或行末
    复制至行首(不含游标所在处字符): y0
    复制至行末(含游标所在处字符): ·y$`

  • 从当前游标位置开始删除到行首或行末
    删除至行首(不含游标所在处字符): d0
    删除至行末(含游标所在处字符): ·d$`

  • 游标移动到行末(首)(普通模式)
    行末$
    行首0

  • 跳到下(上)一个字符串的首(尾)部
    下一个字符串首: w
    上一个字符串首: b
    下一个字符串尾: e
    上一个字符串尾: ge

  • 文件内字符串全替换
    把字符串abc全部替换为123: %s/abc/123/g

  • 选中多行的列
    ctr + v

  • 分屏高度调为最大
    ctr w + _

  • 分屏宽调为最大
    ctr w + |

  • 当前文件内搜索字符串
    命令模式下输入/string即可语法高亮string字符串,高亮后普通模式下n跳到下一个搜索结果,N跳到上一个。

  • 选中游标位置至词末
    普通模式下v + e

  • 改变光标处字母的大小写
    ~

  • 光标跳转到上一次跳转的位置
    按两次`

  • 代码折叠
    在可是模式下选中代码块输入zf即可折叠代码,输入空格即可展开折叠。

  • 头文件与源文件之间切换(需要安装插件a.vim,官网下载后直接拷贝到插件目录plugin文件夹中,注:vim需要重启一下插件才能生效。下载地址:https://www.vim.org/scripts/script.php?script_id=31)
    :A 在新Buffer中切换到c/h文件
    :AS 横向分割窗口并打开c/h文件
    :AV 纵向分割窗口并打开c/h文件
    :AT 新建一个标签页并打开c/h文件

  • 标签页操作
    在新标签呀打开编辑一个文件:tabedit filename
    跳转到下一个标签页gt
    跳转到上一个标签页gT

  • 在定义和声明处跳转(需要安装插件ctags.exe,官网下载后解压,解压可看到一堆文件而我们只需要把ctags.exe拷贝到gvim的安装根目录下即可,若要拷贝到其他路径则需要让gvim能找到它而修改vimrc文件或者添加路径到环境变量里。注:插件需要重启gvim才能生效。下载地址:https://sourceforge.net/projects/ctags/files/ctags/5.8/ctags58.zip/download)

    • 在使用跳转命令前请将gvim给cd到你的工程目录(最好是根目录)然后执行一次命令:!ctags -R就会在路径下生成文件tags,该文件记录了相关的关键词跳转信息。注:修改了代码后需要再次执行该命令来更新ctags文件,也即更新跳转的信息。
    • 有了ctags后跳转命令为ctr + ]
  • 使用TagList浏览代码(需要安装插件taglist.vim,官网下载后解压,里面有帮助文档taglist.txt和taglist.vim脚本文件,将其放到gvim相应路径(doc、plugin)下即可使用,注:插件需要重启gvim才能生效。下载地址:https://www.vim.org/scripts/script.php?script_id=273)
    注意:使用此插件之间需要先安装ctags
    注意:taglist.txt直接拷贝到doc路径下,在vim中执行指令:help taglist.txt并不会打开帮助文档,需要先把它加入到doc下的tags文件里,也即生成帮助标签,执行指令如helptags C:\cpy\Softs\Install\gvim81\Vim\vim81\doc,后面是doc的路径。

    打开taglist视图:TlistOpen

    在_vimrc文件中添加指令let Tlist_Show_One_File = 1则可使taglist中一次只显示一个文件的信息。

    折叠taglist中一项-
    展开taglist中一项+
    折叠taglist中全部项=
    展开taglist中全部项*

  • 快速打开编辑_vimrc文件。
    输入指令:edit $vim/_vimrc

  • 语法补全
    gvim81似乎已经自带相关插件了,可以直接使用ctr + x, ctr + n自动补全功能。
    为了方便和美观我们在_vimrc文件中添加如下设置。

      imap <TAB> <C-X><C-N>
      highlight Pmenu    guibg=darkgrey  guifg=black
      highlight PmenuSel guibg=lightgrey guifg=black
    

    如此就能改变框的颜色和将自动补全快捷键设置为tab键了。

    向后切换成员: Ctrl+N
    向前切换成员: Ctrl+P

  • 分隔当前窗口
    水平分割: split
    垂直分割: vsplit

  • 当前分屏和下一个分屏交换位置
    ctr + w x

  • 关闭当前文件并打开上次打开的文件(多次按可继续打开之前打开过的文件)
    ctr + o

  • 当前文件跳转到光标所在字符串的定义处,并高亮文件内该字符串。
    gd

  • 打开上次关闭gim时的文件。这个功能需要安装一个插件mru.vim,下载好后直接拷贝到pulugin目录下即可(下载地址: https://www.vim.org/scripts/script.php?script_id=521)
    MRU输入该指令会将上次关闭vim时还处于打开的文件列表显示。

  • 打开vim保持上次关闭的设置(保持窗口视图、全局设置、文件打开状态,也即窗口布局和上次关闭时一致)
    输入指令: mks! Session.vim会自动在当前目录下创建一个文件Session.vim,该文件记录窗口的布局,下次打开vim只需加载该文件就能还原。 打开指令,在windows下输入cmd指令gvim -S Session.vim`
    注意Tlist和Explore窗口并不会记录打开,要想启动vim自动打开需要在_vimrc文件中添加指令

  • 修改分屏宽度
    vertical res 30

  • 推出vim软件
    exit

  • vim显示目录树(实现该功能需要安装插件NERD_tree.vim,该插件可以将文件夹里的文件折叠或展开显示,而vim自带的文件浏览器Explore一次只能浏览一个文件夹下的文件,下载地址为:https://www.vim.org/scripts/script.php?script_id=1658)
    解压压缩包,解压出的文件将其拷贝到vim安装路径下的对应目录中即可,注插件要重启vim才能生效)
    重启vim时会报错,错误如下:
    “处理 C:\cpy\Softs\Install\gvim81\Vim\vim81\plugin\NE
    RD_tree.vim 时发生错误:

    第 68 行:

    E117: Unknown function: nerdtree#runningWindows

    E116: Invalid arguments for function 22_initVari
    able

    第 69 行:

    E114: 缺少引号: “鈻?)

    E116: Invalid arguments for function 22_initVari
    able

    第 70 行:

    E114: 缺少引号: “鈻?)

    E116: Invalid arguments for function 22_initVari
    able

    第 96 行:

    E117: Unknown function: nerdtree#runningWindows

    E15: 无效的表达式: nerdtree#runningWindows()

    第 141 行:

    E117: Unknown function: nerdtree#loadClassFiles

    第 145 行:

    E117: Unknown function: nerdtree#ui_glue#setupCom
    mands

    第 151 行:

    E121: 未定义的变量: g:NERDTreeCreator

    E15: 无效的表达式: “autocmd BufLeave “. g:NERDTreeCr
    eator.BufNamePrefix() .”* if g:NERDTree.IsOpen() | call
    b:NERDTree.ui.saveScreenState() | endif”

    第 154 行:

    E121: 未定义的变量: g:NERDTreeCreator

    E15: 无效的表达式: “autocmd BufEnter “. g:NERDTreeCr
    eator.BufNamePrefix() .”* stopinsert”

    第 205 行:

    E117: Unknown function: nerdtree#postSourceActions

    这是由于文件内有一些无法识别的符号,可以尝试使vim支持显示这些字符或者将这些字符修改为vim能支持的。

    使其支持这些符号的办法是在_vimrc中添加如下代码:

      set encoding=utf-8
      set termencoding=utf-8
      set fileencoding=chinese
      set fileencodings=ucs-bom,utf-8,chinese
      set langmenu=zh_CN.utf-8
      source $VIMRUNTIME/delmenu.vim
      source $VIMRUNTIME/menu.vim
      language messages zh_cn.utf-8
    

    如果折叠或展开的三角形字符显示出错,应该是当前使用的字体不出吃显示该字符,可以修改字体如:
    set guifont=Consolas:h10

    其他一些设置可以如下:

      "Show line number.
      let g:NERDTreeShowlineNumber=1
      "Show hide file.
      let g:NERDTreeHidden=0
      "Show Node model.
      let NERDTreeDirArrows=1
    

    注意帮助文档NERD_tree.txt拷贝到doc目录下,在vim中运行指令help NERD_tree.txt并不能打开它,需要输入指令更行tags文件,指令为:helptags C:\cpy\Softs\Install\gvim81\Vim\vim81\doc

  • 设置vim窗口大小
    set lines=30
    set columns=120

  • 安装配置好的vim可以将整个路径连同相关配置文件拷贝到其他电脑使用,免安装。

  • 使用winmanager插件将NERDTree和TagList合并显示(需要安装插件winmanager.vim,下载地址为:https://www.vim.org/scripts/script.php?script_id=95,将安装包加压后文件丢到vim相应路径下即可,插件需要重启vim才会生效)。
    一下是我的winmanager配置:

      let g:NERDTree_title='[NERDTree]'
      let g:winManagerWindowLayout="NERDTree|TagList"
      let g:winManagerWidth=30
      let g:AutoOpenWinManager=1
      nmap <silent> <F2> :if IsWinManagerVisible() <BAR> WMToggle<CR> <BAR> else <BAR> WMToggle<CR>:q<CR> endif <CR><CR>
    
      function! NERDTree_Start()
          exec 'NERDTree'
      endfunction
    
      function! NERDTree_IsValid()
          return 1
      endfunction
    

    用winmanager打开NERDTree会自动打开一个空白的窗口,为了将其关闭所以在快捷键处设置。

  • 禁止vim生成备份文件
    set noundofile
    set nobackup
    set noswapfile

  • 安装YouCompleteMe

    安装YCM前首先安装git和Vundle。

    github在国内重官网下载非常慢,可以选择从代理服务器下载:http://npm.taobao.org/mirrors/git-for-windows/

    在vim的安装路径下执行cmd命令:git clone https://github.com/VundleVim/Vundle.vim.git vimfiles/bundle/Vundle.vim即可完成Vundle下载

    在_vimrc文件开头插入如下配置:

      set nocompatible              " be iMproved, required
      filetype off                  " required
    
      set rtp+=$VIM/vimfiles/bundle/Vundle.vim/
      call vundle#begin('$VIM/vimfiles/bundle/')
    
      " let Vundle manage Vundle, required
      Plugin 'VundleVim/Vundle.vim'
    
      " All of your Plugins must be added before the following line
      call vundle#end()            " required
      filetype plugin indent on    " required
    

    vim中输入指令VundleInstall安装插件。

    然后安装好python、LLVM和cmake并添加好环境变量。

    LLVM的安装(有两种形式,一种是下载源码后自己编译,但这种办法可能存在编译报错而且编译很慢。另一种办法是下载官方编译好后的二进制文件):

    下载源码自己编译:

    先下载源码(不推荐此法):
    http://releases.llvm.org/download.html
    LLVM source code
    Clang source code
    compiler-rt source code

    将llvm-6.0.0.src.tar.xz解压,将cfe-6.0.0.src.tar.xz解压,文件夹重命名为clang,然后放到llvm-6.0.0.src/tools目录下,将compiler-rt-6.0.0.src.tar.xz解压,文件夹重命名为compiler-rt,放置到llvm-6.0.0.src/projects目录下。创建build文件夹。

    下载二进制文件,直接解压即可(其实只是为了要libclang.lib这个文件)。

    cmake安装:

    下载路径:https://cmake.org/download/ (国外网站特别慢)

    下载windows版64位压缩包格式即可。

    按此博客https://blog.csdn.net/pl19920614/article/details/54143499?utm_source=blogxgwz1中的设置编译。

    最后用vs打开生成的LLVM.sln,使用Release模式编译,最后生成的结果在Release文件夹下(注意第一次编译时间会非常长,我自己的电脑用了快一个小时才编译完!)。

    编译:

    在YouCompleteMe\third_party路径下新建build文件夹即YouCompleteMe\third_party\build在该路径下执行指令:cmake -G "Visual Studio 15 2017 Win64" -EXTERNAL_LIBCLANG_PATH="C:\cpy\Softs\Install\LLVM\bin\libclang.dll" -DUSE_SYSTEM_LIBCLANG=ON -DPATH_TO_LLVM_ROOT="C:\cpy\Softs\Install\LLVM" ..\ycmd\cpp

    成功后可以看到build路径下有个*.sln文件,用vs打开它编译(建议也在release模式下,当然也可是使用输入指令用cmake编译),选中ALL_BUILD这项编译。编译成功后在ymd路径下release目录里有。我这里没用vs编译,而是继续在build目录下使用指令cmake --build . --target ycm_core --config Release third_party\ycmd目录下出现ycm_core.pyd

    运行gvim结果有红色的字报错,提示ycm挂掉了。The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). Unexpected exit code 1. Type ':YcmTogglelogs ycmd_51691_stderr_em_jpj.log' to check the logs.
    我们在gvim里输入:YcmDebugInfo可以看到一些log日志的保存位置,我们打开详细看看错误原因,试了下文件都是空的!试者到YCm根目录执行指令python install.py --clang-completer发现一闪而过(这个命令是编译c++补全支持的)

    报这个错的原因其实是python还差一个模块urllib3未安装,去下载(https://github.com/urllib3/urllib3)好后执行到解压目录下执行指令`python setup.py install安装即可。继续执行之前的指令python install.py –clang-completer`这次就能正确的执行安装了。

    重新执行指令python install.py虽然没有报错,但是打开gvim后下方还是有红色字体报错:The ycmd server SHUT DOWN (restart with ‘:YcmRestartServer’). Unexpected exit code 1. Type ‘:YcmTogglelogs ycmd_51691_stderr_em_jpj.log’ to check the logs.

    试者执行指令python install.py --rust-completer,发现报错:ERROR: Unable to find executable ‘cargo’. cargo is required for the Rust completer.

    应该是缺文件了,果断重新装。