Obeta

vim常用操作

经常忘记vim的操作,因为平时用的少,而每次都要Google一下还挺麻烦的,现在记录一下自己会常用的,还可以随时查看.

通常来说精通 VIM 的人非常少,精通需要花费大量的时间熟悉和使用,但是一旦熟悉后编码速度会得到非常大的提升,可以极大的摆脱鼠标的依赖,而且对于经常需要 ssh 和跟 linux 打交道的人来说,只能熟悉 vim,没有别的选择.这里并不提供入门也不提供高级进阶,只是记录一些常用的操作(希望能涉及常用的 99%).

vim
vim

vim key
vim key

模式

首先需要清楚 VIM 具有四种编辑模式:

  1. NORMAL:正常模式,此模式下可以输入命令.
  2. INSERT:插入模式,此模式下可以编辑文本.
  3. VISUAL:可视化模式,此模式下移动光标可选择文本.
  4. REPLACE:替换模式,此模式下的输入会替换文本.

当前所处的模式都会在 VIM 底部看到,按 ESC 键就会返回到 NORMAL 模式,可在 NORMAL 模式下进入其它模式.

光标移动

  • w,W:跳到下一个单词的开头(小写包括标点).
  • e,E:跳到下一个单词的结尾(小写包括标点).
  • b,B:跳到上一个单词开头(小写包括标点).
  • (:上一句.
  • ):下一句.
  • {:上一段(空白行).
  • }:下一段(空白行).
  • ^:当前行的开始.
  • $:当前行的行尾.
  • gg:文档的第一行.
  • G:文档的最后一行.

窗口切换

切换 split

  • ctrl + ww: 切换上一个 split
  • ctrl + w + h: 切换左边 split
  • ctrl + w + l: 切换右边 split
  • ctrl + w + j: 切换下边 split
  • ctrl + w + k: 切换上边 split

切换 panel(tab)

  • gt: 切换右边 panel
  • gT: 切换左边 panel
  • ngt: 切换右边第 n 个 panel
  • ngT: 切换左边第 n 个 panel
  • :tabn: 切换下一个 panel
  • :tabp; 切换上一个 panel
  • :tabn [n]: 切换到下一个的第 n 个 panel
  • :tabp [n]; 切换到上一个的第 n 个 panel

打开新文件

  • :tabe /path/file: 打开一个新 tab 并编辑此文件
  • vs: 垂直分屏
  • vs /path/file: 垂直分屏并打开文件
  • sp: 水平分屏
  • sp /path/file: 水平分屏并打开此文件
  • :e#: 回到上一个文件(当你在当前 tab 打开文件编辑完成后想要回退回去)

翻页

  • ctrl-f ctrl-b:整页翻页(f 就是 forword b 就是 backward)
  • ctrl-d ctlr-u:翻半页(d=down u=up)
  • ctrl-e ctrl-y:滚一行
  • zz 让光标所在的行居屏幕中央
  • zt 让光标所在的行居屏幕最上一行 t=top
  • zb 让光标所在的行居屏幕最下一行 b=bottom

删除(剪切)

使用d会将删除的字符放入缓冲区,可以使用p粘贴出来.

  • d:删除(剪切)v 模式下选中的块.
  • dd :删除(剪切)当前行,ndd删除 n 行.
  • d^:删除(剪切)至行首.
  • d$:删除(剪切)至行尾,同D.
  • dw:删除(剪切)一个 word.
  • dG:删除(剪切)至档尾.
  • dl:删除光标右边字符.
  • dh:删除光标左边字符.
  • dj:删除光标当前行和下面一行.
  • dk:删除光标当前行和上面一行.
  • (n)d:n 是行数,比如10d说明是删除当前行开始的 10 行.
  • :1,10d:删除 1 到 10 行.
  • :11,$d:删除 11 行开始的所有行.
  • :1,$d:删除所有行.
  • df:删除当前行中指定字符(包括此字符)的内容,比如dfn删除光标开始到 n 字符的位置中间所有内容.
  • dt:基本与上面类似(不包含此字符).

拷贝

  • y:在使用 v 模式选定了某一块的时候,复制选定块到缓冲区用;
  • yy:复制整行(nyy 或者 yny ,复制 n 行,n 为数字);
  • y^:复制当前到行头的内容;
  • y$:复制当前到行尾的内容;
  • yw:复制一个 word (nyw 或者 ynw,复制 n 个 word,n 为数字)
  • yG:复制至档尾(nyG 或者 ynG,复制到第 n 行,例如 1yG 或者 y1G,复制到档尾)
  • yiw:复制当前光标坐在位置的单词
  • viwy:同上
  • p:粘贴拷贝的内容.

搜索

  • /:正常模式下按下/再输入需要搜索的字符串,回车后会在当前位置向下搜索.n是搜索上一个,shift+n或者N反向查找.
  • ?:和上面的一样,只是会向上查找.
  • f[letter]:寻找当前行遇到的字符.
  • t[letter]:与f相同,但光标在此字符之前.
  • :noh: 取消搜索后的高亮显示匹配块

使用f, t 搜索出结果后可以使用以下按键来来回跳转

  • ;: 跳转到下一个结果
  • ,: 跳转到上一个结果

注意 f/t 都是行内搜索

编辑

  • o:当前行的下一行新开一行.
  • O:当前行的上一行新开一行.
  • A :当前行的尾部追加内容.
  • i :游标前插入内容.
  • I :行首插入.
  • cc:删除游标所在的行,然后进入编辑模式.
  • cw:删除游标所在的单词,然后进入编辑模式.
  • C :删除从游标所在的位置到行尾的字符,然后进入编辑模式.
  • u :撤销最后的改变.
  • U :还原当前行的内容.
  • v: 进入选择模式
  • V: 选中当前光标所在行,使用 jk 移动选择多行.
  • gi: 进入上一次插入模式的位置.
  • r: 替换当前光标所在字符.
  • R: 连续替换字符

