2022.11.2
vim配置
使用vim的目的,是为了实现纯键盘编辑。
vim模式
- normal模式:默认模式
- 普通模式下,可以进行各种命令操作和移动
- 大部分情况下,我们是在浏览而不是在编辑,所以vim默认是normal模式
- insert模式:编辑模式
- command模式:normal模式下输入:之后执行命令
- 比如退出保存,:wq
- 比如全局替换::% s/java/python/g 将全局的java替换成python
- visual模式:一般用来块状选择文本
- normal模式下使用v进入visual选择
- V 整行选中
- ctrl+v 进行块状选择
- 块状选中文本后,可以用d删除,y复制,p粘贴
vim基本配置
sjx@Samsung:~$ cat .vimrc
set nu "显示行号
set shiftwidth=4 "设置缩进的空格数为4
set tabstop=4 "设置软制表符宽度为4
set autoindent "设置自动缩进
set cindent "使用C/C++语言的自动缩进方式
set showmatch "光标遇到圆括号、方括号、大括号时,自动高亮对应另一个括号
set ruler "在状态栏显示光标的当前位置(位于哪一行、哪一列)
set statusline=%f\ -\ FileType=%y "设置状态栏
set hlsearch "设置高亮显示搜素字符串
set incsearch "设置增亮搜索,边搜索边高亮
set t_Co=256 "启动256色
syntax on "高亮显示
syntax enable
colorscheme darkblue "设置主题色为darkblue
sjx@Samsung:~$
修改colorscheme
最喜欢的主题是darkblue,但是,底下的状态栏,灰色和亮蓝色实在看不清。故作修改。
cd /usr/share/vim/vim81/colors/
sudo cp darkblue.vim darkblueTest.vim
sudo chown -R sjx darkblueTest.vim
vim darkblueTest.vim
将第35行:hi StatusLine guifg=blue guibg=darkgray gui=none ctermfg=blue ctermbg=gray term=none cterm=none
的ctermfg=blue改成 —> ctermfg=56 (紫色)
终端颜色表参考:https://www.ditig.com/256-colors-cheat-sheet
状态栏看不清,error msg也看不清。
第18行,也做修改。
18 hi ErrorMsg guifg=#ffffff guibg=#287eff ctermfg=56 ctermbg=lightblue
vim下载插件
00 安装vim插件管理器
首先,使用vim-plug插件管理器安装vim插件。
https://github.com/junegunn/vim-plug
使用命令:curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
第一个报错:Command ‘curl’ not found, but can be installed with:
解决:sudo apt install curl
第二个报错:sjx@Samsung:~$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:–:-- 0:01:32 --:–:-- 0^C
超时。
解决:使用curl命令需要配置代理:
vim .curlrc
cat ~/.curlrc
proxy = “http://109.123.97.11:8080”
insecure
sync
下载成功:
sjx@Samsung:~$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 83129 100 83129 0 0 121k 0 --:--:-- --:--:-- --:--:-- 121k
sjx@Samsung:~$
01 vim-startify
一个好用的vim开屏插件。
https://github.com/mhinz/vim-startify
- vim .vimrc,增加该插件名称
call plug#begin('~/.vim/plugged')
Plug 'mhinz/vim-startify'
call plug#end()
- 保存然后source .vimrc
:w
:source ~/.vimrc
- 执行:PlugInstall
:PlugInstall
报错:connect to github.com port 443: Connection timed out
解决:
- 打开 https://github.com.ipaddress.com/
- 复制IP Address
- sudo vim /etc/hosts
在末尾添加:140.82.114.4 github.com - source /etc/hosts
- 重新下载,成功
Updated. Elapsed time: 0.015813 sec.
[=]
- Finishing ... Done!
- vim-startify: Already installed
02 nerdtree-vim文件目录和搜索插件
使用nerdtree插件进行文件目录树管理。
解决跳转文件得问题。
https://github.com/preservim/nerdtree
Plug ‘preservim/nerdtree’
- :NERDTree命令用于打开目录
- vim .vimrc 添加快捷键
vim快捷键
01 进入/退出插入模式
进入
- a append after current char
- A append after current line
- i insert before current char
- I insert before current line
- o open a line below
- O open a line above
退出
- :w 保存
- :wq 保存并退出
- :qa 退出所有窗口
02 快速纠错
痛点:退格键太远,用起来不方便,我们可以抛弃退格键
需要先进入编辑模式或者在命令行中使用:
- ctrl+h 删除前一个字符
- ctrl+w 删除前一个单词
- ctrl+u 删除当前行到光标位置的所有字符
只可以在终端命令行中使用
4. ctrl+a 光标快速移动到开头
5. ctrl+e 光标快速移动到结尾
6. ctrl+b 光标往前移
7. ctrl+f 光标往后移
03 快速切换insert和normal模式
痛点:Esc按起来不方便,不方便切换到normal模式
- ctrl+c 快速切到normal模式,但有可能会中断某些快捷键
- ctrl+[ 快速切到normal模式
- gi 在normal模式下快速跳转到最后一次编辑的地方并进入插入模式
04 vim快速移动大法
左 下 上 右
反人类:hjkl
坚持使用几天,就可以熟练。
在单词之间飞舞
- w 移动到下一个word开头
- W 移动到下一个WORD开头
- e 移动到下一个word尾部
- E 移动到下一个WORD尾部
- b 移动到上一个word开头
- B 移动到上一个WORD开头
小写word指得是以非空白符分割的单词,大小WORD以空白符分割的单词
行间搜索移动
同一行快速移动的方式其实是搜索一个字符并且移动到该字符。
- f{char} 可以快速移动到该行char字符上,如:fe 快速移动到e字符上(find)
- t{char} 移动到char的前一个字符上,如:te(until)
- ; 继续搜该行下一个
- ,继续搜该行上一个
- F{char} 反过来搜前面的字符
vim的水平移动
- 0 快速移动到行首第一个字符
- ^ 移动到该行第一个非空白字符
- $ 移动到行尾
- g_ 移动到行尾非空白字符
记住0 移动到行首,$移动到行尾就可以了。
- 0w 快速移动到该行第一个非空白字符上
:help ( 可以查询命令的用法
vim页面移动
- gg 快速移动到文件开头
- G 快速移动到文件结尾
- H 快速跳转到屏幕的开头(Head)
- M 快速跳转到屏幕的中间(Middle)
- L 快速跳转到屏幕的结尾(Lower)
- ctrl+u 上翻页(upward)
- ctrl+f 下翻页(forward)
- ctrl+e 屏幕上移动一行
- zz 把屏幕置为中间
- ctrl+o 快速返回
vim的normal模式提供了强大的命令来移动。
学习vim,让写代码就像弹钢琴,让别人眼睛的速度都跟不上你操作的速度。
05 vim快速增删改查
增加
进入插入模式编辑文本。aio/AIO
删除
normal模式下:
- x 快速删除一个字符
- dw 删除一个单词(delete a word)
- daw 删除一个单词和旁边的空格(delete around word)
- diw 删除一个单词不删除空格
- dd 删除当前行
- dt) 删除括号里的内容(delete to ))
- dt" 删除到双引号
- d$ 删除到行尾
- d0 删除到开头
- x和d可以搭配数字来执行多次
- 2dd 删除两行
- 4x 删除四个字符
vim中 数字+命令 可以用于执行多次命令
可以搭配visual模式行选或块选快速删除。
修改
相比删除,更常用修改。一般是删除之后改成我们希望的文本。
- r normal模式下使用r可以替换一个字符(replace)
- ra 把光标所指字符改成a
- R 直接开始向下替换
- c 配合文本对象,快速进行修改(change)
- cw 删除当前单词并进入插入模式
- ct" 删除到双引号并进入插入模式
- s 删除当前字符并进入插如模式(substitute)
- 4s 删除4个字符并进入插如模式
- S 整行删除,并进入插如模式
查询
- / 进行前向搜索
- ? 进行反向搜索
- n 跳转到下一个匹配
- N 跳转到上一个匹配
*
光标在单词上,使用*号,进行当前单词的前向匹配,找到相同的单词(向下)#
进行当前单词的后向匹配(向上)- :noh 搜索结束后,让高亮的字符不再高亮
搜索替换
substitute命令允许我们查找并且替换掉文本,支持正则表达式
- :[range]s/{pattern}/{string}/[flags]
- range表示范围,比如:10,20 表示10-20行,%表示全部
- pattern表示要替换的文本
- string是替换后的文本
- flags是替换的标志位
- g 全局范围内执行(global)
- c 表示确认,可以确认或者拒绝修改(confirm)
- n 报告匹配的次数而不替换,用来查询匹配次数(number)
如 :% s/self/this/g
将全局的self替换成this
如 :1,6 s/self/this/g
将1-6行的self替换成this
如 :% s/self//n
查看全文有多少self
如 :% s/\<quack\>/this/g
使用正则表达式,精确匹配所有quack,而不会有_quack等
延伸:可以使用插件批量搜索替换多个文件中的匹配
06 vim多文件操作
Buffer、Window、Tab
- Buffer:是指打开的一个文件的内存缓冲区
- Window:窗口是指Buffer可视化的分割区域
- Tab:Tab可以组织窗口为一个工作区
Buffer
- vim打开一个文件后会加载文件内容到缓冲区
- 之后的修改都会针对内存中的缓冲区,并不会直接保存到文件
- 直到我们执行:w(write)的时候才会把修改内容写入到文件里
如何在buffer之间切换?
:ls
会列举当前缓冲区,然后使用:b n
跳转到第n个缓冲区- :bp 向前跳(buffer previous)
- :bnect 向后跳
- :bfirst 跳到第一个
- :bl 跳到最后一个(buffer last)
- :b buffer_name/buffer_number 加上tab补全来跳转,如 :b1 跳到第一个缓冲区
- :e 文件名 再打开一个缓冲区
窗口
窗口是可视化的分割区域。
一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区
- ctrl+w s/:sv 水平分割
- ctrl+w v/:vs 垂直分割(w是window的意思)
每个窗口可以继续被无限分割(看屏幕是否足够大)
可以在不同的窗口用:e 文件名 打开不同的buffer
不同窗口编辑同一个buffer,都会生效,因为编写的都是同一块内存里的内容
-
ctrl+w H 将光标所在位置的窗口移到左边
-
ctrl+w J 将光标所在位置的窗口移到下边
-
ctrl+w K 将光标所在位置的窗口移到上边
-
ctrl+w L 将光标所在位置的窗口移到右边
-
ctrl+w = 使所有窗口等宽、等高
-
ctrl+w _ 最大化活动窗口的高度
-
ctrl+w | 最大化活动窗口的宽度
-
[N]ctrl+w _ 把活动窗口的高度设置为N行,如40ctrl+w _
-
[N]ctrl+w | 把活动窗口的宽度设置为N列
Tab(标签页)
标签页用于将窗口分组。Tab是可以容纳一系列窗口的容器
vim的tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
比如一个Tab全用来编辑python文件,一个tab全是html文件
相比窗口,tab一般用的比较少,tab太多管理起来也比较麻烦
- :tabnew 文件名 在新的标签页中打开文件
- ft 在nerdtree中可以在光标选中的文件目录下新建标签页
- :tabe[dit] {filename} 在新标签页中打开文件
- ctrl+w T 把当前窗口移到一个新的标签页中
- :tabc[lose] 关闭当前标签页及其中的所有窗口
- :tabo[nly] 只保留活动标签页,关闭所有其他标签页
Tab标签页切换操作如下:
命令模式下:
- :tabn[ext]{N} 切换到编号为{N}的标签页
- :tabn[ext] 切换到下一个标签页
- :tabp[revious] 切换到上一个标签页
normal模式下
- {N}gt 切换到编号为{N}的标签页
- gt 切换到下一个标签页
- gT 切换到上一个标签页
- ft 新建一个空的tab标签页
标签页一般建立两个就好,太多不好操作
Note: 后面会配合ctrlp插件和nerdtree快速操作多个文件
07 vim的text object
什么是Text Object(文本对象)
vim里文本也有对象的概念,比如一个单词,一段句子,一个段落
很多其他编辑器经常只能操作单个字符来修改文本,比较低效,但vim删除一个单词只要dw
通过操作文本对象来修改要比只操作单个字符高效
如何操作文本对象
- [number][text object]
- 数字表示操作几次
- command表示操作命令,如d(delete),c(change),y(yank)复制
- text object表示文本对象,如单词w,句子s,段落p
示例1
iw表示inner word。如果键入viw
命令,那么首先v将进入选择模式(visual模式),然后iw将选中当前单词。
aw表示around word。它不仅会选中当前单词,还会包含当前单词之后的空格。
以下用[]表示作用范围:
-
iw This is a …[test]… sentence.
-
aw This is a …[test ]sentence.
-
iW This is a […test…] sentence.
-
aW This is a […test… ]sentence.
-
is …sentence. [This is a sentence.] This…
-
as …sentence. [This is a sentence. ]This…
-
ip [This is a paragraph.It has two sentences.]
The next.
End of previous paragraph. -
ap [This is a paragraph.It has two sentences.
]The next.
End of previous paragraph.
练习1
This is a “word”.
- 删除前面三个单词包括空格:0w3dw(0w先定位到第一个单词起始位置,3dw删除三个单词)
- 删除前面三个单词不包括空格:0w3diw
- 删除引号里的word换成hello: fwcw(fw先定位到word的起始位置,然后用cw,删除word并进入插入模式)
示例2
- i( or i) 1*([ 2 + 3 ]) 不包括括号 用于函数参数定义时
- a( or a) 1*[( 2 + 3 )] 包括括号
- i< or i> The <[tag]>
- a< or a> The []
- i{ or i} int main(){[return 0]} 可用于选择一个代码段
- a{ or a} int main()[{return 0}]
- i[ or i] some [[code block]] 可用写json时
- a[ or a] some [[code block]]
- i" The “[best]” 可用于打印log
- a" The [“best”]
- i
The
[best]` 可用于markdown文档 - a
The [
best`]
练习2
_INFO(“this is a test”);
- 删除双引号里的内容:f"vi"x
- 更改双引号里的内容:f"ci" (删除并进入插入模式)
map = {
“name” : “j”.
“age” : 13
}
- 快速修改这个map:ci"
文本对象最常搭配d(delete)、c(change)、v(visual)、y(yank)复制使用
我们需要拜托低效的字符操作,使用文本对象提高效率
08 vim复制粘贴和寄存器的使用
normal模式下的复制粘贴
- y 复制(yank)
- d 剪切
- p 粘贴(put)
我们可以用v命令选中所要复制的地方,然后使用y复制使用p粘贴
此外配合文本对象使用:
- yiw 复制一个单词
- yy 复制一行
vim命令模式分屏
分屏
- :vs 将当前文件垂直分屏(vertical split)
- :vs [file] 创建新文件并垂直分屏
- :sv/sp 水平分屏
- :sv [file] 创建新文件并水平分屏
分屏间光标移动
- ctrl+w h 切换到左边窗口
- ctrl+w j 切换到下边窗口
- ctrl+w k 切换到上班窗口
- ctrl+w l 切换到右边窗口
- ctrl+w w 在窗口之间循环切换
分屏移动
- ctrl+w H 将当前分屏移到最左边
- ctrl+w J 将当前分屏移到最下边,并拓展到整个屏幕宽度
- ctrl+w K 将当前分屏移到最上边,并拓展到整个屏幕宽度
- ctrl+w L 将当前分屏移到最右边
关闭分屏
- ctrl+w c 关闭当前子屏
- :hide 关闭当前窗口
- :only 只保留当前窗口,关闭其他窗口
- :qall 关闭所有窗口
- :wall 保存所有修改过得窗口