vim操作与配置
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
3alias vi
which vi
ls -l /usr/bin/vi
所以在ubuntu中输入运行vi, 实际上运行的是vim.tiny程序, 只提供了少量的vim功能, 所以建议用一下命令下载vim1
2sudo apt-get update
sudo apt-get install vim
2. vim基础操作
vim编辑器在内存缓冲区中编辑, 保存后才会写入文件, 所以在编辑过程中, 可以随时撤销修改, 也可以随时恢复修改, 但是在退出vim之后, 才会写入文件, 所以在退出vim之前, 一定要保存修改, 否则修改会丢失.
2.1. vim的三种模式
- 命令模式(command mode)
- 插入模式(insert mode)
- 底线命令模式(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
3iab __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
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,并添加额外的功能和工具,以提高编辑效率和舒适度。
我的.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
110set 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>