Vim 从放弃到拿起

发表信息: by

Vim 从放弃到拿起

我与Vim

Vim 在我自己的编程史上出现的时间还算蛮早的,我最开始接触编程的时候便接触了Vim, 这也得益于我的学长, 在我开始学编程的时候,学长们便强推 linux 操作系统,我用的是 ubuntu 麒麟。听过学长们说vim有多么强大,于是我第一次接触了vim, 在vimtutor中学习了基本的快捷键,随后貌似也仅停滞于此。 我个人“责怪“让我放弃vim的是java, 我觉得java的语法实在是太复杂,eclipse却让我很快速的写java代码 。所以,我放弃了。 但又是什么让我打算重新拿起它呢? 是非java的语言。 我接触了python,kotlin, groovy, go, javascript,markdown 等等,这里肯定会被看到的人喷,但无所谓的是, 这里不是在与别人争论什么,也不是把:快来用vim吧 这种观念强加给别人, 更不是vim使用的教程,这里仅仅是记录了我对vim, 我个人对vim的每一步, 经过考虑,既然我决定拿起一些事情, 就一定要做到最后,做到最好(仅对我个人而言)。

在这之前,我用sublime写python, 如果我仅限于写python的话,我可能一直会用sublime,甚至会去选择pycharm, 但我还要写groovy, go, kotlin, markdown … , 各种ide出现在我的电脑里,导致他很快就装不下任何东西了,而且同样要在sublime中配置各种语言的解析环境,要记住各种独特的命令,学习成本还是如此之高。

我决定重新学习vim, 是重新学习,而不是继续学习, 在这里我会记录与vim的一点一滴,就像初恋一样。

随笔:我觉得决定要学习一件事情是需要勇气的,因为当你决定的时候,你就要多对自己负一份责任。

(第一步) Vimtutor

k j h l 上下左右

i 在光标前插入
a 在光标后插入
A 在本行末尾插入
o 在本行下插入新行
O 在本行上插入新行

w 光标到下个单词前
e 光标到下个单词末尾
$ 光标到本行末尾
0 光标到本行开始
^ 光标到本行第一个字符
[number] motion3e / 3w / 3j 重复执行number次motion
ta 跳到a单词的前面
fa 跳到a单词上

x 删除光标字符
d [number] motiond3w / d3d / d2e / dj / dk / ...

u 撤销当前操作
U 撤销整行操作
CTRL-R 回退撤销操作

CTRL-p 向上查找补全内容
CTRL-n 向下查找补全内容

p 将剪贴板的内容粘贴

r 替换光标出字符
R 持续替换动作直到ESC
ce 删除单词到词尾之后进入insert模式
cw 删除单词到下个单词前进入insert模式

gg 将光标到文件开头
G 将光标到文件末尾
CTRL-G 显示文件信息

CTRL-O 回退到上一次跳转
CTRL-I 撤销回退

/ 正向查找字符
? 逆向查找字符
n 下一个匹配出的字符
N 上一个匹配出的字符
* 光标放在单词前面,可以全文匹配这一单词 g* 光标放在单词前面,可全文匹配这一行

% 匹配与之配对的括号

:%s/old/new 将old替换成new
:%s/old/new/g 替换整个文件内
:%s/old/new/gc 在替换的时候让用户确认
:%s/old/new/ge 没有找到的时候不报错
:#,#%s/old/new 替换从#行到#行

: !cmd 在vim中使用外部命令
:r file 将file中的内容插入到当前光标所在位置
:r !cmd 将命令返回值插入到光标所在位置
v motion 在可视环境下选择文件内容

y 在可视环境下复制内容

:help w 帮助
:help c_CTRL-D
:help insert-index
:help user-manual

纵向编辑

CTRL-V 进入纵向编辑模式
hjkl 选中要编辑的区域
I/A 插入操作并且插入内容
ESC 推出并且全部应用纵向编辑

(第二步) Vim 用户手册

基本快捷键

bw效果一样,方向相反
W 跳句
B 反方向跳句
fx 在当前行上查找下一个x字符
3fx 在当前行上查找第三个x字符
Fx 在当前行上逆向查找x字符
tx 停留在查找的字符之前
Tx 逆向tx
; , 上面四个命令都可以用这两个命令重复,不过方向相反

:set number 显示行号
:set ruler 右下角显示光标位置

CTRL-U 内容向下滚动半屏
CTRL-D 内容向上滚动半屏
CTRL-E 内容向上滚动一行
CTRL-Y 内容向下滚动一行
CTRL-F 内容向上滚动一屏
CTRL-B 内容向下滚动一屏
CTRL-O 回跳到上一次位置
CTRL-I 跳回原来的位置

/ 搜索 比如/include
? 反向搜索
n 下一个找到的字符
N 上一个找到的字符
:set ignorecase 忽略大小写
:set noignorecase 不忽略大小写
/ (+ ⬆️箭头) 会找到上一个命令, 支持正则表达式
: 也会存在一个历史
:set hlsearch 设置高亮查询
:hlsearch 设置本次高亮,下次查询不会高亮
:set nohlsearch
:set incsearch 在键入关键字的时候就开始搜索
:scriptnames 找到vim配置文件的位置
ZZ 保存文件并退出
\` 回跳到上一次的位置 ma 将光标所在位置标记为a, 这样 `a命令就会将光标跳到标记a的地方 'a 将只会跳转到那一行,不会准确的跳转到列 [ 最后一次修改的当前位置 ]` 最后一次修改的结束位置

