「VIM」vim操作学习

本文最后更新于:2023年4月17日 晚上

从今天开始, 每天做palab的同时学习一下vim, 同时记下笔记

(这大概是我第4次下决心转vim了, 前三次都失败了…)

本来打算放在每天的palab中, 后面想到应该时常会来翻翻, 分散放不方便, 干脆提出来作为一个文件

先祭出vim键位图

英文版也来一份

sublime中vim的配置

sublime内置vintage支持vim操作, 只需要在preferences-settings中将之加入即可, 同时为了支持vim中的ctrl, 加入如下两行

1
2
3
4
5
6
"ignored_packages":
[
// "Vintage"
],
"vintage_start_in_command_mode": true,
"vintage_ctrl_keys": true

插件: Vintageous

安装该插件后支持Ex模式

vscode中vim的配置

安装这个插件即可

基本编辑模式

i, a: “左插入”, “右插入”

I: 到行首插入

A: 在行尾插入

o: 下一行插入

O: 上一行插入

s: 删除后插入

S: 删除本行后插入

cc: 同S

c + text-object: text-object见下文

gi: 跳到上次编辑的位置进行编辑

vim中的text object

text-object:可以指一个单词,一整句文本,抑或一对括号内的文本

test-object主要涉及到范围操作

范围主要有:

