vim操作与配置

[TOC]

1. 初识vim

1.1. vim简介

vi improved, 是vi的增强版, 也是Linux下最常用的文本编辑器, 拥有强大的功能, 但是学习曲线陡峭, 需要一定的时间去熟悉, 另外vim拥有众多的插件, 可以实现各种各样的功能, 但是插件的安装也是一件麻烦的事情, 本文将会介绍vim的基本操作, 以及vim的配置.

1.2. 检查vim

在centos系统中, 通过alias vi可以看到, vi实际上是vim -u NONE -N的别名.
但是在ubuntu系统中, vi不是vim的别名, 而且/usr/bin/vi是一系列文件链接中的一环

1
2
3
alias vi
which vi
ls -l /usr/bin/vi

所以在ubuntu中输入运行vi, 实际上运行的是vim.tiny程序, 只提供了少量的vim功能, 所以建议用一下命令下载vim

1
2
sudo apt-get update
sudo apt-get install vim

2. vim基础操作

vim编辑器在内存缓冲区中编辑, 保存后才会写入文件, 所以在编辑过程中, 可以随时撤销修改, 也可以随时恢复修改, 但是在退出vim之后, 才会写入文件, 所以在退出vim之前, 一定要保存修改, 否则修改会丢失.

2.1. vim的三种模式

    1. 命令模式(command mode)
    1. 插入模式(insert mode)
    1. 底线命令模式(last line mode/Ex mode)

2.2. 移动光标:

  h: 左移
  j: 下移
  k: 上移
  l: 右移

2.3. 在大文本文件中的移动:

  PageDown(ctrl + F): 向下翻页
  PageUp(ctrl + B): 向上翻页
  gg: 移动到文件开头
  G: 移动到文件结尾
  ngg/nG: 移动到第n行

2.4. Ex模式

在命令模式下按:计入Ex
w: 保存
q: 退出
wq: 保存并退出
q!: 强制退出, 不保存修改
w!: 强制保存, 不退出
wq!: 强制保存并退出
w filename: 另存为filename
e filename: 打开filename
set nu: 显示行号
set nonu: 不显示行号
set ic: 忽略大小写
set noic: 不忽略大小写
set hlsearch: 高亮显示搜索结果
set nohlsearch: 不高亮显示搜索结果
set ai: 自动缩进
set noai: 不自动缩进
set tabstop=4: 设置tab为4个空格

这些命令虽然只是非常小的一部分, 但是已经看起来非常复杂繁琐难记, 这也是为什么能多人厌恶vim, 但是当你熟练掌握以后, 你就会发现效率是多么的高, 他可以让你完全使用键盘完成编辑, 无需鼠标, 甚至不需要使用上下左右键.

2.5. 编辑数据:

命令 描述
x 删除光标所在位置的字符
dd 删除光标所在行
dw 删除光标所在位置的单词
d$ 删除光标所在位置到行尾
J 删除光标所在行的换行符
u 撤销上一次操作
U 撤销对整行的修改
r 替换光标所在位置的字符
R 进入替换模式, 直到按下ESC键

以上大部分命令可以通过使用数字修饰符来指定命令的重读次数, 例如5dd会删除5行内容

2.6. 复制粘贴:

命令 描述
yy 复制光标所在行
yw 复制光标所在位置的单词
y$ 复制光标所在位置到行尾
p 粘贴到光标所在位置的下一行
P 粘贴到光标所在位置的上一行
y^ 复制光标所在位置到行首
y0 复制光标所在位置到行首
yG 复制光标所在位置到文件末尾
ygg 复制光标所在位置到文件开头
yw 复制光标所在位置的单词
yiw 复制光标所在位置的单词, 包括空格
yaw 复制光标所在位置的单词, 包括空格
y$ 复制光标所在位置到行尾
y^ 复制光标所在位置到行首
y0 复制光标所在位置到行首
yG 复制光标所在位置到文件末尾
ygg 复制光标所在位置到文件开头
yw 复制光标所在位置的单词
yiw 复制光标所在位置的单词, 包括空格
yaw 复制光标所在位置的单词, 包括空格
y$ 复制光标所在位置到行尾
y^ 复制光标所在位置到行首
y0 复制光标所在位置到行首
yG 复制光标所在位置到文件末尾

