简介
vim 是基于vi 的文本编辑器, 使用大量快捷键实现了在终端进行文本编辑. 因为vi 可以实现全键盘操作, 很多软件也引入了vim 模式, 学会一门vim, 可以提升多个软件的使用体验和工作效率!
vim 有3种模式:
-
默认的命令模式(command mode), 按
esc会从其他模式进入到该模式 -
底部命令行模式, 按:(冒号键) 进入该模式, 进行应用级别(退出, 保存, 修改配置等)操作. 按
/和?进入可以执行全局性的文本操作(搜索, 替换等) -
编辑模式, 按a/i/o 进入编辑模式, 这时候才可以编辑文档, a会在当前字符后面追加, i 在当前字符前面插入, o则换行输入
注意vi fileanme 命令打开文件会将整个文件加载到内存中, 生产环境谨慎使用. 只是查看的话可以用less 命令替代
常用指令
只有在command 模式下才能使用指令, 没事多按esc 确保在command 模式
编辑
:%s/old/new/g: 全局替换
u: 撤销上一次操作, 对应ctrl + r 恢复上一次操作
vi 中有一些元素用来指代位置, 跟其他按键配合使用, 比如数字代表几行, ^ 代表行首, $ 代表行尾, G 代表文本末尾
-
3yy: 复制从当前行开始的3行文本, 复制当前行1yy可以简写为yy, 配合p粘贴. 这里的y是yank 的意思, p 是paste 的意思 -
y$: 复制从当前字符开始到行尾的文本, 类似的用法还有yG复制当前位置到文本末尾 -
3dd: 删除从当前行开始的3行文本, 删除当前行可以简写为dd, 它在删除前会先复制到剪切板, 所以也可以当剪切功能使用, d 是delete的意思 -
d^: 删除从当前字符开始到行首的文本
应用
:wq: 保存并退出
:q!: 不保存强制退出, 注意:q 是退出, 而q: 是查看命令历史记录, 这时候输入:q 是退出历史记录
移动
一般学会文本编辑和应用相关的指令就够了, 但是如果想键指如飞, 全键盘操作, 那就得配合移动指令了
h, j, k, l 四兄弟是字符级别的移动
-
h/j/k/l: 向左/下/上/右移动一个字符, 可以用方向键代替 -
gj: 向下移动一个物理行(忽略自动换行) -
gk: 向上移动一个物理行(忽略自动换行)
f 加任意符号: 搜索并跳转到下一个 字符处, 配合; 和, 向左和向右搜索
w, e, b 是单词级别的移动, vi 通过空格和iskeyword 分词, 比如set iskeyword=a-z,A-Z 遇到非英文字母就认为一个单词开始和结束
-
w: 移动到下一个单词开头,w代表word -
e: 移动到下一个单词结尾,e代表end -
b: 移动到上一个单词开头,b代表back
/ 加任意文本进行全局搜索, 支持正则表达式, 比如/aa.*bb 可以搜索到"aa你好bb". f 只能搜索字符
还有几个全局跳转的快捷键
-
gg: 跳转到文件开头 -
G: shift + g 跳转到文件结尾 -
5G跳转到第5行 -
:5加回车也是跳转到第5行 -
^和0: 都可以跳转到当前行开头 -
$: 跳转到当前行结尾.^和$在正则表达式中也代表开始和结束 -
(: 跳转到上一个语句开头 -
): 跳转到下一个语句开头 -
{: 跳转到上一个段落开头 -
}: 跳转到下一个段落开头
常用配置
vi/vim 使用~/.vimrc 作为配置文件, 修改后执行source ~/.vimrc 刷新配置, 会有报错不过忽略就行了
" 语法高亮
syntax on
syntax enable
"显示当前模式
set showmode
"显示命令行输入状态
set showcmd
"无需生成备份文件
set nobackup
"无需生成交换文件
set noswapfile
"显示匹配的括号/引号等符号
set showmatch
"设置编码
set encoding=utf-8
"总端颜色256
set t_Co=256
"共享系统剪贴板
"set clipboard^=unnamed,unnamedplus
"显示行号
set number
"显示相对行号
set relativenumber
"历史记录条数
set history=2000
"关闭兼容模式
set nocompatible
"退格键可以删除缩进,行尾和起始位置字符
set backspace=indent,eol,start
"开启增量搜索
"set incsearch
"搜索结果高亮
set hlsearch
"忽略大小写搜索
set ignorecase
"有大写字母时不忽略大小写
set smartcase
"自动补全候选项
set wildmenu
set wildmode=list:longest
"始终显示状态栏
set laststatus=2
set ruler
"光标所在行高亮
set cursorline
"禁止换行
set nowrap
"空格键代替制表符进行缩进
set expandtab
"制表符为2个字符
set tabstop=2
"按下制表符移动4个字符
set shiftwidth=4
"软表符()宽度为2
set softtabstop=2
"缩进代替折叠代码块
set foldmethod=indent
"根据语法折叠代码块
set foldmethod=syntax
"禁用代码折叠
set nofoldenable
"自动缩进
set autoindent
"GUI 模式下字体
set guifont=courier_new:h20
"set go+=b
"不增量搜索
set noincsearch
"不循环搜索
set nowrapscan
"if has("gui_running")
"colorscheme macvim
"set bs=2
"endif
"s 关闭搜索高亮
map s :noh<CR>