范围 解释
i inner
a around
(, [, ", {, ', < 各种括号

文本对象主要有:

文本对象 解释
w word
s sentence
p paragraph

两个基本的text object

text-object 含义
iw inner word: 当前单词
aw a word: 当前单词, 包含后面的空格

黄色为各个各个作用范围

同时还支持对各种括号和引号块包括(),<>,{},[],"",''进行操作

注意操作的时候可以在block内部任意处输入命令.

根据上述说明, 有几个常用的操作可以总结如下:

1
2
3
4
5
6
7
8
# 修改
ciw caw ci" ci[ ...

# 删除
diw daw di{ ..

# 选择
viw vi[ ...

复制黏贴

除了以下这些指令, 需要配合上面的text-object使用出更高效的用法

操作 功能
y 复制
P 黏贴(前)
p 黏贴(后)(最后一次y复制或者删除的内容)
"0p 黏贴最后一次用y复制的内容
yy 复制一行
ctrl+r + 0 插入模式下的黏贴

各种跳转-如何起飞

vim中我认为最酷的事情就是在各段间飞来飞去, 如果只满足于hjklhome, end, 那还不如我亲爱的caps-lock+好用呢, (话说我现在用了vim上下左右也不是用的hjkl, 而是caps+wasd)

下面的命令可能不全, 都是我自己试了的, 以后慢慢补充.

我把这些操作分为”行内乱飞“, “全文乱飞“, “带查找的乱飞“三部分

行内乱飞

操作 功能
w/W 下一单词首
b/B 上一单词首
e/E 当前词尾
ge/gE 上一词尾
0 移到”hard”行首 (每一行顶格)
^ 移到”soft”行首 (每一行第一个”字”) (等价于0w, 但是后者更好按, ^的位置实在是太奇葩了)
$ / g_ 移动到行尾 / 移动到最后一个非空字符

全文乱飞

操作 功能
gg 全文首
G 全文尾
数字+G / :数字 移动到数字
ctrl+u / ctrl+d 向上 / 向下翻半页 (up / down)
ctrl+b / ctrl+f 向上 / 向下翻一页(back / forward)
H / M / L 页面不动, 调整光标到 上 / 中 / 下 位置 (HIGH / LOW /MID)
ctrl + e / ctrl + y 光标不动, 页面向上 / 向下 移动一行
zt / zz / zb 光标不动, 页面移动到上 / 中 / 下 位置 (top/ *center /bottom)
m+a-zA-Z' + a-zA-Z 通过m进行行标记, 然后用'进行标记跳转 (跳转到行首)

带查找的乱飞

一开始我发现我的fFtT和操作不一样, 我还以为我的vim出问题了, 原来是我装了https://github.com/rhysd/clever-f.vim这个插件

所以插件最好还是知道自己装了什么, 不然到时候发生冲突你都不知道发生了啥

操作 功能
* 正向全文查找光标当前所在单词 (n向下翻阅)
# 反向全文查找光标当前所在单词 (n向上翻阅)
f + 字符 (当前行)查找该字符
F + 字符 (当前行)与上面相反
t + 字符 (当前行)查找该字符的”前一个字符”
T + 字符 (当前行)与上面相反
; / , 正向 / 反向查找
/ 查找 (:noh取消搜索高亮)
? 反向查找
n 配合查找使用, 跳到下一个
gn 跳到并选中下一个
:%s/查找内容/替换内容/g 全文替换
:%s/查找内容/替换内容/gi 全文替换, 大小写不敏感
:%s/查找内容/替换内容/gI 全文替换, 大小写敏感
:s/查找内容/替换内容/g 当前行替换
:%s/查找内容/替换内容/gc 带确认的替换(y/n/a/q/l/^E/^Y分别为yes/no/all/quit/last) (确认, 取消, 剩下的全部换了, 退出, 换完这个再退出), ^E^Y表示ctrl + E, ctrl + Y可以向下 / 向上翻滚一行
:n1,n2s/查找内容/替换内容/g [n1,n2]行替换

如何安装和管理插件

使用Vundle

我目前for c++目前安装的插件有:

插件 功能
auto-pairs 括号补全
autoformat 自动格式化

附: zsh快捷键

⌃ + u:清空当前行

⌃ + a:移动到行首

⌃ + e:移动到行尾

⌃ + f:向前移动

⌃ + b:向后移动

⌃ + p:上一条命令

⌃ + n:下一条命令

⌃ + r:搜索历史命令

⌃ + y:召回最近用命令删除的文字

⌃ + h:删除光标之前的字符

⌃ + d:删除光标所指的字符

⌃ + w:删除光标之前的单词

⌃ + k:删除从光标到行尾的内容

⌃ + t:交换光标和之前的字符

附 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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154

" 相对行号
set relativenumber

" 使得按退格键时可以一次删掉 4 个空格
set softtabstop=4

"显示行号
set nu

"启动时隐去援助提示
set shortmess=atI

"语法高亮
syntax on


"不需要备份
set nobackup

"没有保存或文件只读时弹出确认
"set confirm

"鼠标可用
set mouse=a`"

"tab缩进
set tabstop=4
set shiftwidth=4
set expandtab
" 根据其他地方确定一个tab是多少空格
" set smarttab


"文件自动检测外部更改
set autoread

"c文件自动缩进
" set cindent

"自动对齐
set autoindent

"智能缩进
set smartindent

"高亮查找匹配
set hlsearch

"背景色
"set background=dark

"显示匹配
set showmatch

"显示标尺,就是在右下角显示光标位置
set ruler

""""""""""""""""""设置折叠"""""""""""""""""""""

"允许折叠
"set foldenable
""根据语法折叠
"set fdm=syntax

"手动折叠
""set fdm=manual

"设置键盘映射,通过空格设置折叠
"nnoremap <space> @=((foldclosed(line('.')<0)?'zc':'zo'))<CR>

"""""""""""""""""""""""""""""""""""""""""""""""

" 不要闪烁
" set novisualbell

" 启动显示状态行
set laststatus=2

"显示输入的命令
set showcmd

"被分割窗口之间显示空白
set fillchars=vert:/

set fillchars=stl:/

set fillchars=stlnc:/

" 改变windows terminal下的光标颜色和样式
if &term =~ "xterm"
" INSERT mode
let &t_SI = "\<Esc>[5 q" . "\<Esc>]12;white\x7"
" REPLACE mode
let &t_SR = "\<Esc>[3 q" . "\<Esc>]12;white\x7"
" NORMAL mode
let &t_EI = "\<Esc>[1 q" . "\<Esc>]12;#e5c07b\x7"
endif
" 存在tmux的情况
if exists('$TMUX')
let &t_SI = "\<Esc>[6 q" . "\<Esc>]12;white\x7"
let &t_SR = "\<Esc>[4 q" . "\<Esc>]12;white\x7"
let &t_EI = "\<Esc>[2 q" . "\<Esc>]12;#e5c07b\x7"
endif
" 1 -> blinking block 闪烁的方块
" 2 -> solid block 不闪烁的方块
" 3 -> blinking underscore 闪烁的下划线
" 4 -> solid underscore 不闪烁的下划线
" 5 -> blinking vertical bar 闪烁的竖线
" 6 -> solid vertical bar 不闪烁的竖线


" Vundle and Plugins --------------------
" 去除vi一致性
set nocompatible " be iMproved, required
filetype off " required

" 设置包括vundle和初始化相关的runtime path
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" 所有的插件
" Vundle自己的插件
Plugin 'VundleVim/Vundle.vim'
" 自动格式化
Plugin 'Chiel92/vim-autoformat'
" 括号匹配和括号补全
Plugin 'jiangmiao/auto-pairs'
" 自动加注释
Plugin 'preservim/nerdcommenter'
" 设置前一个空格+注释
let g:NERDSpaceDelims = 1

" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" 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

" End of Plugins -----------------------

" 命令设置 ------------------------

" 设置<leader>键
let mapleader = "\<space>"

" autoformat设置为"="号
nnoremap = :Autoformat<CR>

surround和easy-motion

我觉得vim最牛逼的两个插件

easy-motion使用

<leader><leader>[jkhlbew..]

surround使用

操作 说明
ds 删除一个配对符号 (delete a surrounding)
cs 更改一个配对符号 (change a surrounding)
ys 增加一个配对符号 (yank a surrounding)
S 可视化v模式下, 选中后加配对符号

example:

Jetbrains系配置vim

首先安装两个个插件:

ideavim

vim-easymotion (同时安装acejump)

C:/user/yourname/下创建.ideavimrc

配置如下:

1
2
3
4
5
6
7
8
9
10
11
" 相对行号
set relativenumber
" 共享系统剪切板
set clipboard = unamed
" 设置leader为空格
let mapleader = "\<space>"
" 启动插件
set easymotion
set surround
" 自动格式化(空格+等号)
nnoremap <leader>= :action ReformatCode<CR><esc>

「VIM」vim操作学习
https://blog.roccoshi.top/posts/50672/
作者
RoccoShi
发布于
2021年8月15日
许可协议