2.7. 查找替换:

命令 描述
/pattern 向光标所在位置之后查找pattern
?pattern 向光标所在位置之前查找pattern
n 查找下一个匹配项
N 查找上一个匹配项
:%s/old/new/g 替换每一行中的old为new
:%s/old/new/gc 替换每一行中的old为new, 并且在替换前询问用户
:n1,n2s/old/new/g 替换第n1行到第n2行中的old为new
:n1,n2s/old/new/gc 替换第n1行到第n2行中的old为new, 并且在替换前询问用户
:%s/^/new/ 在每一行的开头插入new
:%s/$/new/ 在每一行的结尾插入new
:%s/old/new/gI 替换每一行中的old为new, 并且忽略大小写
:%s/old/new/gIc 替换每一行中的old为new, 并且忽略大小写, 并且在替换前询问用户
:%s/old/new/gI 替换每一行中的old为new, 并且忽略大小写
:%s/old/new/gIc 替换每一行中的old为new, 并且忽略大小写, 并且在替换前询问用户
:%s/old/new/gI 替换每一行中的old为new, 并且忽略大小写
:%s/old/new/gIc 替换每一行中的old为new, 并且忽略大小写, 并且在替换前询问用户

2.8. 模式切换:

命令 描述
ESC 从插入模式切换到命令模式
i 从命令模式切换到插入模式
I 从命令模式切换到插入模式, 并且光标移动到行首
a 从命令模式切换到插入模式, 并且光标移动到下一个字符
A 从命令模式切换到插入模式, 并且光标移动到行尾
o 从命令模式切换到插入模式, 并且在当前行下方插入一行
O 从命令模式切换到插入模式, 并且在当前行上方插入一行
s 从命令模式切换到插入模式, 并且删除光标所在位置的字符
S 从命令模式切换到插入模式, 并且删除光标所在行
v 从命令模式==以行==切换到可视化模式
V 从命令模式==以整行==切换到可视化模式
ctrl + v 从命令模式==以列==切换到可视化模式
: 从命令模式切换到Ex模式

3. 高端操作

3.1. 分割窗口

使用分割窗口可以同时查看和编辑多个文件。你可以使用命令 :split(水平分割)或 :vsplit(垂直分割)来创建新窗口,并使用 Ctrl + W + 箭头键 在不同窗口之间切换。

3.2. 标签页

Vim 支持标签页,允许你在同一个窗口中打开多个文件,并在标签之间切换。可以使用 :tabnew 命令创建新标签页,使用 gt 和 gT 在标签之间切换。

3.3. 宏录制

宏录制是一种将一系列命令记录下来,并在需要时重复执行的功能。按下 q 后加上一个字母(如 q+a)开始录制,执行一系列编辑操作,然后按下 q 停止录制。可以使用 @ 加上录制时选择的字母(如 @a)来重复执行宏。

3.4. 多光标编辑

Vim 支持多光标编辑,使你可以在多个位置同时插入、删除或编辑文本。可以使用 Ctrl + V 进入可视块模式,然后使用 j 或 k 上下选择多个光标,然后进行编辑操作。

例如: 键入Ctrl + V, 然后按j或k选择多个光标, 然后按I进入插入模式, 然后输入要插入的内容, 然后按ESC键, 就会在多个光标的位置修改内容.

3.5. 会话管理

Vim 允许你保存当前编辑会话的状态,包括打开的文件、窗口布局和光标位置。使用 :mksession 命令保存会话,并使用 vim -S 命令加载会话。

3.6. 自定义映射

你可以通过创建自定义映射来定义自己的快捷键和命令。使用 :map、:noremap 或 :nnoremap 命令来创建键盘映射,并指定触发映射的按键和对应的命令。

