Vim入门笔记

本文最后更新于:2023年1月1日 晚上

Vim入门笔记

啥都不说,献上键位表示

键位简化

将以上复杂的键位入门化

按键 单词表示 作用
w word 向后一个词
b back 向前一个词
a append 在这个字符后写入
A 同上 在本行末开始写入
i insert 在光标位置插入
I 同上 在本行首开始写入
o open 创建下一空行并写入
O 同上 创建上一空行并写入
y yank 复制当前字符
Y 同上 复制当前字符及其行后内容
c change 根据之后的方向删除当前字符并写入
C 同上 删除当前字符及其行后内容并写入
d delete 剪切当前字符
D 同上 剪切当前字符及其行后内容
s substitute 删除当前字符并进入插入模式
s 同上 删除当前行并进入插入模式
x 暂未知 删除光标所在字符
x 暂未知 删除光标所在位置的前一个字符
p paste 将剪切板上的内容粘贴
f find 将光标移至“f”按键之后的字符(向后查找最近)
F 同上 将光标移至“F”按键之后的字符(向前查找最近)
g go 将光标移动到一个位置(动作键)
**常用键位组合:**

dd:删除当前行

gg:跳转到文本首行

G:跳转到文本末尾行

ciw:更改光标所在单词的内容(change in word)

ci”:删除光标所在双引号中的内容并写入

yi”:类比上面的,有复制光标所在双引号中的内容

zz:使视野居中

df*:找到指定字符并从光标处一直删除到那个字符(*为任意字符)

ggvG=:格式化文档(对你没听错)

