2022.11.2
使用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:~$
最喜欢的主题是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-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:~$
一个好用的vim开屏插件。
https://github.com/mhinz/vim-startify
call plug#begin('~/.vim/plugged')
Plug 'mhinz/vim-startify'
call plug#end()
:w
:source ~/.vimrc
:PlugInstall
报错:connect to github.com port 443: Connection timed out
解决:
Updated. Elapsed time: 0.015813 sec.
[=]
- Finishing ... Done!
- vim-startify: Already installed
使用nerdtree插件进行文件目录树管理。
解决跳转文件得问题。
https://github.com/preservim/nerdtree
Plug ‘preservim/nerdtree’
痛点:退格键太远,用起来不方便,我们可以抛弃退格键
需要先进入编辑模式或者在命令行中使用:
只可以在终端命令行中使用
4. ctrl+a 光标快速移动到开头
5. ctrl+e 光标快速移动到结尾
6. ctrl+b 光标往前移
7. ctrl+f 光标往后移
痛点:Esc按起来不方便,不方便切换到normal模式
反人类:hjkl
坚持使用几天,就可以熟练。
小写word指得是以非空白符分割的单词,大小WORD以空白符分割的单词
同一行快速移动的方式其实是搜索一个字符并且移动到该字符。
记住0 移动到行首,$移动到行尾就可以了。
:help ( 可以查询命令的用法
vim的normal模式提供了强大的命令来移动。
学习vim,让写代码就像弹钢琴,让别人眼睛的速度都跟不上你操作的速度。
进入插入模式编辑文本。aio/AIO
normal模式下:
vim中 数字+命令 可以用于执行多次命令
可以搭配visual模式行选或块选快速删除。
相比删除,更常用修改。一般是删除之后改成我们希望的文本。
* 光标在单词上,使用*号,进行当前单词的前向匹配,找到相同的单词(向下)# 进行当前单词的后向匹配(向上)substitute命令允许我们查找并且替换掉文本,支持正则表达式
如 :% s/self/this/g 将全局的self替换成this
如 :1,6 s/self/this/g 将1-6行的self替换成this
如 :% s/self//n 查看全文有多少self
如 :% s/\ 使用正则表达式,精确匹配所有quack,而不会有_quack等
延伸:可以使用插件批量搜索替换多个文件中的匹配
Buffer、Window、Tab
如何在buffer之间切换?
:ls 会列举当前缓冲区,然后使用:b n跳转到第n个缓冲区窗口是可视化的分割区域。
一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区
每个窗口可以继续被无限分割(看屏幕是否足够大)
可以在不同的窗口用: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是可以容纳一系列窗口的容器
vim的tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
比如一个Tab全用来编辑python文件,一个tab全是html文件
相比窗口,tab一般用的比较少,tab太多管理起来也比较麻烦
Tab标签页切换操作如下:
命令模式下:
normal模式下
标签页一般建立两个就好,太多不好操作
Note: 后面会配合ctrlp插件和nerdtree快速操作多个文件
vim里文本也有对象的概念,比如一个单词,一段句子,一个段落
很多其他编辑器经常只能操作单个字符来修改文本,比较低效,但vim删除一个单词只要dw
通过操作文本对象来修改要比只操作单个字符高效
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.
This is a “word”.
The[best]` 可用于markdown文档 The [best`]_INFO(“this is a test”);
map = {
“name” : “j”.
“age” : 13
}
文本对象最常搭配d(delete)、c(change)、v(visual)、y(yank)复制使用
我们需要拜托低效的字符操作,使用文本对象提高效率
我们可以用v命令选中所要复制的地方,然后使用y复制使用p粘贴
此外配合文本对象使用: