分类 Vim 下的文章

编写 vim 配置,我的 vim 我做主

本教程基于慕课网视频教程 玩转 Vim 从放弃到爱不释手 进行记录的第二篇插件篇。
第一篇链接:初始 VIM 篇

什么是Vim配置

什么是Vim的配置,为什么要使用它?

Vim里非常多常用的设置,比如 :set number 设置行号
Vim里临时设置,没法持久化,每次设置很烦
Vim提供了一种持久化配置的方式,让我们自定义配置

如何编写Vim配置文件

如何编写自己的Vim配置文件呢?
Linux/Unix下新建一个隐藏文件 .vimrc
或使用Vim直接打开 vim ~/.vimrc 进行编写然后保存。
这里的 ~/.vimrc 文件表示用户个人的配置,只对当前用户生效。
另外,Vim 的全局配置一般在 /etc/vim/vimrc 或者 /etc/vimrc,对所有用户生效。

接着我们就可以开始自定义自己的配置了

Vim配置都包含什么
编辑Vim配置文件,都可以设置什么
常用设置,比如:set nu 设置行号 :colorscheme hybrid 设置主题
常用的vim映射,vim中的映射比较复杂,源于vim有多种模式
自定义的vimscript函数和插件的配置

常用设置

我们可以把常用到的设置写到.vimrc里避免每次打开vim重新设置。

比如上面的:set nu :colorscheme hybrid 等,Vim里有非常多的这种配置,可以自己加入一些常见的设置选项看看效果.

不熟悉的情况下也可以做拿来主义,多去参考一下別人的配置看看那些对自己有用(不建议直接整个配置文件的复制拿来用,刚起步有些东西还搞不懂,而且遇到报错也解决不下,只会更糟心)。
这里推荐一篇 Vim配置入门,介绍了配置基础知识和部分基础配置。

Vim映射

