VIM

基本介绍

vim诞生已有20多年,它常被人称之为编辑器之神,vim的操作理念可以说是独具一格而又出类拔萃,使用vim能极大的提升文本处理效率,因此熟练掌握vim应该是每个程序员都应该做到的事情。

vim目前有3个较常见的版本:

  • vi:只保留了一些基础功能,在绝大多数Linux发行版中都内置了vi
  • vim:相较于vi功能更加完善,是标准的版本,但是在某些Linux发行版中需要手动安装
  • neovim:目前最火热的一个vim分支,它在vim原本的基础上做了一些改进,使其更加的优秀

安装nvim

由于neovim是今后的主流,所以我们选择安装neovim,可参阅官方文档查阅安装方法,我这里是以MAC平台为例。

1)下载neovim的安装包:

  1. $ wget https://github.com/neovim/neovim/releases/download/stable/nvim-macos.tar.gz

2)解压到指定的目录:

  1. $ tar xzf ./nvim-macos.tar.gz -C /usr/local/application/
  2. $ mv /usr/local/application/nvim-osx64/ /usr/local/application/nvim

3)将neovim添加到系统环境变量,并将nvim alias 为 vim:

  1. $ vim /etc/profile
  2. alias vim='nvim'
  3. PATH=/usr/local/application/nvim/bin:$PATH
  4. $ source /etc/profile

4)输入vim后能够看到neovim的字样则代表安装成功:

模式介绍

vim有4种模式,分别是:

  • NORMAL:普通模式、使用ESC进入
  • INSERT:插入模式、使用i、a、o、I、A、O、s、S、c进入,使用ESC退出
  • COMMAND:命令模式、使用 : 进入,输入命令后要回车才会生效,使用ESC退出
  • VISUAL:可视模式、使用v、V进入,使用ESC或者v、V退出

首先当我们进入vim后,它会处于普通模式中,普通模式是vim最强大的也最常用的模式。

普通模式

光标移动

普通模式下光标移动命令如下:

命令 描述
h 光标向左移动一个字符
l 光标向右移动一个字符
j 光标向下移动一行
k 光标向上移动一行
w 向后移动一个单词,光标位于单词首部
b 向前移动一个单词,光标位于单词首部
e 向后移动一个单词,光标位于单词尾部
f {char} 向后查询一个字符,并将光标跳转到目标处
F {char} 向前查询一个字符,并将光标跳转到目标处
t {char} 向后查询一个字符,并将光标跳转到目标前一个位置
T {char} 向前查询一个字符,并将光标跳转到目标后一个位置
0 光标移动到本行的起始位置
$ 光标移动到本行的结束位置
^ 光标移动到本行的第一个非空白字符处
$_ 光标移动到本行的最后一个非空白字符处
G 光标移动到文件的开头
gg 光标移动到文件的末尾

注意w、b、e如果光标正位于当前单词的中间,那么它将会先把光标移动到当前单词的首部或者尾部。

文档浏览

普通模式下文档浏览命令如下:

命令 描述
H 光标移动到当前屏幕展示内容区域第一行的第一个字符
M 光标移动到当前屏幕展示内容区域中间行的第一个字符
L 光标移动到当前屏幕展示内容区域最后一行的第一个字符
zt 将光标所在行设为屏幕展示区域的首行
zz 将光标所在行设为屏幕展示区域的中心
zb 将光标所在行设为屏幕展示区域的尾行
ctrl + u 查看上半页内容
ctrl + d 查看下半页内容
ctrl + f 查看下一页内容
ctrl + b 查看上一页内容
[ 与 ] 跳转到上一句、下一句
{ 与 } 跳转到上一段、下一段
gt 切换下一个选项卡
gT 切换上一个选项卡

文档插入

普通模式下文档插入命令如下,若想从编辑模式回到普通模式,只需要按下ESC键即可:

