admin 管理员组

文章数量: 887021

VIM的优势

如果做Linux C/C++开发,经常ssh到Linux服务器编辑各种文件,那么熟练使用VIM绝对可以提高工作效率。

VIM的高效体现在多模式,可以很方便快速的对文件进行各种编辑修改,而这恰恰是在软件开发中经常遇到的场景。VIM流行这么多年,很多操作都是经过多年沉淀下来的高效操作,熟练的VIM操作可以让编辑与思维尽可能同步,快速的反复修改,把代码写成想要的样子。并且,在Linux上很多的操作,默认集成VIM键位的,比如man查询一个命令,git提交注释时等。

之前还不太习惯用VIM时,在Linux服务器上开启sambda服务,把一个目录映射到windows上,然后在windows上修改对应的文件代码,修改完毕后再去编译执行。这样操作,效率都是偏低的,尤其是快速修改脚本文件调试时,不能马上就地修改快速运行。后来下定决心,好好练习了一下VIM,感觉收获很多。

VIM的练习

想熟练运用VIM,前期需要一定的刻意练习和思考。比如: 如何快速让光标跳转到指定位置;如何用最少的最快捷的按键完成自己想做的操作等。总结提炼一下自己平时所碰到的常见的编辑场景,思考查询最有的操作办法,刻意练习直到形成肌肉记忆。平时也可以多搜搜别人使用的VIM的一些技巧,看看高手们如何把VIM运用的出神入化的,博采众家之长。

自己刚开始沉迷于sublime时,也是刻意的练习过一阵子,后面确实体会到了很多的方便之处,多点编辑,实时匹配正则替换,自动格式化等等。深度掌握一种或几种文本编辑器对一名程序员还是蛮有必要的。而VIM的学习相信带来的收益更大,多种IDE都有VIM模式的键位支持,VIM的编辑方式已经渗透了多种开发工具:)

VIM小技巧

总结一下自己平时常用到的操作,熟悉这种模式后,模式和按键组和使用,发挥更大的优势。

# 跳转
H                # 移动到屏幕顶端high
M                # 移动到屏幕中部middle
L                # 移动到屏幕中部low
ctrl + o         # 跳转光标的上一次位置
ctrl + i         # 跳转光标的下一次位置
gd               # 跳转到局部变量定义 go definition
gf               # 跳转到文件
%                # 跳转到匹配的括号