x 删除光标字符
X 删除光标前面的字符
D 删除到航尾
C 修改到航尾
s 修改要一个字符
S 修改一整行

r 替换一个字符
R 一直处于替换模式

v 处于visual模式
V visual模式行选择
CTRL-V 纵向选择模式

p 将剪切板中的内容粘贴到光标后
P 将剪切板的内容粘贴到光标前
y 复制
yy 复制一整行
~ 将字符变大写,然后光标跳到下一个字母

定制Vim

你可以配置你的 ~/.vimrc 文件来定制vim配置

在vimrc文件中"符号为注释
set incsearch
set backup 当文件保存的时候,保存起备份文件(以~结尾)
set backupext=.bak 设置备份文件的后缀
set ruler 屏幕右下角显示光标位置
set showcmd 右下角显示命令
set showmode 左下角显示模式
map <F5> i{<Esc>ea}<Esc> 将F5健映射到后面的命令 : 光标前面插入{然后在单词后面插入}
set wrap 一行显示不过来的内容折叠显示
set nowrap 不折叠显示
set xxx& 在选项后面放&使其配置恢复默认值
set sidescroll=10 设置至少显示10个字符的上下文
set list 现在每个制表符都会以^I显示. 同时每行行尾会有一个$字符, 以便 你能一眼看出那些位于一行尾部的多余空格.
set listchars=tab:>-,trail:- 现在每个制表符会以">—"显示2, 同时行尾空格以"-"显示
set iskeyword 定义了一个word中可以包含哪些字符:iskeyword=@,48-57,_,192-255 > "@"在这里代指所有的字母. "48-57"指ASCII码从48到57的那些字符, 即0到9. "192-255"是可打印拉丁字母.
set cmdheight=3 控制拿出几行来显示信息
syntax enable 如果你的终端支持彩色,这条设置则是打开彩色的大门
set autowrite 自动存档

编辑多个文件

:edit a.txt 关闭当前窗口,打开另一个窗口
vim one.c two.c three.c 编辑三个文件,单需要用 :next 向下切换,:previous 向上切换, last, first 都有其意义
CTRL-^ 也是可以进行文件直接的来回切换
mF 用大写字母做全局标记
"ay 将复制的内容放入寄存器a 如3j"ay
"ap 将寄存器a的内容粘贴出来 如 "ap
:saveas a.y 会将当前文件存储为a.y

分割窗口

:sp 打开一个新的窗口
:close 关闭
:only 关闭其他窗口
:sp filename 新窗口打开filename
:[number]sp 新窗口number行
CTRL-W hjkl 上下左右选择窗口
CTRL-W + 增加当前窗口高度
:vsp 垂直分割
CTRL-W HJKL 将窗口位置移动
:qall 推出所有窗口
:wall 保存所有窗口
:wqall
:qall!
vim -o one.txt two.txt three.txt 为每一个文件打开一个窗口, O可以打开垂直的窗口
vimdiff a.c b.c 比较两个文件的不同
:tabedit filename 页标签
gt 切换页标签

奇技淫巧

替换

:%s/\<GetResp\>/GetAnswer/ge

加速冒号命令

CTRL-W 在命令模式下 删除光标左边一个单词的命令
CTRL-U 删除光标左边全部命令
CTRL-B 将光标移动至命令头
CTRL-E 将光标移动至命令尾

:edit i<Tab> 将会当前目录现有的文件
:edit i<CTRL-P> 反向遍历
:edit i<CTRL-D> 显示所有匹配的上的文件

进退之间

CTRL-Z 挂起Vim
fg 回到挂起的vim
:shell 开启新的shell

(第三步) 安装插件

NERDTree

  • 安装
" 用vundle安装插件
set nocompatible             
filetype off                 
set rtp+=~/.vim/bundle/vundle
call vundle#begin()

Bundle 'scrooloose/nerdtree'

call vundle#end()            
filetype plugin indent on    

常用命令
更新插件:BundleUpdate
清除不再使用的插件:BundleClean,
列出所有插件:BundleList
查找插件:BundleSearch

  • 快捷键

CTRL-w-w 左右切换
CTRL-w-r 目录窗口左右切换
o 展开目录文件, 再按就关闭目录
O 递归打开文件
x 合拢选中节点的父目录
X 递归合拢所有
go 在已有窗口中打开文件, 但光标不跳到该窗口
t 中打开选中文件,并跳到新窗口 q 推出tree
P 跳到上级目录节点
p 跳到根目录节点
i 上下分屏
s 左右分屏

SimpyFold

在 .vimrc 文件中加入下面插件,便可以得到一个比较好的代码折叠插件

Plugin 'tmhedberg/SimpylFold'

indentpython

自动缩进插件

vim-scripts/indentpython.vim

airline

vim状态栏强化

vim-airline/vim-airline

ctrlp

全文件搜索

kien/ctrlp.vim

CTRL-p 模糊搜索当前文件夹及子目录
CTRL-f 模糊搜索最近打开的文件
CTRL-j/k 上下选中文件
CTRL-x 在当前窗口水平分屏打开文件
CTRL-v 同上, 垂直分屏
CTRL-t 在tab中打开

折叠

zc 折叠当前行
zo 打开当前行
zM 折叠所有
zR 打开左右

Mac Shell

ctrl a 跳到行首
ctrl e 跳到行尾
ctrl w 删除光标前一个字符串
esc b 光标跳到前一个字符首
esc f 光标跳到后一个字符末尾
ctrl u 删除光标之前的字符
ctrl l 清屏