命令 描述
a 光标后进行插入,进入编辑模式
i 光标前进行插入,进入编辑模式
o 下一行进行插入,进入编辑模式
A 当前行尾插入,进入编辑模式
I 当前行首插入,进入编辑模式
O 上一行进行插入,进入编辑模式
s 删除当前光标下的内容,并进入编辑模式
S 删除当前行的内容,并进入编辑模式
cc 删除当前行的内容,并进入编辑模式

复制粘贴

普通模式下复制命令如下:

命令 描述
y 复制当前光标下的内容
yy 复制当前行中的内容
p 将内容粘贴至下一行
P 将内容粘贴至上一行

删除替换

普通模式下删除替换命令如下:

命令 描述
dd 删除当前行的内容
cc 删除当前行的内容,并进入编辑模式
r 替换当前光标下的内容
R 替换当前光标后的内容,按ESC键回到普通模式
s 删除当前光标下的内容,并进入编辑模式
S 删除当前行的内容,并进入编辑模式

注意,dd命令删除其实是剪切的意思,你可以通过p或者P来进行粘贴。

撤销重做

普通模式下撤销重做命令如下:

命令 描述
u 撤销
ctrl + r 重做

数字加减

普通模式下数字加减命令如下:

命令 描述
ctrl + a 数字自加1
ctrl + x 数字自减1

字符转换

普通模式下字符转换命令如下:

命令 描述
~ 将光标下的字母切换大小写
g ~~ 将当前行的字母切换大小写
gUU 将当前行的字母改成大写
guu 将当前行的字母改成小写
gUaw 将当前单词改成大写
guaw 将当前单词改成小写

缩进重复

普通模式下缩进重复命令如下:

命令 描述
>> 进行缩进,默认为8个空格
<< 进行反缩进
. 重复上一次的动作

指令动作

vim里分为指令和动作,我们可以通过它们的组合定义出一系列的动作链进行执行。

比如,向右移动3个字符:

  1. 3l

再比如,向后查询第二个以f开头的字符:

  1. 2ff

删除全文:

  1. dG
  2. dgg

令数字自增或者自减n个值:

  1. 100 ctrl+a
  2. 100 ctrl+x

在文档操作中,有一类操作很常见,比如删除下面Array的内容:

  1. [1, 2, 3, 4, 5]

