Vim使用教程Windows版

01.下载安装及配置环境变量

  1. 下载GVim

    Vim官网:[https://www.vim.org/]

    为了方便,这里我直接选择了压缩包。然后将文件解压到想要放置的位置。

  2. 配置环境变量

    解压后文件名称为vim91,代表9.1版本,但此时power shell中还不可以使用vim和gvim命令,需要配置环境变量。

    在系统的Path环境变量下添加一项,路径为文件夹vim91的路径(包含vim91文件夹)。

    然后在power shell中使用vim命令和gvim命令查看是否配置成功,如果可以使用这两个命令则安装成功。

02.创建vim配置文件

在vim91同级目录下(和vim91在同一个路径)创建名为_vimrc的文件,在文件中输入下面的内容:

1
2
3
4
5
filetype off  
set shellslash
set number
set nocompatible
filetype plugin indent on

配置解释:

  • filetype off: 关闭文件类型检测,在 Vim 配置中通常用于插件配置的初期阶段。这样做的主要目的是防止 Vim 自动加载与文件类型相关的插件、缩进或语法高亮设置,直到你完成自定义插件的配置。这在使用插件管理器(如 Vundle、Pathogen 或其他)时特别重要,因为它们通常会管理与文件类型相关的插件。

  • set shellslash: 在 Windows 系统上,这会使 Vim 使用正斜杠(/)作为路径分隔符,而不是默认的反斜杠(\)。

  • set number: 显示行号

  • set nocompatible: 关闭 Vim 的兼容模式,这意味着 Vim 不会尝试兼容旧版本的 Vi。

  • filetype plugin indent on: 开启文件类型检测,并且根据文件类型自动加载相应的插件和缩进设置。

03.使用vundle插件管理器

Github地址:[https://github.com/VundleVim/Vundle.vim]

在GitHub项目的说明文件中,可以找到如何使用vundle

在上面的内容中可以看到,首先将项目克隆到本地,然后在配置文件中添加一些配置,之后便可以使用vundle了

  • 使用下面的命令将项目克隆到本地

    https://github.com/VundleVim/Vundle.vim.git ~/vimfiles/bundle/Vundle.vim

    这里我没有把项目clone到~/文件夹下,而是和vim91放到了同级文件夹下,

  • _vimrc中添加下面的配置

    1
    2
    3
    4
    5
    6
    7
    set rtp+=D://Vim/vimfiles/bundle/Vundle.vim/
    call vundle#begin('D://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

    解释:

    • set rtp+=D://Vim/vimfiles/bundle/Vundle.vim/:将指定的路径添加到 ‘runtimepath’(rtp),这是 Vim 查找插件和其他运行时文件的路径。这里特别是为 Vundle 插件管理器设置路径。
    • call vundle#begin(‘D://Vim/vimfiles/bundle/‘): 使用指定的路径初始化 Vundle 插件管理器。
    • call vundle#end(): 结束 Vundle 插件的声明。
    • Plugin ‘VundleVim/Vundle.vim’: 声明 Vundle 插件自身,这是必须的。

    之后管理的插件就写在call vundle#begin(‘D://Vim/vimfiles/bundle/‘)和call vundle#end()的中间。

如何查看是否可以用Vundle插件:

使用vim打开一个文件,在命令模式下使用:PluginInstall命令,如果命令可以使用,则代表Vundle插件管理器配置成功,否则检查相关路径是否配置正确

04._vimrc文件的配置

这里解释_vimrc文件中各种配置的含义:

  • filetype off: 关闭文件类型检测,在 Vim 配置中通常用于插件配置的初期阶段。这样做的主要目的是防止 Vim 自动加载与文件类型相关的插件、缩进或语法高亮设置,直到你完成自定义插件的配置。这在使用插件管理器(如 Vundle、Pathogen 或其他)时特别重要,因为它们通常会管理与文件类型相关的插件。

  • set shellslash: 在 Windows 系统上,这会使 Vim 使用正斜杠(/)作为路径分隔符,而不是默认的反斜杠(\)。

  • set number: 显示行号

  • set backspace=indent,eol,start: 使回退键可以删除缩进和换行

  • colorscheme desert: 设置主题为desert,可选有evening,industry等。

  • syntax on: 启用语法高亮

  • filetype plugin indent on: 根据文件类型自动启用语法高亮

  • set nocompatible: 关闭 Vim 的兼容模式,这意味着 Vim 不会尝试兼容旧版本的 Vi。

  • filetype plugin indent on: 开启文件类型检测,并且根据文件类型自动加载相应的插件和缩进设置。

  • set rtp+=D://Vim/vimfiles/bundle/Vundle.vim/:将指定的路径添加到 ‘runtimepath’(rtp),这是 Vim 查找插件和其他运行时文件的路径。这里特别是为 Vundle 插件管理器设置路径。

  • call vundle#begin('D://Vim/vimfiles/bundle/'): 使用指定的路径初始化 Vundle 插件管理器。

  • call vundle#end(): 结束 Vundle 插件的声明。

  • Plugin 'VundleVim/Vundle.vim‘: 声明 Vundle 插件自身,这是必须的。

05.好用的插件

5.1 NERDTree

在左侧生成一个文件夹树。

插件的安装

nerdtree的GitHub地址:[https://github.com/preservim/nerdtree]

在GitHub项目中我们可以找到使用方法:

从上面的信息中可以得出,在_vimrc的配置文件中,添加一行配置Plugin 'preservim/nerdtree' 使用vim打开一个文件,执行PluginInstall命令即可下载这个插件

插件的配置

在GitHub项目中可以找到对该插件的配置,下面是我自己使用的一些配置,剩余的配置可以在[https://github.com/preservim/nerdtree]中查找。

“ 设置开启或关闭nerd tree的快捷键
nnoremap :NERDTreeToggle

“ Start NERDTree and leave the cursor in it.
autocmd VimEnter * NERDTree

“ Close the tab if NERDTree is the only window remaining in it.
autocmd BufEnter * if winnr(‘$’) == 1 && exists(‘b:NERDTree’) && b:NERDTree.isTabTree() | quit | endif

插件的快捷键

这里介绍常用的快捷键和常用的命令

快捷键的详细介绍在这里[https://github.com/preservim/nerdtree/blob/master/doc/NERDTree.txt]

//窗口切换

ctrl + w + h 光标 focus 左侧树形目录
ctrl + w + l光标 focus 右侧文件显示窗口
ctrl + w + w 光标自动在左右侧窗口切换

//全局命令

:NERDTree [<start-directory> | <bookmark>]:打开一个新的 NERDTree。树的根目录取决于给定的参数。有三种情况:如果没有给定参数,将使用当前目录;如果给定了目录,将使用该目录;如果给定了书签名,将使用对应的目录。例如:

:NERDTree /home/marty/vim7/src
:NERDTree foo (foo 是一个书签的名字)

:NERDTreeVCS [<start-directory> | <bookmark>]:类似于 :NERDTree,但会在目录树中向上搜索,找到版本控制系统仓库的顶部,并将 NERDTree 的根目录设为那里。它支持 Git、Subversion、Mercurial、Bazaar 和 Darcs 仓库。例如:

:NERDTreeVCS /home/marty/nerdtree/doc (打开 /home/marty/nerdtree)
:NERDTreeVCS (打开包含当前工作目录的仓库的根目录)

:NERDTreeFromBookmark <bookmark>:以 <bookmark> 对应的目录作为根目录打开一个新的 NERDTree。使用这个命令而不是 :NERDTree 的唯一原因是自动补全功能(它是针对书签而不是目录的)。

:NERDTreeToggle [<start-directory> | <bookmark>]:如果这个标签页已经存在一个 NERDTree,它将被重新打开并渲染。如果给定了<start-directory> 或 <bookmark>,NERDTree 的根目录将被设置为该路径。如果这个标签页不存在 NERDTree,则此命令的行为与 :NERDTree 相同。

:NERDTreeToggleVCS [<start-directory> | <bookmark>]:类似于 :NERDTreeToggle,但会在目录树中向上搜索,找到版本控制系统仓库的顶部,并将 NERDTree 的根目录设为那里。支持的版本控制系统同 :NERDTreeVCS。

:NERDTreeFocus:如果 NERDTree 当前不可见,则打开(或重新打开)NERDTree;否则,光标将移动到已经打开的 NERDTree。

:NERDTreeMirror:在当前标签页中共享另一个标签页中的现有 NERDTree。对一个树所做的更改将反映在两个树上,因为它们实际上是同一个缓冲区。

:NERDTreeClose:关闭这个标签页中的 NERDTree。

:NERDTreeFind [<path>]:不带可选参数时,找到并显示活动缓冲区的文件在 NERDTree 窗口中的位置。带有 <path> 参数时,找到并显示指定路径。光标将被放置在确定路径的树节点上。如果当前标签页不存在 NERDTree,则将初始化一个新的。

:NERDTreeCWD:将 NERDTree 的根目录更改为当前工作目录。如果这个标签页不存在 NERDTree,则会打开一个新的。

:NERDTreeRefreshRoot:刷新 NERDTree 的根节点。

//书签命令

:Bookmark [<name>]:为当前选中的节点(文件或目录)创建一个书签,并命名为 <name>。如果 <name>已存在,它将被覆盖。如果没有提供 <name>,默认使用文件或目录的名字。对于目录,末尾会有一个斜杠。

:BookmarkToRoot <bookmark>:将与 <bookmark> 对应的目录设置为 NERDTree 的新根目录。如果树节点对应的 <bookmark> 已经在树中缓存,那么将使用当前的树,否则将打开一个新树。如果 <bookmark> 指向一个文件,则使用其父目录。

:RevealBookmark <bookmark>:如果节点在当前根下已缓存,则它将被显示(即打开其上层的目录节点),并将光标放在该节点上。

:OpenBookmark <name>:打开名为 <name> 的书签,就像对书签表中的条目应用了 NERDTree-o 命令一样。如果书签指向一个目录,则该目录会成为当前 NERDTree 的新根目录。如果书签指向一个文件,则该文件将在另一个窗口中打开进行编辑。

:ClearBookmarks [<bookmarks>]:移除所有给定的书签。如果没有指定书签,则移除当前节点上的所有书签。

:ClearAllBookmarks:移除所有书签。

:EditBookmarks:打开书签文件进行手动编辑,例如移除无效的书签。

:ReadBookmarks:重新读取 |NERDTreeBookmarksFile| 中的书签。

//快捷操作

  1. o:打开选中的文件、目录或书签。
  2. go:打开选中的文件,但光标保留在 NERDTree 中。
  3. t:在新标签页中打开选中的节点或书签。
  4. T:类似于 t,但焦点保持在当前标签页。
  5. i:在分割窗口中打开选中的文件。
  6. gi:类似于 i,但光标保留在 NERDTree 中。
  7. s:在新的垂直分割中打开选中的文件。
  8. gs:类似于 s,但光标保留在 NERDTree 中。
  9. <CR>(回车键):自定义的打开操作。
  10. O:递归地打开选中的目录。
  11. x:关闭当前节点的父节点。
  12. X:递归地关闭当前节点的所有子节点。
  13. e:编辑当前目录。
  14. 双击:与 |NERDTree-o| 相同。
  15. 中键点击:对文件执行 |NERDTree-i|,对目录执行 |NERDTree-e|
  16. D:删除当前书签。
  17. P:跳转到根节点。
  18. p:跳转到当前节点的父节点。
  19. K:在当前树深度内向上跳转目录。
  20. J:在当前树深度内向下跳转目录。
  21. <C-J>:跳转到当前目录的下一个兄弟节点。
  22. <C-K>:跳转到当前目录的上一个兄弟节点。
  23. C:将树根更改为选中的目录。
  24. u:将树根向上移动一个目录。
  25. U:类似于 u,但旧的根节点保持打开状态。
  26. r:递归刷新当前目录。
  27. R:递归刷新当前根目录。
  28. m:显示 NERDTree 菜单。
  29. cd:将当前工作目录 (CWD) 更改为选中节点的目录。
  30. CD:将树根更改为 CWD。
  31. I:切换是否显示隐藏文件。
  32. f:切换是否使用文件过滤器。
  33. F:切换是否显示文件。
  34. B:切换是否显示书签表。
  35. L:切换是否显示文件中的行数。
  36. q:关闭 NERDTree 窗口。
  37. A:放大/缩小 NERDTree 窗口。
  38. ?:切换快速帮助的显示。

下面是对NERFTree自定义的内容,具体的修改方法可以参考:

[https://github.com/preservim/nerdtree/blob/master/doc/NERDTree.txt]

  1. loaded_nerd_tree:关闭脚本。
  2. NERDTreeAutoCenter:控制当光标在窗口内移动到距离顶部/底部一定距离时,是否自动居中 NERDTree 窗口。
  3. NERDTreeAutoCenterThreshold:控制自动居中的灵敏度。
  4. NERDTreeCaseSensitiveFS:告诉 NERDTree 是否运行在大小写敏感的文件系统上。
  5. NERDTreeCaseSensitiveSort:告诉 NERDTree 在排序节点时是否区分大小写。
  6. NERDTreeNaturalSort:告诉 NERDTree 是否在排序节点时使用自然排序顺序。
  7. NERDTreeSortHiddenFirst:告诉 NERDTree 在排序节点时是否考虑隐藏文件名开头的点。
  8. NERDTreeChDirMode:告诉 NERDTree 是否/何时更改 Vim 的当前工作目录。
  9. NERDTreeHighlightCursorline:告诉 NERDTree 是否高亮当前光标所在行。
  10. NERDTreeHijackNetrw:告诉 NERDTree 是否替换 netrw 自动命令,用于浏览本地目录。
  11. NERDTreeIgnore:告诉 NERDTree 忽略哪些文件。
  12. NERDTreeRespectWildIgnore:告诉 NERDTree 是否尊重 'wildignore' 设置。
  13. NERDTreeBookmarksFile:存储书签的位置。
  14. NERDTreeBookmarksSort:控制书签表的排序方式。
  15. NERDTreeMarkBookmarks:用标记渲染已书签标记的节点。
  16. NERDTreeMouseMode:管理鼠标点击的解释。
  17. NERDTreeQuitOnOpen:打开文件后关闭树窗口或书签表。
  18. NERDTreeShowBookmarks:告诉 NERDTree 是否在启动时显示书签表。
  19. NERDTreeShowFiles:告诉 NERDTree 是否在启动时显示文件树。
  20. NERDTreeShowHidden:告诉 NERDTree 是否在启动时显示隐藏文件。
  21. NERDTreeShowLineNumbers:告诉 NERDTree 是否在树窗口显示行号。
  22. NERDTreeSortOrder:告诉 NERDTree 如何对树中的节点进行排序。
  23. NERDTreeStatusline:为 NERDTree 窗口设置状态行。
  24. NERDTreeWinPos:告诉脚本在哪里放置 NERDTree 窗口。
  25. NERDTreeWinSize:设置打开 NERDTree 时的窗口大小。
  26. NERDTreeWinSizeMax:设置放大 NERDTree 窗口时的最大窗口大小。
  27. NERDTreeMinimalUI:禁用显示 ‘Bookmarks’ 标签和 ‘Press ? for help’ 文本。
  28. NERDTreeMinimalMenu:使用适合在单行显示的紧凑菜单,用于添加、复制、删除等操作。
  29. NERDTreeCascadeSingleChildDir:在同一行上折叠只有一个子目录的目录。
  30. NERDTreeCascadeOpenSingleChildDir:当选中的目录只有一个也是目录的子项时,级联打开。
  31. NERDTreeAutoDeleteBuffer:告诉 NERDTree 在通过上下文菜单命令删除或重命名文件时自动移除缓冲区。
  32. NERDTreeCreatePrefix:指定创建 NERDTree 窗口时使用的前缀。
  33. NERDTreeRemoveFileCmd:指定用于删除文件的自定义 shell 命令。注意,命令末尾应包含一个空格字符,且仅适用于文件。
  34. NERDTreeRemoveDirCmd:指定用于删除目录的自定义 shell 命令。注意,命令末尾应包含一个空格字符,且仅适用于目录。
  35. NERDTreeDirArrowCollapsibleNERDTreeDirArrowExpandable:这些字符指示目录是可折叠还是可展开的。
  36. NERDTreeNodeDelimiter:用于将文件或目录名称与文本行上的其余字符分隔开的单个字符。
  37. NERDTreeCustomOpenArgs:一个字典,其中的值控制使用 |NERDTree-<CR>| 键打开节点的方式。

5.2 YouCompleteMe

代码补全,支持C、C++、Java、Python等。

插件的安装
YouCompleteMe插件的地址[]

5.3 gruvbox

一种vim主题,效果图如下:

插件安装

插件的GitHub地址[https://github.com/morhetz/gruvbox]

Add Plugin 'morhetz/gruvbox' to your .vimrc and run :PluginInstall

不需要使用git命令将项目拉取到本地,Vundle会自动帮你下载

然后将该行添加autocmd vimenter * ++nested colorscheme gruvbox到 .vimrc 文件中,然后重新启动 vim。

插件配置

gruvbox 有两种模式:深色和浅色。要在它们之间切换,只需将背景设置为适当的值:

1
2
3
set background=dark    " Setting dark mode
set background=light " Setting light mode
colorscheme gruvbox

注意事项

set background=dark “ Setting dark mode
set background=light “ Setting light mode
colorscheme gruvbox

这三行配置需要写在_vimrc文件的#end()之后,否则会报错:找不到主题

主题配置

主题的配置可参考:[https://github.com/morhetz/gruvbox/wiki/Configuration]

5.4 vim-airline

插件地址:[https://github.com/vim-airline/vim-airline]

提供一个美观且高度可定制的状态栏,显示有关当前文件的信息,如行号、文件类型等。效果图如下:

插件安装

在_vimrc文件中添加下面两行

Plugin ‘vim-airline/vim-airline’
Plugin ‘vim-airline/vim-airline-themes’

作者将主题单独放到一个仓库中,所以把主题插件也下载下来。

然后执行:PluginInstall

插件配置

在配置vim-airline之前要先安装打过powerline补丁的字体,不然在airline状态栏上无法正常显示图标和三角形箭头符号。

字体下载链接:[https://github.com/ryanoasis/nerd-fonts]

我安装的是:mononoki字体

将下载好的mononoki字体文件安装到Windows:按下win键,搜索font

然后在_vimrc中添加下面的配置

“ 设置主题和字体,必须设置字体”

let g:airline_theme=”luna”
let g:airline_powerline_fonts = 1

“ 启用Tabline和显示所有Buffer

let g:airline#extensions#tabline#enabled = 1

let g:airline#extensions#tabline#show_buffers = 1

“ 设置Buffer切换快捷键

nnoremap <Tab> :bnext<CR>
nnoremap <S-Tab> :bprevious<CR>

“ 设置关闭Buffer的快捷键

nnoremap :bd

5.5 vim-autoformat

插件地址:[https://github.com/vim-autoformat/vim-autoformat]

格式化代码, 使代码变得整洁美观。

插件安装

_vimrc文件中添加下面一行

Plugin ‘vim-autoformat/vim-autoformat’

然后保存文件,再运行命令:PluginInstall即可完成安装

插件配置

  1. 设置代码格式化快捷键F3

    _vimrc中添加下面配置:

    nnoremap <F3> :Autoformat<CR>

但是配置完了之后使用F3格式化代码发现效果并不理想,查看该插件的GitHub页面发现可以使用Astyle格式化代码。所以安装Astyle然后进行配置

  1. 安装Astyle

    Astyle官网:[https://astyle.sourceforge.net/]

    在官网下载压缩包解压到一个位置,然后将文件astyle.exe所在的位置添加到Path环境变量中。然后使用命令astyle --version查看是否安装成功

  2. 在vim-autoformat中使用Astyle

    _vimrc文件中添加下面的配置:

    “ 为C/C++/Java等设置AStyle作为格式化工具
    let g:formatdef_astyle_c = ‘“astyle –style=java –indent=spaces=4”‘
    let g:formatters_c = [‘astyle_c’]
    let g:formatters_cpp = [‘astyle_c’]
    let g:formatters_java = [‘astyle_c’]

    这里,--style=kr--indent=spaces=4是AStyle的参数,用于指定代码风格和缩进方式。你可以根据需要调整这些参数。

  3. 自动格式化代码

    在Vim中编辑C、C++或Java文件时,可以通过运行:Autoformat命令来格式化当前文件。

    如果想在保存文件时自动格式化代码,可以在_vimrc.vimrc文件中添加以下配置:

    vimCopy code” 在保存C/C++/Java文件时自动格式化
    autocmd BufWritePre .c,.cpp,*.java Autoformat

    这样,每次保存C、C++或Java文件时,vim-autoformat将自动使用AStyle来格式化你的代码。

5.6 Auto-pairs

插件地址:[https://github.com/jiangmiao/auto-pairs]

自动补全括号。

插件安装

_vimrc文件中添加下面一行

Plugin ‘jiangmiao/auto-pairs’

然后保存文件,再运行命令:PluginInstall即可完成安装

插件配置

插件不需要额外配置,其余配置参考官方文档。

06.问题解答

6.1 vim后退键无法删除空白

问题原因

VIM使用了 compatible 模式,或者把 backspace 变量设置为空了…其实compatible模式是VIM为了兼容vi而出现的配置,它的作用是使VIM的操作行为和规范和vi一致,而这种模式下backspace配置是空的。即意味着backspace无法删除 indent , end of line , start 这三种字符。

在默认状态下,delete(backspace)按下只会删除本次插入模式下插入的文本,这跟backspace的模式设置有关,其模式可以设置为以下三种模式:

0 same as “:set backspace=” (Vi compatible)

1 same as “:set backspace=indent,eol”

2 same as “:set backspace=indent,eol,start”

解决方案

将backspace的模式设置为“2”即可。

_vimrc文件中添加下面的任一条配置命令。

set backspace=2

set backspace=indent,eol,start

在使用vim打开文件时普通模式下使用上面的命令只对当前文件起作用,要想全局配置,则要把配置命令写入_vimrc文件中。

6.2 在power shell中使用vim打开文件主题背景不显示

问题原因
gruvbox主题可能需要真彩色(24-bit color)支持才能正确显示。

解决方案

在你的Vim配置文件中添加以下设置以启用真彩色支持:

set termguicolors

6.3 键入{使用回车键换行后下一行缩进为一个制表符加上四个空格而不是只有四个空格

问题原因

因为Vim的缩进设置与你的期望不一致。要让换行后的缩进只有四个空格,你需要调整Vim的缩进设置。

解决方案

以下是一些基本的设置,可以添加到你的.vimrc_vimrc文件中,以确保使用空格进行缩进,并设置每级缩进为4个空格:

set expandtab “ 使用空格代替制表符
set tabstop=4 “ 制表符占用的空格数
set shiftwidth=4 “ 每级缩进的空格数
set softtabstop=4 “ 按退格键时可以一次删除4个空格
set smarttab “ 在行首删除缩进,在行首/使用’shiftwidth’
filetype plugin indent on “ 启用文件类型检测
set autoindent “ 继承前一行的缩进方式,适用于大多数情况
set smartindent “ 智能缩进,适用于C/C++等语言