Vim基本配置&快捷键&常用命令

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

  1. vim .vimrc,增加该插件名称
call plug#begin('~/.vim/plugged')
Plug 'mhinz/vim-startify'
call plug#end()
  1. 保存然后source .vimrc
:w
:source ~/.vimrc
  1. 执行:PlugInstall
:PlugInstall

报错:connect to github.com port 443: Connection timed out
解决:

  1. 打开 https://github.com.ipaddress.com/
  2. 复制IP Address
  3. sudo vim /etc/hosts
    在末尾添加:140.82.114.4 github.com
  4. source /etc/hosts
  5. 重新下载,成功
Updated. Elapsed time: 0.015813 sec.                                                
[=]    

- Finishing ... Done!                                                          
- vim-startify: Already installed    

02 nerdtree-vim文件目录和搜索插件

使用nerdtree插件进行文件目录树管理。
解决跳转文件得问题。

https://github.com/preservim/nerdtree

Plug ‘preservim/nerdtree’

  1. :NERDTree命令用于打开目录
  2. vim .vimrc 添加快捷键

vim快捷键

01 进入/退出插入模式

进入
  1. a append after current char
  2. A append after current line
  3. i insert before current char
  4. I insert before current line
  5. o open a line below
  6. O open a line above
退出
  1. :w 保存
  2. :wq 保存并退出
  3. :qa 退出所有窗口

02 快速纠错

痛点:退格键太远,用起来不方便,我们可以抛弃退格键

需要先进入编辑模式或者在命令行中使用:

  1. ctrl+h 删除前一个字符
  2. ctrl+w 删除前一个单词
  3. 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”]
  • iThe[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命令模式分屏

分屏
  1. :vs 将当前文件垂直分屏(vertical split)
  2. :vs [file] 创建新文件并垂直分屏
  3. :sv/sp 水平分屏
  4. :sv [file] 创建新文件并水平分屏
分屏间光标移动
  1. ctrl+w h 切换到左边窗口
  2. ctrl+w j 切换到下边窗口
  3. ctrl+w k 切换到上班窗口
  4. ctrl+w l 切换到右边窗口
  5. ctrl+w w 在窗口之间循环切换
分屏移动
  1. ctrl+w H 将当前分屏移到最左边
  2. ctrl+w J 将当前分屏移到最下边,并拓展到整个屏幕宽度
  3. ctrl+w K 将当前分屏移到最上边,并拓展到整个屏幕宽度
  4. ctrl+w L 将当前分屏移到最右边
关闭分屏
  1. ctrl+w c 关闭当前子屏
  2. :hide 关闭当前窗口
  3. :only 只保留当前窗口,关闭其他窗口
  4. :qall 关闭所有窗口
  5. :wall 保存所有修改过得窗口
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值