我们可以将光标移动到该数组上,输入以下命令即可,其中i代表inner,即不包含[]自身:

  1. ci[
  2. # change inner []

如果你想连同[]也一起删除,可以输入以下命令,其中a代表all,即包含[]自身:

  1. ca[
  2. # change all []

同理,[]、()、{}以及""和''都支持这样操作。

在HTML文档操作中,删除一个标签的内容可能会经常常用,对此你可以直接在将被删除的标签上使用cit命令即可:

  1. cit
  2. # change inner the

同理,若要连标签一起删除,可以使用cat命令:

  1. cat
  2. # change all the

常用组合

以下的n均代表数字。

文档插入:

命令 描述
:n 跳转到指定的行数
nh、nl、nj、nk 向左右移动n个字符、向上下移动n行
nw、nb 向前或后移动n个单词
nf{char}、nF{char} 向前或后查询第n个字符,并将光标跳转到此处
0、^、$_、$ 光标移动到本行的起始或结束位置
G、gg 光标移动到文件的开头或者末尾

复制粘贴:

命令 描述
nyw 复制n个词语
yy 复制一整行
nyy 复制n行
yi" 复制本行的""中的内容
ya" 复制本行的""
p、P 将内容粘贴至下一行或上一行

删除文本:

命令 描述
r 替换当前光标下的内容
R 替换当前光标后的内容,按ESC键回到普通模式
ndw 删除n个单词,也可以使用dnw
ndd 删除n行,也可以使用dnd
dG 从文本开头删到文本结束
dgg 从文本结束删到文本开头
df{char} 删除本行中f之前的内容
di" 删除本行的""中的内容
da" 删除本行的""
dit 删除HTML标签中的内容
dat 删除HTML标签
cat 删除HTML标签,并且进入编辑模式,通常情况下c要比d更常用

数字加减:

命令 描述
ctrl + a 数字自加1
ctrl + x 数字自减1
n ctrl + a 数字自加n
n ctrl + x 数字自减n

缩进重复:

命令 描述
>> 进行缩进,默认为8个空格
<< 进行反缩进
. 重复上一次的动作

命令模式

文件开关

命令模式下文件开关命令如下:

命令 描述
:w 与 :w! 保存当前文件但不退出、加!是强制保存
:wa 与 :wa! 保存所有文件但不退出、加!是强制退出
:q 与 :q! 退出当前文件但不保存、加!是强制退出
:qa 与 :qa! 退出所有文件但不保存、加!是强制退出
:x 与 :x! 退出当前文件并保存、加!是强制退出并保存
:wq 与 :wq! 退出当前文件并保存、加!是强制退出并保存
:xa 与 :xa! 退出所有文件并保存、加!是强制退出并保存
:wqa与:wqa! 退出所有文件并保存、加!是强制退出并保存
:saveas file 将文件另存为
:tabnew file 在选项卡中打开另一个文件
:tabn 与 :tabp 切换下一个或上一个选项卡
:tabc 与 :tabo 关闭当前或其他选项卡
:bn 与 :bp 打开上一次或下一次浏览的选项卡

行号相关

命令模式下行号相关命令如下:

命令 描述
:set nu 显示行号
:set nonu 隐藏行号
:set rnu 设置相对行号
:set nornu 关闭相对行号
:n 定位到n行

拼写检查

命令模式下拼写检查相关命令如下:

命令 描述
:set spell! 打开或关闭拼写检查

查找替换

命令模式下查找替换命令如下:

命令 描述
{char} 查找字符串,通过n或者N进行光标的上下跳转
:{range}s/{target}/{replace}/{mode} 查找并替换字符串
:noh 取消搜索高亮

查找并替换字符串里其中range是范围,不写代表当前行、%代表全文。

而mode是查找模式,如i是大小写不敏感、I是大小写敏感、g是行模式等、c代表是替换确认:

  1. :s/http/https/i # 将当前行的http替换为https
  2. :%s/http/https/gi # 将全文的http替换为https

粘贴模式

有的时候我们复制一部分文本在vim中粘贴时可能会发生格式错乱的问题。

此时你只需要打开粘贴模式然后再p即可:

命令 描述
:set paste 打开粘贴模式
:set nopaste 退出粘贴模式

执行命令

在打开vim脚本时我们希望再到终端中执行某些命令,并且将命令的结果输入到当前文件中:

  1. :r !command # 如 :r !ls

ab替换

有些单词可能很长,如Elasticsearch,我们希望今后在输入es的时候vim会自动将它替换为Elasticsearch,为此我们可以定义一条ab规则:

  1. :ab es Elasticsearch

可视模式

基本概述

可视模式相当于多选操作,类似于鼠标左键一直摁住选择一块区域。

  • v:进入字符可视化模式,按v或者ESC键可退回到普通模式
  • V:进入行可视化模式,按V或者ESC键可退回到普通模式
  • ctrl + v : 进入块可视化模式,按ctrl + v或者ESC键可退回到普通模式

在可视模式下,一些按键被赋予了特殊的意义:

  • y:复制选择区域
  • d:删除选择区域
  • p:粘贴选择区域
  • >:进行缩进
  • <:进行反缩进
  • vi":选择"之中的内容,不包括""
  • va":选择"的内容,包括""

高级操作

分屏

我们可以在打开文件的时候进行分屏浏览:

  1. $ vim -on file1, filen ... filen # 注意!小写on代表上下分屏
  2. $ vim -On file1, filen ... filen # 注意!大写On代表左右分屏

若想在打开文件后进行分屏操作,则需要:

  1. ctrl + w s # 按照当前文件新拆分一个上下分屏
  2. :sp file # 按照指定文件新拆分一个上下分屏
  3. ctrl + w v # 按照当前文件新拆分一个左右分屏
  4. :vsp file # 按照指定文件新拆分一个左右分屏

移动上下分屏的位置:

  1. ctrl + w H # 将当前光标定位的分屏向左移
  2. ctrl + w L # 将当前光标定位的分屏向右移
  3. ctrl + w J # 将当前光标定位的分屏向下移
  4. ctrl + w K # 将当前光标定位的分屏向上移

切换左右分屏的光标:

  1. ctrl + w h # 将当前光标定位到左边分屏
  2. ctrl + w l # 将当前光标定位到右边分屏
  3. ctrl + w j # 将当前光标定位到下边分屏
  4. ctrl + w k # 将当前光标定位到上边分屏

关闭当前分屏的命令:

  1. ctrl + w c # 关闭当前分屏
  2. ctrl + w q # 关闭当前分屏,如果是最后一个分屏将退出vim

宏录制

在很多情况下我们希望重复一个动作,此时就可以使用宏录制功能。

在普通模式下进行操作:

  • 按q启动宏录制
  • 为你的宏取一个名字,如t
  • 开始录制你的操作
  • 录制完成之后按q结束录制
  • 按下@t执行宏

如我想生成一个从1到10的数字自增列:

  1. i 1 ESC # 进入插入模式,输入1,然后退到普通模式
  2. q t yy p ctrl+a q # 录制1次宏
  3. 8@t # 启动8次宏

配置文件

vim和neovim的配置文件存放地方有些不一样:

  • vim:~/.vimrc文件
  • neovim:~/.config/nvim/init.vim文件

如下是常用设置,其中"是注释:

  1. " 显示行号
  2. set number
  3. " 设置相对行号
  4. set relativenumber
  5. " 设置行宽
  6. set textwidth=80
  7. " 设置自动这行
  8. set wrap
  9. " 是否显示状态栏
  10. set laststatus=2
  11. " 语法高亮
  12. syntax on
  13. " 支持鼠标
  14. set mouse=a
  15. " 设置编码格式
  16. set encoding=utf-8
  17. " 启用256色
  18. set t_Co=256
  19. " 开启文件类型检查
  20. filetype indent on
  21. " 设置自动缩进
  22. set autoindent
  23. " 设置tab缩进数量
  24. set tabstop=4
  25. " 设置>>与<<的缩进数量
  26. set shiftwidth=4
  27. " 将缩进转换为空格
  28. set expandtab
  29. " 自动高亮匹配符号
  30. set showmatch
  31. " 自动高亮匹配搜索结果
  32. set nohlsearch
  33. " 开启逐行搜索,也就是说按下一次按键就继续一次搜索
  34. set incsearch
  35. " 开启类型检查
  36. " set spell spelllang=en_us
  37. " 开启命令补全
  38. set wildmenu
  39. " 不创建备份文件
  40. set nobackup
  41. " 不创建交换文件
  42. set noswapfile
  43. " 多窗口下光标移动到其他窗口时自动切换工作目录
  44. set autochdir

更多的情况下我们会替换掉一些默认普通模式下的vim快捷键,在配置前我们需要了解一些概念:

  • leader:前导键,类似于Thinkpad的小红点,它是vim的一个功能键
  • map:会递归的映射方式、a映射b、c映射a、那么按c其实就等于按了b
  • noremap:不会递归的映射方式
  • nnoremap:只会在普通模式下生效的映射方式
  • inoremap:只会在插入模式下生效的映射方式
  • vnoremap:只会在可视模式下生效的映射方式

配置文件如下,其中<cr>代表回车键:

  1. " 配置vim的前导键
  2. let mapleader = "\<space>"
  3. " 简化分屏模式快捷键
  4. noremap <C-j> <C-W>j
  5. noremap <C-k> <C-W>k
  6. noremap <C-h> <C-W>h
  7. noremap <C-l> <C-W>l
  8. " 修改选项卡操作,取消e和E的跳词
  9. nnoremap e gt
  10. nnoremap E gT
  11. nnoremap <leader>n :tabnew
  12. nnoremap <leader>cc :tabc<cr>
  13. nnoremap <leader>co :tabo<cr>
  14. " 修改回到普通模式的按键
  15. inoremap jj <Esc>

插件安装

vim的强大之处就在于它可以支持各种各样的插件。

在vim中,我们要想管理插件,就必须依赖另一款插件vim-plug

下载vim-plug(需要上梯):

  1. $ sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
  2. https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

将下面2行加入到~/.config/nvim/init.vim中,后续我们的插件都放在这2行中间:

  1. " begin指定插件存放目录
  2. " 如果是vim,则指定到~/.vim/autoload/中
  3. call plug#begin('~/.config/nvim/autoload/')
  4. " 插件放在这里
  5. call plug#end()

到github上寻找你要安装的插件,我们以配色插件举例,将它添加到init.vim文件中:

  1. call plug#begin('~/.config/nvim/autoload/')
  2. " 加载配色插件
  3. Plug 'theniceboy/vim-deus'
  4. call plug#end()

然后只需要进入vim在命令模式下输入以下命令即可完成以添加的插件安装:

  1. :PlugInstall

如果想更新以安装的插件,可以在vim命令模式下输入以下命令:

  1. :PlugUpdate

当需要卸载插件时,你只需要在init.vim文件中将加载的插件行进行删除或注释即可,这样vim下次启动时就不会加载该插件了:

  1. " 注释该插件
  2. " Plug 'theniceboy/vim-deus'

vim也提供了懒加载机制,只有在特定条件下该插件才会被加载,如下所示:

  1. " 只有在打开php、html、javascript类型文件时才加载该插件
  2. Plug 'yuezk/vim-js', { 'for': ['php', 'html', 'javascript'] }

有些vim插件可能在安装后需要做一些额外的操作,你可以在这些插件的自述文档中找到这些说明,比如在安装完成后执行一段脚本:

  1. Plug 'Yggdroot/LeaderF', { 'do': './install.sh' }

推荐在init.vim文件首行添加上这样一段代码,它的作用在于每次启动vim前都会检查是否安装了vim-plug插件,如果没有安装它将自动尝试安装且运行:PlugInstall命令:

  1. if empty(glob('~/.config/nvim/autoload/plug.vim'))
  2. silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  3. autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
  4. endif

443问题

在安装vim-plug时curl:433这个问题一直困扰我很久,我尝试了各种办法如挂代理、修改hosts文件等都没得到有效解决。

最后我在chrome中打开了vim-plug的url:

  1. https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

将里面的内容copy下来后到~/.config/nvim/autoload中touch了一个vim-plug文件,并将内容粘贴进去得到了解决。

vim 让人爱不释手的编辑器之神的更多相关文章

  1. 优测优社区干货精选|老司机乱谈编辑器之神——vim

    文 / 腾讯 吴双 前言 优测小优 有话说: 腾讯优测只有应用测试大神?不不不,我们还有各种研发大牛! *** vim 是一种信仰,我自从2004年有了这个信仰,已经12个年头了.本文介绍了学习vim ...

  2. Emacs和Vim:神的编辑器和编辑器之神, 到底哪个更好?

    Emacs和Vim:神的编辑器和编辑器之神, 到底哪个更好? 在这个蔚蓝色的星球上,流传着两大神器的传说:据说Emacs是神的编辑器,而Vim是编辑器之神. 一些人勇敢地拾起了Vim或Emacs,却发 ...

  3. 编辑器之神VIM 总结(一) 基础部分

     版本号 说明 作者 日期  1.0  vim基础知识 Sky Wang 2013/06/19       概要 vim和emacs,一个是编辑器之神,一个是神一样的编辑器.他们被称是UNIX系统下的 ...

  4. 工欲善其事:编辑器之神Vim(一)

    本篇文章收集了Vim最常用和实用的一些命令,掌握这些命令就可以使用Vim了 本文仅列举个人认为常用的命令,本系列文章更像是自己的学习笔记,而不是VIM使用教程. 如果你想了解vim的更多,可以看看Co ...

  5. Ubuntu学习小结(二)PostgreSQL的使用,进程的查看关闭,编辑器之神Vim入门

    距离上次发布文章已经过去了很久.在过去的半年中,虽然写的代码不多,但是在接触了计算机一些其他的知识,包括数据库.网络之后,感觉能够融会贯通,写代码水平又有了一定的提高.接下来,将会发表几篇文章,简单介 ...

  6. 随处可编辑的编辑器之神VIM

    据说这世界上只有三种编辑器:Vim,Emacs 和 其他编辑器,其中 Vim 被称作编辑器之神,Emacs 被称作神的编辑器,当然,其他编辑器永远只能是其他编辑器. 拿一位 网友的话 来说,VIM 的 ...

  7. Win10系统下安装编辑器之神(The God of Editor)Vim并且构建Python生态开发环境(2020年最新攻略)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_160 众神殿内,依次坐着Editplus.Atom.Sublime.Vscode.JetBrains家族.Comodo等等一众编辑 ...

  8. 编辑器之神_vim

    01vim简介 1.什么是vim: 文本编辑器 2.vim特点: 没有图形界面;只能是编辑文本内容;没有菜单 ;只有命令 3.在很多linux发行版中,直接把vi作为vim的软连接 02打开和新建文件 ...

  9. 新手入门之——Ubuntu上的编辑器之神Vi / Vim

    Ubuntu上的编辑器有gedit.vi.sublime等.gedit一般在没有其他编辑器时临时使用,大部分情况下,vi和sublime使用的比较多,Linux系统内置了vi和sublime,其中,s ...

随机推荐

  1. 日期SQL 脚本

    一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)本周的星期一     SELECT DATEADD(wk, DATEDIFF(wk,0,g ...

  2. Excel怎么把两个单元格中的文字合并到一个单元格中

    使用&符号,可以将字符串和单元格中的内容拼接起来

  3. BF算法(串模式匹配算法)

    主串和子串 主串与子串:如果串 A(如 "shujujiegou")中包含有串 B(如 "ju"),则称串 A 为主串,串 B 为子串.主串与子串之间的关系可简 ...

  4. python函数模块

    python函数模块 学习完本篇,你将会深入掌握 函数相关知识 1.函数定义 2.函数如何调用 3.递归函数以及匿名函数使用 模块相关知识 1.模块如何导入调用 2.函数调用顺序 函数定义 函数代码块 ...

  5. 如何实现Orchard Core CMS的全文索引

    Orchard Core提供了Lucene功能,允许您在网站上进行全文搜索.大多数情况下,在运行博客或简单的代理网站时,您可能需要在页面内容中进行搜索.在Orchard Core中,您可以使用Liqu ...

  6. requests接口自动化-数据库参数化

    数据库参数化的场景 部分接口,参数其他方式获取不到,可以去数据库去获取,如手机验证码 安装pymysql 配置文件 def sql_conf(): # 定义数据库的配置 host='127.0.0.1 ...

  7. redis小结 1-1

    1.1什么是resis Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 1.2Redis 与其他 key - value 缓存产品有以下三个特点 Redis支持 ...

  8. 51nod1229-序列求和V2【数学,拉格朗日插值】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1229 题目大意 给出\(n,k,r\)求 \[\sum_{i=1}^ni ...

  9. CF461D-Appleman and Complicated Task【并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/CF461D 题目大意 \(n*n\)的网格需要填上\(x\)或\(o\),其中有\(k\)个格子已经固定,求有多少中 ...

  10. Git 管理工具 基本用法

    git管理工具基本操作命令: 1. 提交 git push origin dev 2.拉取分支: git pull 3.创建并转换分支: git switch -c dev; 4.直接切换到已有分支: ...