Ctrl+o:回到上一次更改的位置(可跨文件

Ctrl+i:回到回到后上次更改的位置(可跨文件

gf:直接用vim打开光标所在的这个目录文件

Ctrl+a:若当前字符是数字,这个数字加1

Ctrl+x:若当前字符是数字,这个数字减1

Ctrl+]:如果当前光标位于标识符上,跳转到帮助文档的相应页上

*:正向搜索光标所在标识符

#:反向搜索光标所在标识符

vim指令

在normal模式(普通模式)下,我们可以先输入:然后就可以输入vim的指令了。利用vim指令可以实现更多的操作功能。

保存和退出

最基本的操作,w for writeq for quit

:wq

ps::之后的指令可以连在一起写多个,这里的wq就是‘写入’和‘退出’

!之后是强制执行,如q!就是强制退出

这个我们配置一下后就用S保存,Q退出:

map S :w<CR>
map Q :q<CR>

vim内打开文件

e for edit,eg:

:e ~/program

然后就会出现一个分屏窗口(一个简易的文件管理UI),进行文件的选择,最后选择(按回车)后就会出现这个文件的分屏

vim内执行shell命令

直接上例子(用!来告诉vim之后的指令是shell指令):

:! ls

这样就会使终端回到shell中执行命令并可看得到结果

然后vim会提示你按回车回到vim

扩展

你要是想要用shell执行多个命令然后回到vim,还可以这么操作:

  1. 先按Ctrl+z然后就会退出vim来到shell,同时vim会后台程序中
  2. 我们再输入我们要执行的shell指令
  3. 最后用fg命令回到vim

本人的.vimrc配置

有注释版

"------------------------------
"设置leader映射,空格为leader键
"------------------------------
let mapleader=" "
noremap <LEADER><CR> :nohlsearch<CR>
noremap <LEADER>S :split<CR>
noremap <LEADER>V :vsplit<CR>
" leader加上方向键控制分屏移动
map <LEADER>l <C-w>l
map <LEADER>k <C-w>k
map <LEADER>h <C-w>h
map <LEADER>j <C-w>j
"按两次空格之后跳到下一格<++>然后写入 
map <LEADER><LEADER> <Esc>/<++><CR>:nohlsearch<CR>c4i

"----------------------------
"普通键位映射
"----------------------------
map S :w<CR>
map Q :q<CR>
noremap H 5h
noremap J 5j
noremap K 5k
noremap L 5l
" 方向键控制分屏大小
map <up> :res -5<CR>
map <down> :res +5<CR>
map <left> :vertical resize-5<CR>
map <right> :vertical resize+5<CR>
map th :-tabnext<CR>
map tl :+tabnext<CR>
map tu :tabe<CR>j
" w通过s加v/j来更改分屏布局
map sv <C-w>t<C-w>H
map sj <C-w>t<C-w>K
"切换拼写错误的检验
map <LEADER>sc :set spell!<CR>

"----------------------------
"全局的部分配置
"----------------------------
set enc=utf8
set fencs=utf8,gbk,gb2312,gb1803
set nocompatible		"设置兼容
filetype on		"以下都是相关文件类型配置
filetype indent on
filetype plugin on
filetype plugin indent on
set mouse=a		"你可以在vim中使用鼠标
set encoding=utf-8
let &t_ut=''
set scrolloff=5		"使得时刻可以在开头和末尾有五行显示
set autochdir		"设置当前文件目录下执行命令
" 按leader键和w清除所有的行尾空格
noremap <leader>w :%s/\s\+$//<cr>:let @/=''<CR>
"记住上一次打开的光标位置
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif

"------------------------------
" Vim UI
"------------------------------
set number		"显示行号
set relativenumber		"相对地显示行号
set cursorline		"展示当前行下划线
set wrap		"一行内容超出换行
set wildmenu		"在指令模式下有Tab提示
set showcmd		"显示按下的按键

"-------------------------------------
" text searching/matching
"-------------------------------------
set hlsearch		"搜索(/)高亮
exec "nohlsearch"		"进入文件后删除搜索历史
set incsearch		"实时显示搜索高亮
set ignorecase		"搜索忽略大小写
set smartcase		"开启智能大小写
noremap _ nzz		"下一个搜索匹配
noremap + Nzz		"上一个搜索匹配

"-------------------------------------
" text formatting/layout
"-------------------------------------
set tabstop=4		"tab键宽度
set shiftwidth=4
set softtabstop=4
set expandtab		"实际使用tab字符,不要用空格字符替换
set autoindent		"继承前一行的缩进方式
set tw=0
set indentexpr=
set backspace=indent,eol,start
set foldmethod=indent
set foldlevel=99
set list		"显示行尾是否有空格,用$表示结束
syntax on		"语法高亮

colorscheme slate		"主题设置

ps:leader键就相当于windows中的super键

无注释版

"------------------------------
"设置leader映射,空格为leader键
"------------------------------
let mapleader=" "
noremap <LEADER><CR> :nohlsearch<CR>
noremap <LEADER>S :split<CR>
noremap <LEADER>V :vsplit<CR>
map <LEADER>l <C-w>l
map <LEADER>k <C-w>k
map <LEADER>h <C-w>h
map <LEADER>j <C-w>j
" map <LEADER><LEADER> <Esc>/<++><CR>:nohlsearch<CR>c4i

"----------------------------
"普通键位映射
"----------------------------
map S :w<CR>
map Q :q<CR>
noremap H 5h
noremap J 5j
noremap K 5k
noremap L 5l
map <up> :res -5<CR>
map <down> :res +5<CR>
map <left> :vertical resize-5<CR>
map <right> :vertical resize+5<CR>
map th :-tabnext<CR>
map tl :+tabnext<CR>
map tu :tabe<CR>j
map sv <C-w>t<C-w>H
map sj <C-w>t<C-w>K
map <LEADER>sc :set spell!<CR>
map <C-y> <C-r>
map <C-c> "+y       "设置复制到系统剪切板上

"----------------------------
"全局的部分配置
"----------------------------
set enc=utf8
set fencs=utf8,gbk,gb2312,gb1803
set nocompatible
filetype on
filetype indent on
filetype plugin on
filetype plugin indent on
" set mouse=a       " 设置是否可用鼠标
set encoding=utf-8
let &t_ut=''
set scrolloff=5
set autochdir
noremap <leader>w :%s/\s\+$//<cr>:let @/=''<CR>
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif

"------------------------------
" Vim UI
"------------------------------
set number
set relativenumber
set cursorline
set wrap
set wildmenu
set showcmd

"-------------------------------------
" text searching/matching
"-------------------------------------
set hlsearch
exec "nohlsearch"
set incsearch
set ignorecase
set smartcase
noremap _ nzz
noremap + Nzz

"-------------------------------------
" text formatting/layout
"-------------------------------------
"set paste  " 设置是否自动注释
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set autoindent
set tw=0
set indentexpr=
set backspace=indent,eol,start
set foldmethod=indent
set foldlevel=99
syntax on

" 配色方案
colorscheme monokai
"set background=dark " for the dark version
"set background=light " for the light version


" 设置背景透明度
hi Normal ctermfg=252 ctermbg=none

" =========================================
" 光标设置
" "Mode Settings

"let &t_SI.="\e[5 q" "SI = INSERT mode
"let &t_SR.="\e[4 q" "SR = REPLACE mode
"let &t_EI.="\e[1 q" "EI = NORMAL mode (ELSE)

if has("autocmd")
  au VimEnter,InsertLeave * silent execute '!echo -ne "\e[1 q"' | redraw!
  au InsertEnter,InsertChange *
    \ if v:insertmode == 'i' | 
    \   silent execute '!echo -ne "\e[5 q"' | redraw! |
    \ elseif v:insertmode == 'r' |
    \   silent execute '!echo -ne "\e[3 q"' | redraw! |
    \ endif
  au VimLeave * silent execute '!echo -ne "\e[ q"' | redraw!
endif

"Cursor settings:

"  1 -> blinking block
"  2 -> solid block
"  3 -> blinking underscore
"  4 -> solid underscore
"  5 -> blinking vertical bar
"  6 -> solid vertical bar
"=============================================

可视模式(Visual)

可视模式又可以理解为“块模式”

普通可视模式

相当于是鼠标按住拖动的操作(选中)

进入模式方式:按v(小写)

在这种模式中普通的动作(motion)也是生效的,eg:d剪切选中内容、y复制选中内容

可视行模式

顾名思义,一行行选中(效率很高,很快啊🐱‍🏍)

进入模式方式:按V(大写)

可视模式下的命令

其实上两种模式都可以进入指令模式,这里单独拎出来只因为这个太强了。

进入方式:在前两种状态下,按:,然后写入命令

使用:eg:

:'<,'>normal Isomething-I-write
**输入`normal `然后这之后的内容就会转化为我们在普通模式下的指令,你输入的啥,vim就会执行啥。**

ps:'<,'>是我们按下冒号之后自动生成的,之后的内容才是我们想写入的

可视块模式

这个模式是最强的。块,其实就是矩形。vim在这个模式下允许你进行矩形区域的选中,这是非常快捷方便的(操作中就能感受到)

进入模式方式:按下Ctrl+v

更高级的玩法:

在可视块模式下并有选中的情况下,按下任意能进入写入模式的按键(如c),然后写入并退出到普通模式,然后这些行会全部被写入。

分屏

基本使用

  • :指令模式,然后就是split
  • 如果是按vsplit就是左右分屏

分屏切换的主要按键就是Ctrl+w,然后按方向键(hjkl),或者再按一个w就可以转到下一个分屏

但是这显然就太麻烦了,我们可以去配置一下按键映射:

map <LEADER>l <C-w>l
map <LEADER>k <C-w>k
map <LEADER>h <C-w>h
map <LEADER>j <C-w>j

上下分屏和左右分屏的切换

直接上配置

map sv <C-w>t<C-w>H
map sj <C-w>t<C-w>K

然后按s+v就可以改左右分屏了,同时s+j可以改上下分屏。

打开文件

当你在搞一个项目时,肯定是想要多个文件在分屏中展示,然后分别编辑的,这时候就要用edit指令了

e指令:(也可以敲edit

:e ~/myprogram/

于是它就打开了myprogram这个文件夹,并关闭当前窗口,然后你就可以在这个简易的UI中选中你想要打开的文件。

更改分屏大小

使用resize指令

eg:

:resize-5
:vertical resize-5

第一条指令是让上下分屏减小5个单位(具体是什么单位不知道),第二条就是左右分屏了。(reszie可简写为res)

当然,这样做也是贼麻烦,我们还是映射一波:

map <up> :res -5<CR>
map <down> :res +5<CR>
map <left> :vertical resize-5<CR>
map <right> :vertical resize+5<CR>

使用标签页

这个玩意应该熟悉,就是编辑器上面的标签选项

创建新的标签

:tabe [标签名]

输入这条指令之后vim就会创建一个新的标签页并覆盖掉原有的标签页(然后你就会看到第一行上出现了一个简易的标签页展示UI)

还是照例配置一下,免得得输入指令:

map tu :tabe<CR>

移动标签

:-tabnext
:+tabnext

第一条指令是移到左边标签,相应的+就是移到右边。

配置:

map th :-tabnext<CR>
map tl :+tabnext<CR>

vim-plug

vim-plug是一个插件管理器,能够下载并管理vim上的插件。当然有人说还有Vundle.vim,好吧,但是这东西我觉得坑太多。

简单安装

咱们看到官方文档中怎么说:

  • Unix
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  • Windows(PowerShell)
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
    ni $HOME/vimfiles/autoload/plug.vim -Force

然后不出所料你会收到以下 报错信息:

Failed to connect to raw.githubusercontent.com port 443: Connection refused

可以尝试以下解决方法:

第一种:

用RO我搭建好的文件链接再运行:

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    http://39.98.122.169:3000/plug.vim

第二种:

  1. 打开hosts
vim /etc/hosts
  1. 在hosts里面添加下列内容
199.232.28.133 raw.githubusercontent.com

简单使用

在 vim 配置文件 ~/.vimrc 或 Neovim 配置文件 ~/.config/nvim/init.vim 中增加 vim-plug 配置项(就是我之前展示的配置文件)

  • 开始部分call plug#begin(),括号里面写入的是vim的插件安装到哪里,因为我们安装的vim-plug是在.vim中,而.vim中有一个plugged文件夹就是专门存放vim插件的。
  • 结束部分call plug#end()
  • 中间列出要安装的插件,都要以Plug开头

结果就是这样的:

call plug#begin('~/.vim/plugged')

Plug 'vim-airline/vim-airline'
Plug 'connorholyday/vim-snazzy'

call plug#end()

然后重新打开.vimrc,输入命令:PlugInstall,就会自动加载安装插件(很快啊🐱‍🏍)

相关命令

命令 描述
PlugInstall [name ...] [#threads] 安装插件
PlugUpdate [name ...] [#threads] 安装或更新插件
PlugClean[!] 清除不常用目录
PlugUpgrade 更新 vim-plug 自身
PlugStatus 检查插件状态
PlugDiff 检查上次更新和挂起更新的修改
PlugSnapshot[!] [output path] 生成插件快照

每个指令都要加:就不用说了吧

插件按需加载

" NERD tree 在 NERDTreeToggle 第一调用时加载
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }

" 多命令
Plug 'junegunn/vim-github-dashboard', { 'on': ['GHDashboard', 'GHActivity'] }

" 当 clojure 文件打开时加载
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }

" 多文件类型
Plug 'kovisoft/paredit', { 'for': ['clojure', 'scheme'] }

" 两种情况下都可以按需加载
Plug 'junegunn/vader.vim',  { 'on': 'Vader', 'for': 'vader' }

" 插件按需加载时执行代码
Plug 'junegunn/goyo.vim', { 'for': 'markdown' }
autocmd! User goyo.vim echom 'Goyo is now loaded!'

for 选项通常是不需要的,因为大多数特定文件类型的插件通常代码不是很多

推荐的插件

NERDTree

可以在分屏中显示文件管理(有简易UI),在打开多个文件的情况下是非常有用的。

安装方式:

Plug 'preservim/nerdtree'

添加的配置:

" 设置NerdTree
map <F3> :NERDTreeMirror<CR>
map <F3> :NERDTreeToggle<CR>

airline

安装方式:

Plug 'vim-airline/vim-airline'

可以在vim下方显示状态栏的插件

vim-snazzy

单纯为了美化,设置一个新的主题snazzy

安装方式:

Plug 'connorholyday/vim-snazzy'

这时就可以将之前的slate主题换成snazzy了,还可以设置背景透明(可能因为终端不同而无法显示:

"snazzy主题的配置项
let g:SnazzyTransparent = 1

vim-rainbow

可以将多级的大括号进行颜色区分

安装方式:

Plug 'frazrepo/vim-rainbow'

添加的配置:

"rainbow的配置项
let g:rainbow_active = 1

auto-pairs

顾名思义,就是在你写了或删了一个括号时自动同步另一个括号。

安装方式:

Plug 'jiangmiao/auto-pairs'

添加的配置:

"auto-pairs的配置项
au Filetype FILETYPE let b:AutoPairs = {"(": ")"}
au FileType php      let b:AutoPairs = AutoPairsDefine({'<?' : '?>', '<?php': '?>'})

NerdCommenter

所有程序员编写的代码都会产生难以调试的问题,导致他们决定注释掉或撤消代码,NERD Commenter的用处就来了,选择代码,点击Leader+cc,你的代码就会被注释掉;点击Leader+cn,你的代码将被取消注释。对于大多数文件类型,NERD Commenter都能使用正确的注释字符。

安装方式:

Plug 'preservim/nerdcommenter'

tagbar

在右边显示函数列表

安装方式:

Plug 'preservim/tagbar'

添加配置:

nmap <F8> :TagbarToggle<CR>

然后你就可以直接按F8来显示函数列表了。

MarkdownPreview

还是顾名思义,是可以在vim正在编辑的情况下实时查看md文档(在web浏览器中)的插件

安装方式:

Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug']}

命令:

MarkdownPreview
" 在打开 markdown 文件后,使用该命令可以打开预览窗口

MarkdownPreviewStop
" 关闭 markdown 预览窗口,并停止开启的服务进程

添加配置:

let g:mkdp_browser = 'chromium'
autocmd Filetype markdown noremap ,v :MarkdownPreview<CR>
autocmd Filetype markdown noremap ,vs :MarkdownPreviewStop<CR>
  • 上面的第一句是将预览的默认浏览器设置为 chromium (可选,如果不指定则使用系统的默认浏览器打开)
  • 后两句开始的 autocmd Filetype markdown 声明只有在文件类型为 markdown 时这两个快捷键才会生效
  • 第二句是将 :MarkdownPreview 命令绑定到 ,v 组合键上
  • 第三句是将 :MarkdownPreviewStop 绑定到 ,vs 组合键上

继续配置相应常用样式快捷键

autocmd Filetype markdown noremap ,b i****<Esc>hi
autocmd Filetype markdown noremap ,i i**<Esc>i

leaderF

LeaderF是一个用Python写的vim插件,可以在成千上万数十万个文件中,通过模糊查找的方式,快速找到目标文件。

安装:

Plug 'Yggdroot/LeaderF', { 'do': ':LeaderfInstallCExtension' }

常用指令:

指令 功能
:LeaderfFile 搜索当前目录下的文件
:LeaderfMru 搜索最近使用过的文件( most recently used files)
:LeaderfLine 搜索当前文件中有的某个单词
:LeaderfFunction 搜索当前文件的函数
:LeaderfBuffer 搜索当前的Buffer

coc.nvim

作为IDE,必不可少的就是代码智能补全,coc.nvim就是坑比较少的一种智能补全插件。

安装(得先安装nodejs):

curl -sL install-node.now.sh/lts | bash
Plug 'neoclide/coc.nvim', {'branch': 'release'}

添加配置:

coc.nvim只是一个平台,它能够允许你安装各种语言插件,达到不同语言的补全效果。因此我们只有安装了对应的语言插件才能实现补全。以C/C++为例:

通过在vim内的命令模式输入:CocConfig来配置coc.nvim的配置文件coc-settings.json

{"languageserver": {    "clangd": {      "command": "clangd",      "rootPatterns": ["compile_flags.txt", "compile_commands.json"],      "filetypes": ["c", "cc", "cpp", "c++", "objc", "objcpp"]    }  }}

Ps: 这种配置模式下,coc主要是依赖clangd进行代码自动化补全,所以需要事先安装好clangd。

对更多其他语言的支持可以参考: https://github.com/neoclide/coc.nvim/wiki/Language-servers#supported-features

当然你要是不想要这么麻烦,coc.nvim本身作为一个平台,其自身就包含各种扩展,可通过各种指令来安装高阶的扩展插件。(之前的C补全就可以用扩展插件实现)

命令 命令名
安装命令 :CocInstall 插件名
移除命令 :CocUninstall 插件名
查看已安装 :CocList extensions
更新命令 :CocUpdate

coc的扩展插件可参考: https://github.com/neoclide/coc.nvim

杂谈

figlet

当我们想要生成大号字符的ascii图形时,可以用figlet帮助我们快速生成。(因为是用C编译的,得装gcc编译器)

安装

wget ftp://ftp.figlet.org/pub/figlet/program/unix/figlet-2.2.5.tar.gz
x figlet-2.2.5.tar.gz
cd figlet-2.2.5
make && make install

使用

figlet vim

结果

       _
__   _(_)_ __ ___
\ \ / / | '_ ` _ \
 \ V /| | | | | | |
  \_/ |_|_| |_| |_|

自定义字体

figlet -f smslant vim

结果

       _
 _  __(_)_ _
| |/ / /  ' \
|___/_/_/_/_/

文件类型转换

我们可以利用vim来将当前文件来转化为html或者是pdf

转html:

:%TOhtml

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!