4. vim配置

4.1. 配置文件

Vim 的配置文件名为 .vimrc,它通常位于用户的主目录下(例如 ~/.vimrc)。这个文件包含了一系列 Vim 的设置和自定义命令。以下是一些常见的配置选项:
set:用于设置各种 Vim 选项,例如缩进、搜索行为、显示行号等。
map:用于定义键盘映射,将按键与命令绑定起来。
autocmd:用于定义自动命令,当特定事件发生时自动执行一系列命令。
syntax:用于启用或禁用语法高亮显示。
colorscheme:用于设置编辑器的配色方案。
你可以在 .vimrc 文件中添加和修改这些配置选项,以满足个人偏好和需求。

  • 使用source $HOME/alias.vim实现预定义重复输入:(以下是我的win11 powershell下gvim的配置, 与linux下vim配置完全相同)

$HOME/.vimrc(部分):

1
source $HOME/alias.vim

$HOME/alias.vim:
1
2
3
iab __makefile <Esc>:r C:\Users\admin\.vim\makefile.v
iab __cpp <Esc>:r C:\Users\admin\.vim\cpp.v
iab __cmake <Esc>:r C:\Users\admin\.vim\cmake.v

C:\Users\admin.vim\cmake.v(其他两个文件同理):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 设置项目名称
project(YourProjectName)

# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.10)

# 设置可执行文件的输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

# 设置源文件的目录
aux_source_directory(src SRC_LIST)

# 设置头文件的目录
include_directories(include)

# 设置目标可执行文件
add_executable(main ${SRC_LIST})

# 设置目标对象文件的输出路径
set_target_properties(main PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin
ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/obj
)

重启vim, 只需要在vim中输入__cmake, 就会自动输入预定义好的cmake的模板, 然后修改即可.

4.2. 插件管理

