vim的使用方法与相关配置
插件的使用(后面会用到,可以先跳过不看)
vim-plug插件
网址:https://github.com/junegunn/vim-plug
里面详细介绍了各个平台的安装的方法
这里以mac系统为例子:
安装(mac终端上安装)
1 | curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ |
我们的第一个插件-startify
网址:https://github.com/mhinz/vim-startify
- 打开vimrc,终端 ~ 目录下输入:
新建.vimrc配置文件
1 | vim .vimrc |
参数说明:
- call plug#begin(‘~/.vim/plugged’) //插件开始
- Plug ‘mhinz/vim-startify’ //以后的安装插件方式,基本就是把github链接的最后两个路径输入即可
- call plug#end() //插件结束
在vimrc配置文件中,输入:
1 | call plug#begin('~/.vim/plugged') |
进入command模式:
- :w
- :source .vimrc
- :PlugInstall
- :wq
之后在终端输入:
1 | vim |
然后就可以看到这个界面了:
如果出现打不开的情况,startify: Can't read viminfo file. Read :help startify-faq-02
在终端下执行:
- chmod 777 .viminfo
- vim .viminfo
- :wq
即可解决
如何搜寻自己需要的插件
- 在 github 上搜索
- 网址:https://vimawesome.com
清除插件
.vimrc的command下执行:
- :PlugClean
.vimrc文件的配置
作用:让配置持久化,不用每次进入vim都要打开显示行数等的操作
在终端执行以下两个命令:
- cd ~
- vim .vimrc
.vimrc一些常用的设置
1 | set number |
以下内容可以选择自己需要的补充进来:
1 | set nocompatible " 关闭 vi 兼容模式 |
vim的四种模式
- normal模式(进入vim后的默认模式)
- insert模式
- command模式
- visual模式
如何进入command模式
normal模式下按下:
如何进入insert模式:
小写:
- i : 在当前位置的前一个空隙插入
- a: 在当前位置的后一个空隙插入
- o: 在当前行的下一行插入
- gi:快速进入insert模式并跳转到最后一次编辑的地方
大写:
- I : 在行首插入
- A: 在行尾插入
- O:在当前行的上一行插入
如何进入visual模式:
- v: 区域选取
- V:行选取
- ctrl + v:块选取
退出insert/visual模式:
- 左上角的 ESC
- ctrl + [
光标的移动
基本移动
- h:左移
- j:右移
- k:下移
- l:上移
word移动
- w:下一个word的开头
- e:下一个word的结尾
- W:下一个WORD的开头
- E:下一个WORD的结尾
- b:上一个word的开头
- B:上一个WORD的开头
注意:WORD指的是以空格为单位进行移动
行间搜索移动
在normal模式下:
- f + 字符 分号/逗号跳转到下一个/上一个,大写的F表示反过来搜索前面的字符
水平移动
- 0:移动到行首
- $:移动到行尾
页面的移动
- gg/G:移动到文件的开头/结尾
- H/M/L:跳转到屏幕的开头(Head)/中间(Middle)/结尾(Lower)
- Ctrl + o:快速返回
- Ctrl + u:向上翻页
- Ctrl + f:向下翻页
- zz:把屏幕置为中间
插件:快速移动光标
- 不懂如何使用插件的童鞋直接跳转到本文章的插件位置,有详细使用过程。
网址:https://github.com/easymotion/vim-easymotion
映射(快捷键 ss):
- nmap ss
(easymotion-s2)
复制粘贴
normal模式下:
- y和p 进行复制
- d和p 进行剪贴
- yiw 复制一个单词
- yy 复制一行
提示:可以进入visual模式选中要操作的区域进行复制或者剪贴的操作
insert模式下:
假如粘贴代码出现缩进混乱的情况解决方案:
- 出现这种情况一般是因为设置了autoindent
步骤:- :set paste
- 粘贴
- :set nopaste
提示:是不是感觉很麻烦?其实可以用映射来处理
寄存器
其实,复制与剪切下来的内容,都被临时的放在了“无名寄存器”中
我们可以利用寄存器进行复制粘贴的操作
示例:
- 把内容保存到寄存器:
- “ayiw 复制一个单词到寄存器a中
- “bdd 删除当前行到寄存器b中
- 查看寄存器:
- reg + 寄存器名称
- 粘贴:
- “ap 粘贴寄存器a中的内容
- “bp 粘贴寄存器b中的内容
如何将vim里的内容复制到系统剪贴板:
- 首先要确保系统中有 clipboard(我的vim里没有,不知道如何安装)
- :echo has(‘clipboard’)
- 结果为“1”,表示存在
- 一般使用v/V选择内容
- “+y 表示复制到了系统剪贴板
把其他位置的内容复制到vim中:
- 首先要确保系统中有 clipboard
- :set clipboard=unnamed
- 直接按下p进行粘贴
删除
insert模式下(linux命令行下通用):
- ctrl + h:删除上一个字符
- ctrl + w:删除上一个单词
- ctrl + u:删除当前行光标前的所有内容
normal模式下:
- dd:删除当前行
- x/X:删除后/前一个字符
- dw:删除后一个word
- dW:删除后一个WORD
- db:删除前一个word
- dB:删除前一个WORD
- daw:删除一个单词(包括空格)
- diw:删除一个单词(不包括空格)
- dip:删除一个段落
特殊操作:
1 | def test(): |
移动光标到要修改的位置:
viw:选中一个单词
vi + “ //选中双引号中的内容
ci + “ //删除双引号中的内容并进入插入模式
局部删除:
如果想删除(hello world)括号里面的所有内容:
- dt)
//意思是删除,直到遇到这个括号
- dt)
如果想删除光标后面的所有内容:
- VGd
如果想删除当前行的光标前面所有内容:
- d0
如果想删除当前行的光标后面所有内容:
- d$
其实所有删除的命令都可以结合数字来重复执行
例如:
- 4dd:删除下面4行
- 5x:删除后面5个字符
查询
字符串的查询:
normal 模式下:
- / + word:前向搜索
- ? + word:后向搜索
使用n/N跳转到下一个/上一个
插件:文件的查询
文件管理器
网址:https://github.com/scrooloose/nerdtree
快捷键:map <C-n> :NERDTreeToggle<CR>
模糊搜索器(ctrlp)
网址:https://github.com/ctrlpvim/ctrlp.vim
快捷键:<C-p>
- 最好提前将目录移动至根目录下,方便全局搜索
更加强大的模糊搜索工具:fzf.vim
网址:https://github.com/junegunn/fzf.vim
撞上插件以后会发现Ag无法使用
解决办法:
- mac下需要安装(直接在终端执行下面两个语句):
1 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
然后Ag就可以使用了
- centos下需要安装:
在 https://github.com/ggreer/the_silver_searcher/releases 下随便找一个,拷贝连接
1 | wget https://github.com/ggreer/the_silver_searcher/archive/2.2.0.tar.gz |
然后进入vim执行Ag命令时有可能提示要更新,输入 y 即可,之后Ag就可以使用了
语法:
- :Ag 回车 输入字符串 (提示:最好是提前切换好目录,不然文件太多)
- :Files 回车 输入文件名称 (例子:Files /hello.py ,表示从根目录下,搜索名为
hello.py的文件,如果输入一个目录名字的话,会把该目录下的所有文件展示出来)
替换
normal模式下的局部替换:
- r + 字符:替换为输入的字符
- s:删除当前字符并进入插入模式
- R:从左到右连续替换字符
- S:删除当前行并进入插入模式
- caw:删除当前单词,并进入插入模式
c + 命令有很多,可以自己研究一下:
例子:
t和f两个字母的含义:
- f:find
- t:till
经过我的测试可以和 v配合使用:
v + f + 字符:选中后面内容直到找到那个字符(也删选中那个字符)为止v + t + ":选中后面的内容直到找到 “ (不选中”)为止c + f + 字符:删除后面内容直到找到那个字符(也删除那个字符)为止,并进入插入模式c + t + ":删除后面的内容直到找到 “ (不删除”)为止,并进入插入模式
搜索替换
格式:
[range] s /{pattern}/{string}/[flags]- range 表示范围 比如 10,20 表示10-20行,%表示全部
- pattern 为要替换的模式,string 为替换后文本
- g(global):表示全局范围内执行
- n(number):报告匹配到的次数而不进行替换,可以用来查询匹配次数
例子:
:% s/word1/word2/g
正则表达式的应用:
1 | def do_quack(ducker): |
这种情况下只想替换函数里面的quack,而不替换函数名称包含quack的do_quack话,可以这样做:
:% s/\<quack\>/word/g
插件
vim-surround(成对替换)
快速替换,添加,删除 单引号,双引号等
网址:https://github.com/tpope/vim-surround
语法:
- ds 删除
- cs 替换
- ys 添加
例子:
- print(“hello world”) #
ds " - print(“hello world”) #
cs " ' - print(hello world)
- 其中有很多空格的话用这个
ys vf) "这一种光标要移动到句子开头 - 只有一个单词的话用这个
ys iw "
- 其中有很多空格的话用这个
多文件批量替换
网址:https://github.com/brooth/far.vim
语法:
:Far {被替换的词} {要替换成的词} 路径
注意,只能替换输入的路径中的文件内容,比如输入 / ,并不是替换根目录下的全部包括其下所有目录中的文件,而是只替换根目录下的文件内容*
例子:vim /tmp/hello.py
print(“hello world”)
:Far hello hi /tmp/*.py 或者 :Far hello hi /tmp/
:Fardo //确认替换
多文件操作
首先提一个概念-Buffer:
- Buffer 是指打开的一个文件的内存缓冲区
- 窗口是buffer可视化的分割区域
- tab 可以组织窗口为一个工作区
在文件中的修改都是针对内存中的缓冲区,并不会直接保存到文件
直到我们执行 :w 的时候才会把修改内容写入到文件里
如何切换Buffer:
- :ls //查看缓冲区
- :b n //跳转到第n个缓冲区
- :bpre //跳转到上一个缓冲区
- :bnext //跳转到下一个缓冲区
- :bfirst //跳转到第一个缓冲区
- :blast //跳转到最后一个缓冲区
- :b buffer_name + tab补全
如何在一个buffer中打开其他的文件:
- :e 文件名
窗口:
一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区
- <Ctrl + w>s 水平分割 //或者sp
- <Ctrl + w>v 垂直分割 //或者vs
切换窗口:
- <Ctrl + w>w //循环切换窗口
- <Ctrl + w>h/j/k/l //左/下/上/右切换窗口
移动窗口:
- <Ctrl + w>H/L //左右移动窗口
标签页
- :tabe + filename //在新的标签页中打开文件
- :
T //把当前窗口移动到一个新标签页 - :tabc //关闭当前标签页及其中的所有窗口
- :tabo //只保留活动标签页,关闭其他所有标签页
- gt //切换标签页
“宏”的使用方法
宏就像是拍电影😂
q(开始) + 寄存器名称 + {操作} + q(退出)
例子:
给所有的行首尾加上双引号:
1 | www.baidu.com |
录制过程:
qaI"<Esc>A"<Esc>q
录制完成后输入
@a即可给光标所在行执行相同的操作
- 问题:这样一行一行的重复操作很麻烦,怎么办呢?
方法:
- VG 把光标下的所有行选中
- 进入command模式
- :normal @a
即可给所有行执行相同的操作
屌不屌🐂
补全
ctrl + n/p 补全单词ctrl + xf 补全文件名
补充:
插入当前文件名 :r! echo %
插入当前文件完整路径 :r! echo %:p
映射
递归映射(极度不推荐,有可能会出现map连锁)
进入command模式下:
- :map - x //按下 - 等于 x 来删除字符
- :map
viw //按下空格选中单词 - :map
dd //按下 ctrl + d 来删除一行
map默认下是normal下的映射
- nmap //normal模式下的map
- vmap //visual模式下的map
- imap //insert模式下的map
之所以不推荐使用递归的map,是因为以下这种情况
map - dd
map \ -
非递归映射(用这个即可)
- nnoremap
- inoremap
- vnoremap
vim的配色和美化
配色方法:
- :colorscheme 显示当前的主题配色,默认是default
- :colorscheme
显示所有的配色 - :colorscheme + 名称 更换配色
插件美化
状态栏美化插件:
网址:https://github.com/vim-airline/vim-airline