# C/C++跳转下一个函数
[[   # 用来跳到光标前面的一个函数开始处
]]   # 用来跳到光标后面的一个函数开始处
[]   # 用来跳到光标前面的一个函数结尾处
][   # 用来跳到光标后面的一个函数结尾处

# 查找
/xx               # 查找xx, n向下,N反向
?xx               # 查找xx, n向上,N反向
:noh              # 取消搜索高亮,no highlight
*                 # 选中并正向查找光标所在的词
#                 # 选中并反向查找光标所在的词
:set ignorecase   # 搜索忽略大小写,可以tab联想输入
:set noignorecase # 不忽略
/<up/down arrow>  # 可以联想出历史输入过的词
:set hlsearch     # 打开设置高亮
:jumps            # 列出历史跳转列表
fx                # 找到本行字母x,再按分号跳到下一处

# 替换
:s/old/new/g      # 用new替换行内old
:2,5s/old/new/g   # 替换2到5行
:%s/old/new/g     # 全文替换

# 自动补全
ctrl + p            # 插入模式下联想已经输入过的单词
ctrl + X, ctrl + L  # 插入模式下自动补全行, 可以配置组合键盘映射key-map

# 后台
ctrl + z         # 挂起当前任务到后台
jobs             # 查看后台挂起的任务
fg <n>           # 把后台挂起的任务n调度到前台,n可省

# 分屏
:sp <file>       # split  水平分屏
:vs <file>       # vsplit 垂直分屏
ctrl+ww          # 两次w,在分屏间跳转
ctrl+w <hjkl>    # 跳转分屏
ctrl+w <+>       # 扩大当前分屏
ctrl+w <->       # 减小当前分屏
:only            # 取消分屏

# 录制命令
q{a~z}           # 进入录制,录制到a寄存器
q                # 结束录制
qA               # 想寄存器a追加录制的命令
3@a              # 执行3遍录制的命令
@@               # 执行上次自己录制的命令

# 多标签
:tabe            # tab edit 新标签打开
gt               # go tab 在tab中切换
:tabc            # tab close 关闭标签页

# 多buffer
:e file          # 新buffer中打开file进行edit
:ls              # 列出当前缓冲区
:b n             # 去第n个缓冲区
:qa              # 退出所有窗口, quit all

# 折叠
zf               # 创建折行, f表示fold
zR               # 打开所有折叠
zc               # 折叠当前行current
zo               # 打开当前折叠open
zd               # 删除折行, d表示delete
zfap             # zf一个操作符, ap一个文本块,创建折叠
zfa{             # zf可以和text-object配合,折叠承兑大括号之间的内容,包括大括号所在行
zfi{             # 折叠承兑大括号之间的内容,不包括大括号所在行
:h folding       # 折行的帮助

# 缩进
>>               # 整行向右缩进
<<               # 整行向做缩进
==               # 自动缩进
=%               # 光标在括号处,缩进整个语句块 

# 区间内
vi"  # 选中光标所在“引号内的内容,in "
vi'  # in '
vi[  # in [
vi(  # in (
vi{  # in {
# 类比还有: ci( di(, 修改删除括号内的

# 字符
$  # 行尾, 有点类似正则表达式的通配符
^  # 行首非空白字符
0  # 行首

# 词操作
w  # 后一词词首
W  # 后一词词首,忽略标点
e  # 后一词词尾
E  # 后一词词尾,忽略标点
b  # 前一词词首
B  # 前一次词首,忽略标点

# 句操作
)  # 后一句句首
(  # 前一句句首
%  # 配合括号寻找另一半

# 行操作
G  # 最后一行非空白字符
nG # 第n行,类似 :n
gg # 第一行第一个非空白字符
J  # join 合并两行

# 段操作
}  # 下一段段首, 同样可配合%找配对
{  # 上一段段首

# 页操作
ctrl + f  # 下一页  forward
ctrl + b  # 上一页  back
ctrl + d  # 下半页  down
ctrl + u  # 上半页  up

# 复制粘贴删除
v         # 进入view mode
V         # 行选中模式
d         # 删除内容放入缓冲区可供粘贴
D         # 删除内容到行尾,删除内容都放入了可供粘贴的缓冲区
y         # yank
yy        # 复制所在行
y0        # 复制光标到行首
yG        # 复制光所在行到文件末尾行
ygg       # 复制光标所在行到开头所有行, 类似: c修改 d删除
p         # 粘贴到下一处paste
P         # 粘贴到上一处
daw       # 光标在单词中也可以删除一个单词,delete a word
r         # 替换光标所在处的字符一次   (r - replace)
R         # 持续替换光标所在处的字符
s         # 删除当前字符,并切换为插入模式
S         # 删除当前行,改为插入模式

# 修改
a                # 光标的下一个位置插入 (append)
A                # 行位插入
cc               # 修改整行,删除光标所在行,并进入插入模式 (c - change)
cw               # 修改单词
C                # 修改光标导航到行尾巴 == d$, i == D, i
~                # 反转光标或选中的字母的大小写

# insert模式下
ctrl + w         # 删除word
ctrl + u         # 重新编辑本行
ctrl + [         # 实现ESC功能
ctrl + d         # 左缩进
ctrl + t         # 右缩进

# 块编辑,如注释多行代码
ctrl + v         # 快选中
I{string}        # 大写I插入,只在第一行插入
Esc              # 所有之前块选中的都会插入了

# 撤销与恢复
u                   # 撤销undo
ctrl + r            # 反撤销redo
u<n>                # 撤销n次
U                   # 撤销当前行所有修改

# vimdff
vimdiff f1 f1       # 对比两个文件的差异
dp                  # diff put, 差异部分同步到对端窗口

# 命令
.                   # 重复上一次操作, 非常有用!
K                   # 查看光标所在单词的帮助
:read !ls           # 读取命令的输出
:read !date         # 读取日期
:! <cmd>            # 执行命令cmd
:help <cmd>         # 查cmd命令的帮助
:shell              # 新开一个shell
:set list           # 显示空白符,关闭 set nolist
:set paste          # 打开粘贴模式,关闭 set nopaste
:%!xxd              # 以16进制查看文件内容
:x                  # 如果文件有更改,则保存后退出, 否则直接退出
:sort r /regex/     # 对行进行正则排序

参考

  • https://github/amix/vimrc
  • https://github/skywind3000/awesome-cheatsheets/blob/master/editors/vim.txt
  • Vim从入门到精通
  • 笨方法学Vimscript
  • use_vim_as_ide - c/c++
  • Linux生产环境上,最常用的一套“vim“技巧
  • 真的会有人用 vim 开发大的项目吗?
  • 无插件VIM编程技巧
  • 给程序员的VIM速查卡
  • 简明 VIM 练级攻略
  • 世界上最好的编辑器Vim:1700多页数学笔记是如何实时完成的
  • Vim 基本配置和常用命令
  • Vim 使用小技巧
  • Vim 从入门到精通
  • 所需即所获:像 IDE 一样使用 vim
  • 笨方法学Vimscript
  • Vim 有什么奇技淫巧?
  • Vim 和 Emacs 这类经典的软件会被淘汰吗?
  • 熟练 Vim 能为我带来什么?
  • 为什么不少程序员极度推崇 Vim 和 Emacs,却对 IDE 嗤之以鼻?
  • 如何在 Linux 下利用 Vim 搭建 C/C++ 开发环境?
  • 关于Vim和Emacs个人理解,不知道大家怎么看?

本文标签: 小技巧 vim