Vim 的插件管理器可以帮助你轻松地安装、更新和删除插件。以下是一些常见的插件管理器:

  • Vundle:Vundle 是一个简单且易于使用的插件管理器。你可以通过在 .vimrc 中添加插件声明来安装插件,并使用 :PluginInstall 命令来安装配置文件中声明的插件。
  • Pathogen:Pathogen 允许你将每个插件放在单独的目录中,使得插件管理和升级更加简单。你只需要将插件克隆到 ~/.vim/bundle 目录中,Pathogen 就会自动加载它们。
    *Vim-Plug:Vim-Plug 是一个快速而简洁的插件管理器。你可以通过在 .vimrc 中添加插件声明来安装插件,并使用 :PlugInstall 命令来安装配置文件中声明的插件。

    这些插件管理器都有详细的文档和用法说明,你可以在它们的 GitHub 仓库中找到更多信息。

    4.3. 常见的插件

    Vim 的插件生态系统非常丰富,提供了各种各样的插件来增强编辑器的功能。以下是一些常见的 Vim 插件示例:

  • NERDTree:提供一个侧边栏文件浏览器,方便在项目中浏览和打开文件。
  • CtrlP:一个快速的文件查找插件,可以根据文件名快速定位和打开文件。
  • Syntastic:用于语法检查的插件,可以在编辑时检测并显示代码中的错误和警告。
  • Vim-airline:一个漂亮的状态栏插件,提供了丰富的信息,如文件类型、光标位置、Git 分支等。
  • UltiSnips:代码片段插件,允许你使用自定义的代码片段快速插入常用的代码块。

    这只是一小部分 Vim 插件的例子,你可以根据自己的需求和喜好,探索和尝试其他插件。
    通过配置文件和插件管理器,你可以根据个人偏好和需求来定制 Vim,并添加额外的功能和工具,以提高编辑效率和舒适度。

  1. 我的.vimrc文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    set nocompatible              " be iMproved, required
    filetype off " required

    " set the runtime path to include Vundle and initialize
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
    " alternatively, pass a path where Vundle should install plugins
    "call vundle#begin('~/some/path/here')
    " let Vundle manage Vundle, required
    Plugin 'VundleVim/Vundle.vim'

    " The following are examples of different formats supported.
    " Keep Plugin commands between vundle#begin/end.
    " plugin on GitHub repo
    Plugin 'tpope/vim-fugitive'
    " plugin from http://vim-scripts.org/vim/scripts.html
    " Plugin 'L9'
    " Git plugin not hosted on GitHub
    Plugin 'git://git.wincent.com/command-t.git'
    " git repos on your local machine (i.e. when working on your own plugin)
    " The sparkup vim script is in a subdirectory of this repo called vim.
    " Pass the path to set the runtimepath properly.
    Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
    " Install L9 and avoid a Naming conflict if you've already installed a
    " different version somewhere else.
    " Plugin 'ascenator/L9', {'name': 'newL9'}
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    " All of your Plugins must be added before the following line
    " NERDTree
    Plugin 'preservim/nerdtree'
    "***************************************************************
    " airline
    Plugin 'vim-airline/vim-airline'
    "***************************************************************
    Plugin 'vim-airline/vim-airline-themes'
    " autp pair
    Plugin 'jiangmiao/auto-pairs'
    "vim-rainbow
    Plugin 'luochen1990/rainbow'
    "tagbar need install ctag
    Plugin 'majutsushi/tagbar'
    "tokyonight
    Plugin 'ghifarit53/tokyonight-vim'
    "indentline
    Plugin 'Yggdroot/indentLine'
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    call vundle#end() " required
    filetype plugin indent on " required
    " To ignore plugin indent changes, instead use:
    "filetype plugin on
    "
    "tokyonight settings
    set termguicolors
    let g:tokyonight_style = 'night' " available: night, storm
    let g:tokyonight_enable_italic = 1
    colorscheme tokyonight
    "###indent line settings
    "let g:indentLine_setColors = 0
    let g:indentLine_char_list = ['|', '¦', '┆', '┊']
    "
    "###NerdTree settings
    nmap <F3> :NERDTreeToggle<CR>
    autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif "如果最后只剩下nerdtree 自动退出
    "###airline settings
    set laststatus=2 "永远显示状态栏
    "###vim-rainbow settings
    let g:rainbow_active = 1
    let g:rainbow_conf = {
    \ 'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick'],
    \ 'ctermfgs': ['lightblue', 'lightyellow', 'lightcyan', 'lightmagenta'],
    \ 'operators': '_,_',
    \ 'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'],
    \ 'separately': {
    \ '*': {},
    \ 'tex': {
    \ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/'],
    \ },
    \ 'lisp': {
    \ 'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick', 'darkorchid3'],
    \ },
    \ 'vim': {
    \ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/', 'start=/{/ end=/}/ fold', 'start=/(/ end=/)/ containedin=vimFuncBody', 'start=/\[/ end=/\]/ containedin=vimFuncBody', 'start=/{/ end=/}/ fold containedin=vimFuncBody'],
    \ },
    \ 'html': {
    \ 'parentheses': ['start=/\v\<((area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)[ >])@!\z([-_:a-zA-Z0-9]+)(\s+[-_:a-zA-Z0-9]+(\=("[^"]*"|'."'".'[^'."'".']*'."'".'|[^ '."'".'"><=`]*))?)*\>/ end=#</\z1># fold'],
    \ },
    \ 'css': 0,
    \ }
    \}
    "tagbar settings
    nmap <F2> :TagbarToggle<CR>
    " Brief help
    " :PluginList - lists configured plugins
    " :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
    " :PluginSearch foo - searches for foo; append `!` to refresh local cache
    " :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
    "
    " see :h vundle for more details or wiki for FAQ
    " Put your non-Plugin stuff after this line
    " alias file
    source ~/.alias.vim

    " other settings
    nmap <F1> :vertical rightbelow term<CR>
    nmap <C-j> <C-W>j
    nmap <C-k> <C-W>k
    nmap <C-h> <C-W>h
    nmap <C-l> <C-W>l
    " namp <F12> :w !sudo tee %<CR>