CTRL+[相当于 ESC,如果 ESC 键坏了那么这个你会用得上.

替换

替换是 vim 的强项, 因为可以用正规表达式来匹配字符串.以下提供几个例子.

  • :s/aa/bb/g 将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
  • :%s/aa/bb/g 将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
  • :12,23s/aa/bb/g 将从 12 行到 23 行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
  • :12,23s/^/#/ 将从 12 行到 23 行的行首加入 # 字符
  • :%s= *$== 将所有行尾多余的空格删除
  • :g/^\s*$/d 将所有不包含字符(空格也不包含)的空行删除.

也可以逐个替换,比如替换文本中所有的var:

  1. 搜索 var: /var
  2. 按下: cgn
  3. 输入你想替换的值
  4. 完成后回车,替换下一个值可以点击.键.
  5. 跳过则点击n

文件操作

  • :w :写入文件.
  • :w! :写文件忽略警告信息.
  • :wq :写文件后退出.
  • ZZ :退出编辑器,如果文件有改动,则保存再退出.
  • :x :退出编辑器,如果文件有改动,则保存再退出.
  • :e!放弃所有修改, 重新从磁盘加载文件.
  • :e:不保存退出.
  • :n :编辑地下一行.

标签

  • m[letter]: 设置当前行的标签,比如ma.
  • '[letter]: 跳转到此标签处,比如'a.

[letter]如果是小些字母,那么代表是文件内部的标签,大写字母就是所有文件的标签

跳转

我们可以很方便的在文件中进行跳跃,而不需要使用 hjkl 简单的移动.

  • gd: 跳转到定义处.
  • CTRL-O: 跳转到光标之前的位置.
  • CTRL-I: 跳转到光标最新到位置.
  • TAB: 与CTRL-I相同.

下面两个只能在当前文件中可用,无法跨文件

  • 双反引号: 光标可以在当前位置与上一个位置跳转来回跳转.
  • '': 与上面的相同,只是在两个位置行的行首之前跳转.

vim 对于 jump 过的位置记录条数的最多的是 100 个

更多的用法可以输入:help jumplist

折叠

zj: 移动光标到下一个折叠处 zk: 移动光标到上一个折叠处 za: 切换光标处折叠状态 zo: 打开光标处的折叠 zO: 打开光标处的所有折叠 zc: 关闭光标处的折叠 zC: 关闭光标处的所有折叠 zm: 将 foldlevel 增加 1 zM: 关闭所有折叠 zr: 将 foldlevel 减少 1 zR: 将 foldlevel 减少到 0 zd: 删除光标处的折叠 zE: 删除所有折叠 [z: 移动到折叠处的开始位置 ]z: 移动到折叠处的结束位置

可视化选择

我们可以使用vV选择多行, 然后可以做以下事情:

  • JgJ → 把所有的行连接起来(变成一行)
  • <> 左右缩进
  • =自动给缩进

Text Object

文本对象(Text Object)操作是成为一个 vim 高手的必经之路,如果你足够熟练,还可以达到令人眼花缭乱的地步...

TextObject 文本对象

  1. w: word
  2. s: sentence
  3. p: paragraph
  4. ': single quote
  5. ": double quote
  6. t: tag
  7. (: small bracket
  8. [: middle bracket
  9. {: big bracket

上面给出英文是因为当你使用 VIM 的时候最好是能快速联想到对应的操作,比如操作一个 word 时候你可以快速按下w而不是想到中文"单词"

Range 范围

  1. i: inner
  2. a: all

Command 操作

  1. d: delete
  2. v: select
  3. c: change

使用

以下面为例:

The text is an example by Obeta(zhouyuexie).

删除单词example,命令格式为<Command><Range><TextObject>:

  1. daw: 包括删除单词前面的空格
  2. diw: 只删除单词
  3. dw: 省略 Range 会默认删除到单词后到空格

其余到类似,更多使用可以查看Vim Text Objects: The Definitive Guide

.vimrc 配置

下面使用了一些 vim 基本配置,你可以直接 copy 使用,也可以点击这里下载一份我目前觉得最好到配置,然后根据自己的需求习惯来更改,解压后将.vimrc.vim文件放入到你自己的根目录,放入后随便使用 vim 打开一个文件,输入:PlugInstall进行安装插件.

" 显示行号
set number
" 显示标尺
set ruler
" 历史纪录
set history=1000
" 输入的命令显示出来,看的清楚些
set showcmd
" 状态行显示的内容
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
" 启动显示状态行1,总是显示状态行2
set laststatus=2
" 语法高亮显示
syntax on
set fileencodings=utf-8,gb2312,gbk,cp936,latin-1
set fileencoding=utf-8
set termencoding=utf-8
set fileformat=unix
set encoding=utf-8
" 配色方案
syntax enable
" 指定配色方案是256色
set t_Co=256
" 不折叠
set nofoldenable
" set foldenable " 自动折叠

set wildmenu

" 去掉有关vi一致性模式,避免以前版本的一些bug和局限,解决backspace不能使用的问题
set nocompatible
set backspace=indent,eol,start
set backspace=2

" 启用自动对齐功能,把上一行的对齐格式应用到下一行
set autoindent

" 依据上面的格式,智能的选择对齐方式,对于类似C语言编写很有用处
set smartindent

" vim禁用自动备份
set nobackup
set nowritebackup
set noswapfile

" 用空格代替tab
set expandtab

" 设置显示制表符的空格字符个数,改进tab缩进值,默认为8,现改为4
set tabstop=2

" 统一缩进为4,方便在开启了et后使用退格(backspace)键,每次退格将删除X个空格
set softtabstop=2

" 设定自动缩进为4个字符,程序中自动缩进所使用的空白长度
set shiftwidth=2

" 设置帮助文件为中文(需要安装vimcdoc文档)
set helplang=cn

" 显示匹配的括号
set showmatch

" 文件缩进及tab个数
au FileType html,python,vim,javascript setl shiftwidth=2
au FileType html,python,vim,javascript setl tabstop=2
au FileType java,php setl shiftwidth=2
au FileType java,php setl tabstop=2
" 高亮搜索的字符串
set hlsearch

" 检测文件的类型
filetype on
filetype plugin on
filetype indent on

" C风格缩进
set cindent
set completeopt=longest,menu

" 功能设置

" 去掉输入错误提示声音
set noeb
" 自动保存
set autowrite
" 突出显示当前行
set cursorline
" 突出显示当前列
"set cursorcolumn
"设置光标样式为竖线vertical bar
" Change cursor shape between insert and normal mode in iTerm2.app
"if $TERM_PROGRAM =~ "iTerm"
let &t_SI = "\<Esc>]50;CursorShape=1\x7" " Vertical bar in insert mode
let &t_EI = "\<Esc>]50;CursorShape=0\x7" " Block in normal mode
"endif
" 共享剪贴板
set clipboard+=unnamed
" 文件被改动时自动载入
set autoread
" 顶部底部保持7行距离
set scrolloff=7

每行前面加了"的说明是已经被注释的.(以上配置设计到一些插件,因此别直接 copy,根据自己的需要来获取是最好的.)

懒人配置

对于懒人来说每次都要自己配置那么多,这是非常难受的,因此这里推荐一个开箱即用的配置vimrc

安装方法也很简单:

git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_awesome_vimrc.sh

其它问题

粘贴代码后会出现格式混乱

原本格式: line line line 粘贴后: line line line

解决方案有两种:

  1. 粘贴前打开粘贴模式:set paste,粘贴完成后关闭粘贴模式:set nopaste
  2. 在.vimrc 中增加一个函数来自动实现第一个的操作,可以直接参考这里,注意对于 tmux 需要使用最下面的方式,而 window10 里的 linux 子系统无法设置,只能用第一个方法.

个人随笔记录,内容不保证完全正确,若需要转载,请注明作者和出处.