前言
使用vim已经很久了,记得当初促使我学习使用vim的原因是因为长时间频繁的挪动肩膀(鼠标与键盘之间的来回切换)导致我一天工作下来,无亚于做了一天的体力活 : ( ,虽然有尝试记住IDE(goland)的一些快捷键来缓解肩膀的压力,但是始终无法做到”面面俱到“ , 在用vim时是需要手动搭建适合自己的开发环境的,在大量的插件中找到并调试成不逊色于IDE的开发环境,这往往就阻止了很多使用者,如何既享受vim带来的便捷操作,又可以简单自由搭配组建自己的开发环境;我这边使用的是vscode+vim的方式;vscode自不必介绍,号称“宇宙第一编辑器”😃,丰富的插件库,傻瓜式安装,卸载,可以让使用者自由搭配适合自己的开发环境,哪怕你是一个多语言人才,一个编辑器就可以满足你的需求; 这里简单记录下使用的快捷键;关于vim的配置文件和vscode的配置文件见:https://github.com/wzbwzt/myvim
安装
Vim配置文件.vimrc,分系统配置和用户配置两种。
系统配置文件存放在Vim的安装目录,默认路径为/usr/share/vim/.vimrc,使用命令echo $VIM查看
用户配置文件,存放在用户主目录下~/.vimrc。使用命令echo $HOME确定用户主目录。
vim的三种常用模式:普通模式(默认)、插入模式、命令行模式。
移动
h\j\k\l >左、下、上、右
w>移动到下一个单词的第一个字符位置
e>移动到下一个单词的最后一个字符位置
b>移动到上一个单词的第一个字符位置
ge>移动到上一个单词的最后一个字符位置
W>移动到下一个字串的第一个字符位置
E>移动到下一个字串的最后一个字符位置
B>移动到上一个字串的第一个字符位置
gE>移动到上一个字串的最后一个字符位置
注意:单词与字串的区别
单词:以非字母、数字、下划线分割
字串:以空白字符分割
0>移动光标到行首
$>移动光标到行尾
}>移动到光标所在段的段尾
{>移动到光标所在段的段头
H>移动到当前屏幕的顶端
L>移动到当前屏幕的底端
M>移动到当前屏幕的中端
zz>将光标所在行展示到屏幕中间
zb>将光标所在行展示到屏幕底端
zt>将光标所在行展示到屏幕顶端
:+数字>移动到指定行数
数字+G>同上
gg>移动到文件首部
G>移动到文件尾部
%>移动到括号所在的另一半位置,来回切换
ctr+d>往下翻半页
ctr+u>往上翻半页
搜索
/+char>往下搜索;
?+char>往上搜索;
注意:n 跳到下一个匹配位置;N 跳到上一个匹配位置
/+char\c >\c
强制不区分大小写
*>移动到与光标所在单词匹配的下一个单词处
#>移动到与光标所在单词匹配的上一个单词处
注意搜索到的词会高亮显示;
:noh
取消高亮
跳转
ctr-] -> 跟着link/tag转入 (follow link/tag)
ctr-o -> 回到上一次的jump (go back)
ctr-i -> 跳回下一个 (go forward)
:ju -> 显示所有的可以跳跃的地方 (print jump list)
替换
语法:[addr]s/源字符串/目的字符串/[option]
[addr]表示检索范围,如:
“1,n”:表示从第1行到n行
“%”:表示整个文件,同"1,$"
“.,$”:表示从当前行到文件尾
[addr]表示检索范围,如:
“1,n”:表示从第1行到n行
“%”:表示整个文件,同"1,$"
“.,$”:表示从当前行到文件尾
[addr]省略时表示当前行
s:表示替换操作,其为substitute的缩写
[option] : 表示操作类型,如:
g:globe,表示全局替换
c:confirm,表示进行确认
p:表示替代结果逐行显示(Ctrl + L恢复屏幕)
i:ignore,不区分大小写
[option]省略时仅对每行第一个匹配串进行替换
插入、删除:
i >从光标头插入
a >从光标尾插入
I >从光标所在行头插入
A >从光标所在行尾插入
o >跳转到光标所在行的下一行插入
O >跳转到光标所在行的上一行插入
x >删除光标所在字符(不进入插入模式)
X >删除光标所在前一个字符(不进入插入模式)
d0>删除光标所在字符到行首内容;(0表示行首)
d$>删除光标所在字符到行尾内容;($表示行首)
D>作用同上
dw>删除光标到字符串结束的位置
db>删除光标到字符串开始的位置
dd>删除整行
数字+dd>指定往下删除的行数
d+数字+w>指定删除往后的单词数
cw>删除光标所在到字符串结束的位置,并进入插入模式;
cb>删除光标所在到字符串开始的位置,并进入插入模式;
ciw>删除光标所在字符串并进入插入模式;
d)>删除光标到句末的位置("()“表示句子)
d(>删除光标到句首的位置
d}>删除光标到段末的位置(”{}"表示段子)
d{>删除光标到段首的位置
yw>复制光标到字符串结束的内容
yb>复制光标到字符串开始的内容
yy>复制整行
p>黏贴内容到光标之后的位置
P>黏贴内容到光标之前的位置
r>替换光标所在字符
R>替换光标所在字符,不退出,按Esc退出替换模式
u>撤销上次操作
ctr+r>反撤销
ctr+g>显示相当文件信息(路径,行数,光标所在行数占总百分比)
:w>保存当前文件
:wq>保存并退出
:w!>强制保存
:reg >查看黏贴板中的内容
代码折叠
za>打开or关闭折叠
zM>关闭所有折叠
zR>打开所有折叠
配置文件中的设置:
' indent表示基于缩进进行的折叠
set foldmethod=indent
' Vim启动 时关闭折叠
set nofoldenable
visual模式
v>字符选择模式
V>行选择模式
Ctr+v>块选择模式
注意:
- Ctr+v进入块选择模式后,I 进入插入模式,可以对同一列进行批量插入操作;
- V 进入行模式后,< or >可以进行缩进缩出
- visual模式下,按
u
将单词全部转换为小写,U
全部转换为大写
寄存器
26字符+10个数字,都可以作为对象来寄存数据,只要在"
后指定寄存对象;例如"ayiw
将当前的光标所在单词,寄存到a,可以通过"ap
来调用黏贴;
注意:指定大写寄存器名称,是对该寄存器下的内容进行追加;而小写测试覆盖;
注意:vim中的d删除会寄存删除内容,p可以直接复制刚刚删掉的内容,如果不希望,保留d删除的内容,可以指定"_dw
来指定删除;
:reg>查看所有寄存器中的内容
宏
宏既是讲一系列操作记录到指定寄存器中,从而实现重复调用命令的目的
q 寄存器名
进入宏录制,q
退出宏录制
@ 寄存器名
调用指定寄存器中的一系列命令;同样可以通过"寄存器名
来调用
打标记(mark)
m 字母
来指定使用谁来标记当前位置;
注意:小写字母标记只在当前文件中跳转(局部);大写字母标记位置可以在不同文件中进行跳转(全局)
`字母
来跳转到指定标记位置;
'字母
来跳转到指定标记位置的行首;
`` 进行回跳;
:marks
查看当前的所有标记信息
分屏
:vsp 文件名>垂直分屏
:sp 文件名>水平分屏
Ctr+w v>垂直分屏当前光标所在文件
Ctr+w s>水平分屏当前光标所在文件
Ctr+w c>关闭当前光标所在文件
Ctr+w w>分屏轮流切换文件
Ctr+w h/j/k/l>分屏指定方位切换文件
vscodevim
vscodevim自带插件有easymotion、incsearch、useSystemClipboard、useCtrlKeys、hlsearch;
相关键映射配置见:https://github.com/wzbwzt/myvim
vscodevim使用说明见:这里
注意:这里收集的几个插件都是非常好用的,尤其是easymotion 😃;可以帮助我们实现快速高效的移动到指定位置,具体见说明
插件管理工具vim-plug
vim-plug采用异步多线程来下载安装插件,支持git、标签,可以进行版本回滚操作;
git地址:https://github.com/junegunn/vim-plug
安装plug.vim到.vim/autoload目录下就可以使用;
" Specify a directory for plugins
" - For Neovim: stdpath('data') . '/plugged'
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim/plugged') //指定存放路径
" Make sure you use single quotes
" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
Plug 'junegunn/vim-easy-align'
" Any valid git URL is allowed
Plug 'https://github.com/junegunn/vim-github-dashboard.git'
" Multiple Plug commands can be written in a single line using | separators
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
" On-demand loading
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
" Using a non-default branch
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
Plug 'fatih/vim-go', { 'tag': '*' }
" Plugin options
Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
" Plugin outside ~/.vim/plugged with post-update hook
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
" Unmanaged plugin (manually installed and updated)
Plug '~/my-prototype-plugin'
" Initialize plugin system
call plug#end() //标志结束
:PlugInstall
>安装所有插件;
:PlugInstall[name...]
>指定安装插件
:PlugStatus
>查看插件状态
:PlugUpdate[name...]
>更新插件
:PlugUpgrade
>更新vim-plug自身