什么是Vim映射?
Vim映射就是把[一个操作]映射到[另一个操作

如果你不满意现在的按键设置,比如vim本来的命令
或者你想映射一些方便的快捷键
按照你的意愿定制Vim。[当按下某些按键时,放弃你默认的操作,按照我的想法去做]

Vim中的映射比较复杂,源于 vim 有多种模式

设置一下 leaderlet mapleader="," 常用的是逗号或空格

比如用 inoremap <leader>w <Esc>:w<cr> 在插入模式保存

Vim中的映射概念稍微复杂,但是非常强大。

Vim 映射迷人眼

模式映射

Vim 常用模式 normal / visual / insert 都可以定义映射
nmap / vmap / imap定义映射只在normal / visual / insert分别有效

基本映射

基本映射指的是normal模式下的映射

使用 map 就可以实现映射。

比如 :map - x 然后按 - 就会删除字符
:map <space> viw 告诉 vim 按下 空格 的时候选中整个单词
:map <c-d> dd 可以使用 ctrl+d执行 dd删除一行

visual模式映射

:vmap \ U把在 visual 模式下选中的文本大小(u / U转换大小写)

insert模式映射

:imap <c-d> <Esc>ddi 在 insert 模式下删除一行后继续编辑模式

现有映射的问题?

定义了如下映射

:nmap - dd
:nmap \ -

当你按下 \ 时,Vim会解释其为 -。我们又映射了 -!Vim会继续解
-dd,即宅会删除整行。(是不是有点类似于递归)

递归与非递归映射

*map系列命令有递归的风险
如果你安装了一个插件,插件映射了同一个按键的不同行为,有冲突就会有一个失效
想要保证插件映射没有冲突会非常痛苦
解决方案就是使用非递归映射

非递归映射

Vim提供了非递归映射,这些命令不会递归解释

使用 *map 对应的 nnoremap / vnoremap / inoremap

何时使用递归映射(*map)?何时使用非递归映射呢?(*nnoremap

任何时候都应该使用非递归映射,拯救自己和插件作者

Vim 安装插件,竟如此简单

什么是插件?

和其他现代流行编辑器一样,Vim 同样支持强大的插件扩展

Vim 插件是使用 vimscript 或者其他语言编写的 vim 功能扩展
编辑器自带的功能有限,有了插件之后几乎可以无限制扩充其功能

如何安装插件?

原始的方式是直接clone 插件代码,如今 vim 有很多插件管理器

目前 Vim 有很多插件管理器可供选择,你可以选择一个顺手的

常见的有 vim-plug, Vundle, Pathogen, Dein.Vim, volt

综合性能、易用性、文档等几个方面,这里推荐使用 vim-plug

使用vim-plug安装插件

我们将使用 vim-plug 安装我们的第一个插件

https://github.com/junegunn/vim-plug

学习一个新东西的最好方式就是看官方的文档示例
按照官方的教程,我们就可以非常容易地了解它的使用方式

Unix下安装:

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

vim ~/.vimrc 文件末尾加入以下亮行配置来启用 vim-plug

call plug#begin()

call plug#end()

安装你的第一个插件

我们将安装 vim-startify,一个好用的 vim 开屏插件

https://github.com/mhinz/vim-startify

修改你的.vimrc 文件,增加该插件名称

call plug#begin()

Plug 'mhinz/vim-startify'

call plug#end()

重新启动 vim 或者 :source ~/.vimrc,执行 :PlugInstall

使用 :q 退出安装界面(:qa 退出所有窗口),重启 Vim 你见过会神奇地发现插件生效了!

如何寻找自己需要的插件

如何搜寻插件

现有需求,后有插件。大部分插件托管在了 github 上,

寻找插件途径:

1.通过 google 搜索关键词寻找想要的插件

例如:

搜索文件管理相关的:vim file manager plugin

搜索编写 Python 的插件:vim python plugin github

2.vim 插件库:https://vimawesome.com/

3.浏览网上开源的vim配置借鉴想要的插件

vim美化插件,让你的 vim 与众不同

vim 美化插件

更改 vim 的外观

修改启动界面:https://github.com/mhinz/vim-startify

状态栏美化:https://github.com/vim-airline/vim-airline

增加代码缩进线条:https://github.com/yggdroot/indentline

主题美化:https://github.com/dracula/vim

注意:dracula主题启用要放在插件结束之后

call plug#begin()

" vim 开屏插件
Plug 'mhinz/vim-startify'

" 状态栏美化插件
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

" 代码缩进线条
Plug 'yggdroot/indentline'

" 主题
Plug 'dracula/vim'

call plug#end()

" 主题启用要放在插件结束之后
" 设置主题
colorscheme dracula

Vim文件目录和搜索插件,跳转文件so easy

文件管理器nerdtree

使用nerdtree插件进行文件目录树管理

https://github.com/scrooloose/nerdtree

安装

call plug#begin()
......
" nerdtree
Plug 'preservim/nerdtree'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件配置

" nerdtree
" 查找文件位置
nmnnoremap <leader>v :NERDTreeFind<cr>
" 打开关闭目录树
nnoremap <leader>g :NERDTreeToggle<cr>
" 显示隐藏文件
let NERDTreeShowHidden=1
" 隐藏文件
let NERDTreeIgnore = [
            \ '\.git$', '\.hg$', '\.svn$', '\.stversions$', '\.pyc$', '\.pyo$', '\.svn$', '\.swp$',
            \ '\.DS_Store$', '\.sass-cache$', '__pycache__$', '\.egg-info$', '\.ropeproject$',
            \ ]

快捷键:

,g 可以快速打开关闭目录树

,v 光标快速移回目录树,定位到光标在移之前的文件名上,<ctrl>+w+p 可以快速跳转过去打开的文件上

快速搜索文件-模糊搜索器

如果想快速根据文件名查找打开一个文件呢?
如果想快速查找并且打开一个文件可以用 ctrlp 插件

https://github.com/ctrlpvim/ctrlp.vim

安装

call plug#begin()
......
"ctrlp
Plug 'ctrlpvim/ctrlp.vim'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件配置

"ctrlp
let g:ctrlp_map = '<c-p>'

更改默认映射调用 CtrlP 进行搜索:<ctrl>+p

Vim快速定位插件,文件位置任我行

Vim移动命令

在基础篇讲了很多 vim 中移动的命令

比如w / e基于单词移动,gg / G文件首尾,0 / 行首尾,f{char}查寻字符

ctrl+f ctrl+u 前后翻屏

那假如我想快速跳到当前窗口显示区的任意位置呢?

如何移动到任意位置

可以使用vim的搜索/加上n跳转,但是使用easymotion更方便

https://github.com/easymotion/vim-easymotion

安装

call plug#begin()
......
" easymotion
Plug 'easymotion/vim-easymotion'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件配置

官方文档比较长,其实一个映射就能应付

" easymotion
nmap ss <Plug>(easymotion-s2)

使用 ss 调用搜索就可以在整个文件可视区域快速跳转到任意位置。

Vim-surround,编辑也要成双成对

vim-surround

如果快速让你更换一对单引号为双引号,你会怎么做?

一个一个查找然后替换,是不是比较低效?

https://github.com/tpope/vim-surround

安装

call plug#begin()
......
" 快速更换成对的字符
Plug 'tpope/vim-surround'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件使用

normal 模式下增加,删除,修改成对内容

ds (delete a surrounding)
cs(change a surrounding)
ys (you add a surrounding)

给单词加引号,光标移动到要加入的单词上,可以依次按ys iw "

Hello  # ys iw "
"Hello"

给单词的双引号改单引号,光标移动到要加入的单词上,可以依次按cs " '

"Hello"  # cs " '
'Hello'

给单词的括号,光标移动到要加入的单词上,可以依次按cs ( ]这里要更改的括号使用后面的反括号可以避免出现空格

("Hello") # cs ( ]
["Hello"]

删除成对的内容用 ds,删除 " 可以用 ds "

["Hello"] # ds "
[Hello] #ds [
Hello

强大的Vim模糊搜索与替换插件

模糊搜索

我们经常需要在一个代码项目中模糊搜索一些文本,怎么办呢?

Vim 自带的搜索/可以搜索当前文件,但是项目有很多个文件

需要一个插件来模糊搜索多个文件内容

使用 Ag.vim 或者 fzf.vim 都可以很好地支持模糊搜索

fzf与fzf.vim

fzf是一个强大的命令行模糊搜索工具,fzf.vim集成到了 vim 里

https://github.com/junegunn/fzf.vim

fzf.vim 依赖于主 fzf 资源库的基本 Vim 插件,这意味着你需要在 Vim 上同时设置 "fzf""fzf.vim"

安装fzf

fzfgithub:https://github.com/junegunn/fzf

使用 git 安装:

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

安装fzf.vim

call plug#begin()
......
" 模糊搜索工具
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件使用

使用 Ag [PATTERN] 模糊搜索字符串(也可以替代ctrlp 插件)
使用 Files [PATH] 模糊搜索目录

搜索替换插件far.vim

如果想要批量搜索替换,可以试试 far.vim

https://github.com/brooth/far.vim

安装

call plug#begin()
......
" 搜索替换插件
Plug 'brooth/far.vim'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件使用

# 把 foo 替换成 bar,指定文件夹和目录 **/*.py
:Far foo bar **/*.py
# 确认替换
:Fardo
# 退出预览窗口
:q

Vim tagbar,更愉快地浏览代码

tagbar

代码大纲,Vim 当然也有,而且支持非常多编程语言

https://github.com/majutsushi/tagbar

需要安装 Universal Ctags 生成对应的 tag 文件

依赖

文档:https://docs.ctags.io/en/latest/

github:https://github.com/universal-ctags/ctags

安装

Building with configure (*nix including GNU/Linux)

$ git clone https://github.com/universal-ctags/ctags.git
$ cd ctags
$ ./autogen.sh
$ ./configure --prefix=/where/you/want # defaults to /usr/local
$ make
$ make install # may require extra privileges depending on where to install

Building on Mac OS

Building with Homebrew

brew tap universal-ctags/universal-ctags
brew install --HEAD universal-ctags

安装tagbar

call plug#begin()
......
Plug 'preservim/tagbar'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件使用

" tagbar
nnoremap <leader>t :TagbarToggle<CR>

使用快捷键 ,t 进行打开

vim-interestingwords

高亮你感兴趣的单词,浏览代码很有用

https://github.com/lfv89/vim-interestingwords

浏览代码的时候经常需要知道一个变量的使用方式

我们可以使用这个插件同事高亮多个单词

安装tagbar

call plug#begin()
......
" 单词高亮
Plug 'lfv89/vim-interestingwords'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件使用

光标移动到要高亮的词上,用 ,k 高亮显示 (小写k)
用 n 和 N 导航高亮显示的单词
使用 ,K 清除整个缓冲区中的所有高亮字词(大写K)

Vim快速注释代码

vim-commentary

vim 注释插件有很多,这里使用这个比较轻量

https://github.com/tpope/vim-commentary

记住常用的命令 gc 注释和取消注释

插件会根据不同的文件类型使用不同注释,python(#) golang(//)

安装vim-commentary

call plug#begin()
......
" 快速注释代码
Plug 'tpope/vim-commentary'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件使用

光标移动到要注释的行或者词上,按快捷键 gc 进行注释,有注释的按会解注释

强大的 vim 代码补全插件

deoplete.nvim

一个强大的 neovim/vim8 异步补全插件

https://github.com/shougo/deoplete.nvim

多编程语言的支持,支持模糊匹配

需要安装对应编程语言的扩展

安装deoplete

call plug#begin()
......
" 代码补全
if has('nvim')
  Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
  Plug 'Shougo/deoplete.nvim'
  Plug 'roxma/nvim-yarp'
  Plug 'roxma/vim-hug-neovim-rpc'
endif

call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

插件配置

" deoplete
let g:deoplete#enable_at_startup = 1
set completeopt-=preview

coc.vim

一个强大的 neovim/vim8 补全插件。LSP 支持

https://github.com/neoclide/coc.nvim

full Language Server Protocol support as VSCode

多语言插件支持

Vim代码格式化与静态检查

格式化与静态检查

为什么需要这些工具呢?能让工具做的就不用让人去费心

把精力集中代码逻辑本身,而不是整理格式这些浪费精力的事情上

静态检查是为了让编写的代码更加规范。golint/pylint/eslint等

无论你编写何种编程语言,最好都加上自动格式化和静态检查

Neoformat

vim-autoformat 和 Neoformat 是两种使用较多的格式化插件

https://github.com/sbdchd/neoformat

需要安装对应语言的格式化库。python autopep8/js的prettier等

安装Neoformat

call plug#begin()
......
Plug 'sbdchd/neoformat'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

需要安装对应语言的格式化库,如:autopep8

pip install autopep8

插件使用

输入命令 :Neoformat 后回车

静态检查Lint

neomake 和 ale 是两种常用的int 插件,这里我们选用 ale

https://github.com/wOrp/ale

同样需要安装对应语言的 lint 库。比如eslint/pylint/golint等

vim8/neovim 支持异步检查,不会影响 vim 编辑,推荐使用

安装ale

call plug#begin()
......
Plug 'wOrp/ale'
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

需要安装对应语言的格式化库,如:pylint

pip install pylint

vim和git,强强联手

Fugitive

在Vim 里使用 Git

https://github.com/tpope/vim-fugitive

Gedit, Gdiff, Gblame, Gcommit 等

vim-gitgutter

在vim 里显示文件变动

https://github.com/airblade/vim-gitgutter

当我们修改文件之后可以显示当前文件的变动

哪些行新增,哪些行修改了,哪些行删除了

gv.vim

如何在命令行查看提交记录呢?有个命令行工具叫做 tig

https://github.com/junegunn/gv.vim

使用:GV 命令调用

可以浏览代码提交变更

愉快写 golang 之vim-go插件

功能强大的 golang 插件 vim-go

https://github.com/fatih/vim-go

代码补全,重构,跳转,自动格式化,自动导入等功能

安装vim-go

call plug#begin()
......
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

python-mode把 vim 打造成轻量 Python IDE

Python 插件使用比较多的是 jedi-vim 和 python-mode

https:/github.com/python-mode/python-mode

python-mode同样具备基本的补全、跳转、重构、格式化功能

即使是在服务器上也能愉快调试 python 代码了

安装python-mode

call plug#begin()
......
Plug 'python-mode/python-mode', { 'for': 'python', 'branch': 'develop' }
call plug#end()

重新加载一下:source ~/.vimrc,然后安装 :PlugInstall

Vim和Tmux,天作之合

强大的终端复用工具。通过 brew(mac) apt-get(ubuntu)安装

可以复用终端、分屏、托管进程等

在服务器上即使退出服务器也不会被kill,托管进程也很方便

可以方便地分割屏幕实现多个进程公用屏幕

5-4 站在巨人的肩膀上,使用强大的开源配置

开箱即用

如果你已经熟悉了 vim 配置,可以从网上直接使用一些开源配置

https://github.com/SpaceVim/SpaceVim

https://github.com/PegasusWang

其他开源配置。不推荐新手直接使用,越复杂的配置上手成本越高

前言

在此之前。我对vim的认知使用情况也就是停留在使用 vim filename 打开文件,然后按 i 进入插入模式,使用 ESC 又可以回到 normal 模式,之后 :wq 保存退出。

因为大部分时间都是 win 使用的居多,要打开也就是 vs code 啥的,这种上古神器一般也就服务器上改动点啥玩意时进去用一下。一次看一个分享了一些 vim 小技巧的视频后改变了对 vim 的认知又激起了我的兴趣了(卧槽,还能这么玩)后了解到在慕课网还出了个系列教程视频就去围观学习了一遍,所以就有了本文章来记录一下一些命令,以备自己有所需时可以快速查看一下。

常用命令虽然就那些,但一些技巧快捷键使用起来也挺舒服的,各种加起来就多了。要学会使用vim就非一日之功了,得靠肌肉记忆,因为它那众多的快捷命令只有使用多了才能形成肌肉记忆。

注:相比教程,这只是一个笔记,无 vim 基础的可以退出去了或者可以去找相关的教程社区或者视频进行学习。

本教程基础慕课网视频教程 玩转 Vim 从放弃到爱不释手 进行记录,感兴趣可以自行去学习。

vim的几种模式

Vim 最常用的有四个模式,分别是:normal(普通)模式,insert(插入)模式,Command(命令)模式,Visual(可视)模式

normal(普通)模式:

进入 vim 后默认的是 normal(普通)模式。
使用 <ESC> 从插入模式回到普通模式,普通模式下可以进行各种命令操作和移动

insert(插入)模式

在插入模式中,可以按 ESC 键回到普通模式。
插入命令如下:
使用小写 a(append)当前字符后面插入
使用小写 i (insert)当前字符前面插入
使用小写 o(open a line below)当前行的下面一行插入
使用大写 A(append after line)当前行的最后面插入
使用大写 I (insert before line)当前行的最前面的插入
使用大写 O(append a line above)当前行的上面一行插入

Command(命令)模式

Command 模式下输入 : 之后执行命令,比如保存退出 :wq 一气呵成
顾名思义,执行 Vim 命令,比如保存 :w,退出 :q
比如分屏 :vs (vertical split), :sp(split)
比如使用 :% s/foo/bar/g 全局替换

Visual(可视)模式

Visual 模式一般用来块状选择文本
Normal 模式下使用小 v 进入 visual 选择
使用大 V 选择行
使用 ctrl+v 进行方块选择

vim插入小技巧

快速纠错
Ctrl + h删除上一个字符
Ctrl + w删除上一个单词
Ctrl + u删除当前行
以上几个快捷键可以用在很多地方,比如终端

快速切换insert和normal模式
使用Ctrl + c代替Esc(但可能中断某些插件)或者Ctrl + [

gi 快速跳转到你最后一次编辑的地方并且进入插入模式

vim 1.txt 2.txt -o 一次性在两个窗口里打开这两个文件

快速移动大法

vim normal 模式下使用反人类的 h j k i 来移动光标。

在单词间[飞舞]

单词之间移动是游览操作中最常使用的命令

w / W 移到下一个 word/WORD 开头。

e / E 下一个word/WORD尾

b / B 回到上一个word/WORD 开头,可以理解为backword

注:word指的是以非空白符分割的单词 WORD以空白符分割的单词

行间搜索移动

同一行快速移动的方式其实是搜索一个字符并且移动到该字符

使用f{char}可以移动到 char 字符上,t移动到char 的前一个字符

如果第一次没搜到,可以用分号(;) / 逗号(,)继续搜该行下一个/上一个

大写的F 表示反过来搜前面的字符

Vim 水平移动

如何快速移动到一行的行首或者行尾呢?

0 移动到行首第一个字符,^移动到第一个非空白字符

$移动到行尾,g_移动到行尾非空白字符

记住常用的0就可以满足日常需求了

vim垂直移动

我们还可以在句子和段落之间移动(了解知道有就行,不常用,而且中文和英文下区分句子和段落不一样)

使用括号 ( ) 在句子间移动
使用花括号 { } 在段落之间移动

具体使用也可以用 :help( 来查看帮助
插件章节会讲如何用easy-motion插件移动,这些命令就都不用记忆啦

Vim 页面移动

翻页命令太多,2/8定律,记住常见的就能满足需求

gg / G 移动到文件开头和结尾,你可以使用 ctrl+o快速返回

H / M / L儿跳转到屏幕的开头(Head),中间(Middle)和结尾(Lower)

Ctrl+u. ctrl+f. 上下翻页.(upword/forward)。zz 把屏幕置为中间

注:以上命令都是在 normal 模式下使用

vim快速增删改查

Vim增加字符

增加字符就是进入插入模式

进入插入模式编辑文本,使用 a / i / o 进入插入模式

插入命令如下:
使用小写a(append)当前字符后面插入
使用小写i(insert)当前字符前面插入
使用小写o(open a line below)当前行的下面一行插入
使用大写A(append after line)当前行的最后面插入
使用大写I(insert before line)当前行的最前面的插入
使用大写O(append a line above)当前行的上面一行插入

vim快速删除

如何快速删除一个字符或者单词呢?

vim在normal模式下使用 x 快速删除一个字符
使用d(delete)配合文本对象快速删除一个单词daw(d around word)

dx 都可以搭配数字来执行多次,比如:

v/V选中光标里的内容,按小v后进入单字符选择模式,按hl即可左右选择配合x来删除,大V后进入单行选模式,按kj即可上下选择配合d来进行整块删除。

dw(删除一个单词及周围字符)

daw(删除一个单词及周围字符)

diw(删除一个单词保留后边字符)

dd(删除一行)

数字 + 命令表示多次执行命令

2dd(删除两行)

4x(删除四个字符)

d0 (一行里快速删除光标前面的内容)

d$(一行里快速删除光标后面的内容)

dt{character}(当光标在座括号里时,使用该命令删除到又括号里的内容)比如要删除(一个括号里的内容)就dt)

拓展:

u(恢复到之前的状态)

ctrl+R(回到上一次修改的状态)

vim快速修改

相比删除,更常用修改,一般是删除之后改成我们期望的文本

常用的三个 r (replace),c(change),s(substitute)

normal 模式下使用「可以替换一个字符。s 替换并进入插入模式

使用 c 配合文本对象,我们可以快谏讲行修改

normal 模式下使用r可以替换一个字,(比如 xiaomo,光标停留在最后的 o 上面按ri就会变成 xiaomi)

R的作用就是不间断的替换光标之后的内容

s就是删除当前字符并且进入插入模式,也可以配合数字进行使用比如4s

S的作用就是删除一整行并且进入插入模式

使用c配合文本对象,我们可以快速进行修改
ac(修改光标下的字符为c)
caw(删除当前单词并且进入插入模式)
cw当光标在一个单词里时按下可以快速删除并且进如插入模式

cc的作用也是删除一整行并且进入插入模式

C大写 C 删除掉整行然后进入插入模式

ct{character}此命令和上面的删除命令用法一样ct((当光标在座括号里时,使用该命令删除到右括号前面的内容),然后进入插入模式

vim查询

查询单词也是一个常用操作

使用 / 或者进行前向或者反向搜索 (用法; /字符)

使用 n/N 跳转到下一个或者上一个匹配

使用 *或者#进行当前单词的前向或者后向匹配

Vim 如何搜索替换

substitute命令允许我们查找并且替换掉文本,并且支持正则式

vim替换命令 :[range]s[ubstitiute]/{pattern}/{string}/[flags]

range表示范围 比如;10,20 表示10-20行,%表示全部

pattern是要替换的文本,string是替换后文本

flags表示替换标志性,flags有几个常用的标志:g c n

替换标志位,Flags几个常用的标志的意思

g(global) 表示全局范围内执行
c(confirm)表示确认,可以确认或者拒绝修改
n(number)报告匹配到的次数而不替换,可以用来查询匹配次数

例如:

把文件里所有的 is 单词替换成 this

:% s/is/this/g

把文件里第1 行到第 6 行里的 is 单词替换成 this

:1,6 s/is/this/g

统计当前文本里某个单词出现的次数

# 替换后字符可以留空,只是查询,不是真替换,留空没影响
:1,6 s/is//n

6 matches on 6 lines # 表示有 6 行 6 个匹配

:% s/is//n

只精准替换 is单词,而不是包含带有 is 的单词,可以使用正则

:% s/\<is\>/this/g

Vim多文件操作

Vim多文件操作

在vim里它有几个概念Buffer Window Tab
Buffer是指打开的一个文件的内存缓存冲区
Window窗口是Buffer可视化的分割区域
Tab可以组织窗口为一个工作区

Buffer - 什么是缓冲区?

vim打开一个文件后会加载内容到缓冲区

之后的修改都是针对内存中的缓冲区,并不会直接保存到文件

直到我们执行:w的时候才会把修改内容写入到文件里

Buffer之间的切换:
使用:ls会列举当前缓冲区,当打开多个文件时,然后用:b n 跳转到第n个缓存区

:bpre :bnext :bfirst `:blast

或者使用:b buffer_name` 加上tab补全来跳转

Windows 窗口

一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同的缓冲区

s水平分割 v垂直分割或者:sp:vs

每个窗口可以据徐被无限分割(就看你屏幕是否够大了)

如何切换窗口:

切换窗口的命令都是使用Ctrl+w作为前缀

<C-w>w在窗口间循环切换

<C-w>h切换到左边的窗口

<C-w>j切换到下边的窗口

<C-w>k切换到上边的窗口

<C-w>l切换到右边的窗口

L当光标在左边时,把左边的窗口的内容移动到右边的窗口

H把右边的窗口的内容移动到左边的窗口

:e 小技巧:
窗口下使用:e buffer_name可以打开不同的Buffer(也适用于 vim模式下打开新文件,例如::e 1.txt,打开1.txt)

:e! 重新加载当前文件且不保存当前的文件(适用修改一段文本后,又不需要它但不想删除,就可以使用 :e! 重新加载下放弃本次修改)

Tab(标签页)将窗口分组(使用不多,简单了解)

vim的Tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
比如一个Tab全用来写PHP文件,另一个Tab全是HTML文件
相比窗口,Tab一般用的很少,Tab太多管理起来也比较麻烦

Tab(标签页)操作:

:tabe[dit] {filename}在新标签页中打开 {filename]

<C-W>T 把当前窗口移到一个新标签页

:tabc[lose] 关闭当前标签页及其中的所有窗口
:tabo[nly] 只保留活动标签页,关闭所有其他标签页

Tab(标签页)切换操作
如何切换不同的标签页,一般建立两个就好,太多不好操作

什么是 Vim 的 text object

Text Object(文本对象)

如果你学过主流的编程语言,一定知道面向对象编程
Vim里文本也有对象的概念,比如一个单词,一段句子,一个段落
很多其他编辑器经常只能操作单个字符来修改文本,比较低效
通过操作文本对象来修改要比只操作单个字符高效

文本对象操作方式

之前我们己经使用过文本对象了,回忆下 dw(删除一个单词)

[number][text object]

number 表示次数,command 是命令,d(elete), c(hange), y(yank)

text object 是要操作的文本对象,比如单词w,句子S,段落p

Vim复制粘贴与寄存器的使用

Vim Normal模式复制粘贴

复制粘贴分别使用 y (yank)和 p (put),剪贴命令 dp

我们可以使用 v(visual)命令选中所需要复制的地方,然后使用 p 粘贴

配合文本对象:比如使用 yiw 复制一个单词,yy 复制一行

Insert模式下的复制粘贴

这个和其他的文本编辑器差不多,但是粘贴代码有个坑
在 vimrc 中设置了:set autoindent 后,
粘贴 python 代码缩进错乱
这个时候需要使用 :set paste:set nopaste 解决

什么是vim的寄存器

你有没有好奇?vim在normal模式下复制/剪贴的内容去了哪?
vim里操作的是寄存器而不是系统剪贴板,这和其他编辑器不同
默认我们使用d删除或者应负责的内容都放了“无名寄存器”
用x删除一个字符放到无名结存器,然后p粘贴,可以换调两个字符

深入寄存器(register)

Vim不使用单一剪贴板进行剪贴,复制与粘贴,而是多组寄存器

通过"{register}前缀可以指定寄存器,不指定就默认无名寄存器

比如使用"ayiw复制一个单词带无名寄存器a中,"bdd删除当前行到寄存器b

Vim中""表示无名寄存器,缺省使用。"" p其实就等同于p

食用方法::reg {register}查看当前寄存器里的内容,

比如 :reg a查看a寄存器里的内容,使用"{register} p来粘贴当前寄存器里的内容,比如“a p

其他常见寄存器

除了有无名寄存器以及a-z,Vim中还有一些其他常见寄存器

复制专用寄存器,"0使用y复制文本同时会被拷到复制寄存器0

系统剪贴板"+可以在复制前加上"+复制到系统剪贴板

其他一些寄存器比如"%当前文件名,".上次插入的文本(不常用,了解知道即可)

系统剪贴板食用方法:

比如有需求从vim李复制内容到其他地方,这时候就要用到系统剪贴板。但首先要确保vim里的编译选项里有clipboard

查看方法:echo has('clipboard'),如果输出是1的话,就说明支持这个特性。

具体使用方法和上面深入寄存器里一样的大同小异的用法,
比如可以使用"+y复制当前行到系统剪贴板,然后其他地方使用粘贴命令即可,同样其他地方复制的,
vim里也可以使用"+p来调用系统剪贴板里的内容。

当然如果你嫌每次前面都要带个"+很麻烦的话,可以使用命令:set clipboard=unnamed来让你直接复制粘贴系统结贴板的内容

比如ydp。同样insert模式里也可以使用Ctrl+R+来直接粘贴系统剪贴板的内容

Vim 如何用宏完成强大的批量操作

Vim如何用宏完成强大的批量操作

强大的Vim宏(macro)
从一个需求说起,给多行url链接加上双引号,你会怎么做?

[https://moshanghua.net](https://moshanghua.net)
https://moshanghua.net
https://moshanghua.net
https://moshanghua.net

什么是Vim宏(macro)

宏可以看成是一系列命令的合集、
我们可以使用宏[录制]一系列操作,然后用于[回放]
宏可以非常方便地把一系列命令用在多行文本上

如何使用宏

宏的使用分为录制和回放
Vim使用q来录制,同时也使用q结束录制
使用q{register} 选择要保存的寄存器,把录制的命令保存在其中
适用 @{register} 回放寄存器中保存的一系列命令

用宏解决刚才的问题

先给一行加上双引号,然后再回放到其他所有行

我们先使用q来开始录制,给一行加上双引号,之后使用q退出

在剩下的所有行中回放录制的宏

食用方式:

首先使用q来录制,但q后面需要跟一个寄存器名称,表示我们把它放到寄存器里,比如这里使用a,就按qa

然后使用大 I 跑到当前行的开头并且进入插入模式,然后按下 " 添加在开头后,按 Esc 返回 normal 模式

再按一下大 A 跑到当前行的结尾,再按一下 " 添加在结尾,然后又按 Esc 返回 normal 模式

最后在按一下q结束录制

接下来我们就可以使用宏利

j移动到下一行后,用带上刚才保存录制的寄存器a来回放宏,@a就可以轻松的给当前行加上。

但加入链接成百上千时,显然这样也是不行的。这下这里就要使用vim的一个特性了,在命令行下面去执行normal模式下的命令

首先我们可以使用大V行选,然后使用j下移(大G可以直接移到到行尾),就可以实现部分选择或者全选操作

接下来就使用命令行模式:,在所有行执行normal命令,空格加上回放寄存器a里面的内容(:normal @a)然后按回车就可以了

Vim 补全大法

什么是补全?

只要手速块,补全什么的都是浮云
补全是根据当前环境上下文由编辑器[猜]你想输入的东西
比如补全一个单词,文件名,或者代码中的函数名,变量名等
vim提供了多种补全功能,还可以由插件拓展功能实现代码补全

Vim常见的补全方式

vim中有很多种补全的方式

<C-n>普通关键字补全

<C-x> <C-n>当前缓冲区关键字

<C-x> <C-i>包含文件关键字

<C-x> <C-]>标签文件关键字

<C-x> <C-k>字典查找

<C-x> <C-l>整行补全

<C-x> <C-f>文件名补全

<C-x> <C-o>全能(omni)补全

常见的三种补全类型

使用 ctrl+nctrl+p 补全单词

使用 ctrl+xctrl+f 补全文件名

使用 ctrl+xctrl+0 补全代码,需要开启文件类型检查(:filetype on)查询(:set filetype),安装插

小技巧:

:r! echo % 输入当前文件名到文件里

:r! echo %:p 输入当前文件路径到文件里

Vim更换配色

使用:colorscheme显示当前的主题配色,默认是default

用:colorscheme 可以显示所有的配色

有中意的配色后,用:colorscheme 配色名 就可以修改配色

默认的没有喜欢的也可以从网上下载自己喜欢的配色来进行安装使用

食用方法:

首先先git clone克隆下来自己喜欢主题的github地址,

比如:https://github.com/w0ng/vim-hybrid.git

然后我们要做的就是把克隆下来的文件夹colors里的主题文件复制或者移动到vim的colors主题文件夹里去,

这里我们可能要先创建个.vim的文件夹,自己可以使用命令查询下,如果有了就直接创建个 .vim下的colors文件夹,mkdir .vim/colors

接下来我们就可以使用复制cp命令把它克隆进去 cp vim-hybrid/colors/hybrid.vim ~/.vim/colors/hybrid.vim

然后去vim里用:colorscheme hybrid 就可以修改启用配色了

注:想要持久化配色需要把配置写到。vimrc里去

未完待续...

第二篇链接:VIM 插件篇