跳到主要内容

Vim-CheetSheet

Vim 安装

sudo apt-get install vim 
brew install --HEAD nvim # Nightly version
brew install neovim --fetch-Head # Sometimes you need to update

新手指南

vim 自带教程

  • vimtutor 英文教程
  • vimtutor zh 中文教程

视频教程

网站

插件

Vim 模式切换

  • Normal 模式:Esc 或 CTRL+[
  • Insert 模式:Normal 模式下
    • i/I (insert) 插入
    • a/A (append) 追加
    • o/O (open a line) 添加新行
  • Visual 模式:Normal 模式下,按 v
  • Command 模式:Normal 模式下,按冒号(:)

插入模式小技巧

  • CTRL + h 删除上一个字符
  • CTRL + w 删除上一个单词
  • CTRL + u 删除当前行

快速移动

image-20220120135726407

基本移动

  • 左下上右:hjkl
  • w/W (word)下一个单词开头
  • b/B (backword)上一个单词开头
  • e/E (end) 下一个单词结尾
  • ge 上一个单词结尾

行间搜索移动

  • f/F{char} (find) 移动到 {char} 字符
  • t/T{char} (to) 移动到 {char} 的前一个字符
  • 如果没有找到,分号(;) 和 逗号(,) 搜索下一个/上一个

水平移动

  • 0 行首
  • ^ 首个非空字符, 等价于 0w
  • _ 行首
  • $ 行尾

垂直移动(不常用)

shift

  • () 句子间移动
  • {} 段落间移动

页面移动

  • gg 文件开头
  • G 文件结尾
  • CTRL + o 快速返回
  • 15g/15G/:15 快速移动到15 行
  • :+14/-14 下移/上移 14 行

屏幕移动

  • H/M/L 屏幕开头(Head),中间(Middle),结尾(Lower)

  • CTRL + u (upward) 上翻半屏

  • CTRL + d (down) 下翻半屏

  • CTRL + f (forward) 下翻一页

  • CTRL + b (backward) 上翻一页

  • zz 当前行居中

  • zt 当前行置顶

  • zb 当前行置底

文档操作

  • :e file –关闭当前编辑的文件,并开启新的文件。 如果对当前文件的修改未保存,vi会警告。

  • :e! file –放弃对当前文件的修改,编辑新的文件。

  • :e+file – 开始新的文件,并从文件尾开始编辑。

  • :enew –编译一个未命名的新文档。(CTRL-W n)

  • :e! – 重新加载当前文档,并丢弃已做的改动。

  • :e#或ctrl+^ – 回到刚才编辑的文件,很实用。

  • :f或ctrl+g – 显示文档名,是否修改,和光标位置。

  • :f filename – 改变编辑的文件名,这时再保存相当于另存为。

  • gf – 打开以光标所在字符串为文件名的文件。

  • :w – 保存修改。

  • 保存并退出

    • :wq
    • ZZ
    • :x
  • :saveas newfilename – 另存为

增删改查

删除

  • x 删除一个字符
  • dw 删除一个单词
  • dt) (delete to ) ) 删除至右括号)
  • daw (delete around word) 删除一个单词(包含空格)
  • diw (delete inner word) 删除一个单词 (不含空格)

修改

  • r (replace) 修改一个字符
  • R 修改多个字符
  • s (substitude) 等价于 di
  • S 删除整行,并插入
  • c (change) 修改
    • caw 删除单词,并插入, dawi
    • ct" (change to ") 删除双引号内内容,并插入,dt"i

查询

  • / 正向查询
  • ? 反向查询
  • n/N 搜索下一个,上一个

查找很长的词,如果一个词很长,键入麻烦,可以将光标移动到该词上。

  • * 相当于 /
  • # 相当于 ?

配置:

  • :set ic 忽略大小写
  • :set noic 取消忽略大小写
  • :set hls 匹配项高亮显示
  • :set is 显示部分匹配

替换

  • :s/word/excel:替换 一次 当前行wordexcel
  • :%s/word/excel/gc:替换当前行 所有 wordexcel,每次替换前都确认
  • :3,5 s/word/excel/4:替换 3-5 行 wordexcel,替换4次

配置项

  • % 所有行

  • .,$ 当前行到最后行

  • g (global) 全局执行

  • c (confirm) 需要确认

  • n (number) 只输入次数

撤销

  • u/:undo 撤销变动
  • CTRL+r 重做,反撤销
  • U 撤销当前行所有改动

多文件操作&缓存区

  • vim file1 file2 ... 多个文件打开到 buffer
  • :ls 显示打开的文件
  • :bn (:bnext) 下一个文件
  • :bp (:bprevious) 上一个文件
  • :bf (:bfirst) 第一个文件
  • :bl (:blast) 最后一个文件

窗口操作

多窗口打开

  • vim -o file1 file2 横向分屏打开
  • vim -O file1 file2 纵向分屏打开

分割

水平分割

  • <CTRL+w> s
  • :sp [filename]

垂直分割

  • <CTRL+w>+ v
  • :vs [filename]

移动光标

  • <CTRL+w> w 窗口循环切换
  • <CTRL+w> hjkl 窗口方向切换

移动分屏

  • <CTRL+w> HJKL
  • <CTRL+w> r 旋转窗口的位置

重排窗口大小

  • <CTRL-w>= 窗口等宽,等高
  • <CTRL-w>_ 窗口最大化高度
  • <CTRL-w>| 窗口最大化宽度
  • <CTRL-w> [n]+- 修改屏幕尺寸 增加/减少 [n] 行

关闭窗口

  • <CTRL+w> q
  • :q/x
  • :qall -- 关闭所有窗口,退出vim。
  • :wall -- 保存所有修改过的窗口。
  • :only -- 只保留当前窗口,关闭其它窗口。(CTRL-W o)
  • :close -- 关闭当前窗口,CTRL-W c能实现同样的功能。 (象 :q :x同样工作 )

分屏打开游览文件系统

  • :Sex – 水平分割一个窗口,浏览文件系统;
  • :Vex – 垂直分割一个窗口,浏览文件系统;

文本对象(Text object)

基本用法: [number] <command> [text object]

  • iw (inner word)
  • aw (around word)
  • is (inner sentence)
  • ip (inner paragraph)

更丰富用法

  • ai 的右边还可以是

    []{}"' 代表被这些括起来的文字

复制黏贴&寄存器

基本使用

  • y (yank) 复制
  • d (delete) 剪切
  • p (put) 黏贴

使用寄存器

  • "{register} 使用寄存器

  • "ayiw 复制一个单词到 a 寄存器

  • "bdd 剪切一个行到 b 寄存器

  • "+ 引用系统剪切板

  • "% 引用文件名

黏贴缩进混乱

  • :set paste:set nopaste

  • :set clipboard=unnamed 剪切版等于 无名寄存器

视图模式

  • v 选中一个
  • V 选中一行
  • CTRL+v 选中块

重复工作&宏

最简单的宏

  • . 点,重复上一个动作

宏录制,本质上就是录制一段键盘代码,然后反复执行

  1. qa: 录制 宏a

  2. 操作

  3. q: 停止录制

  4. 选中需要重复操作的文本

  5. @a: 播放宏a

自动补全

  • CTRL+n/ CTRL+p 补全单词
  • CTRL+x CTRL+f 补全文件名
  • CTRL+x CTRL+o 补全代码,需要开启插件

当弹出补全菜单后:

  • C-p 向前切换成员;
  • C-n 向后切换成员;
  • C-e 退出下拉菜单,并退回到原来录入的文字;
  • C-y 退出下拉菜单,并接受当前选项。

Vim配置

参考:Vim配置入门【阮一峰】Top 50 Vim Configuration OptionsVim 强大的配置https://www.cnblogs.com/shamojituan/p/4285469.html

""""""""""""""
" 基本配置 "
""""""""""""""
let mapleader=";" " 设置 <leader>

if &compatible
set nocompatible " 不要兼容vi
endif

if has('syntax')
syntax enable
syntax on " 设置语法高亮
endif

if has('multi_byte')
set helplang=en " 帮助文件使用英文
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8,ucs-bom,gb18030,cp936,latin1
endif
set showcmd " 显示输入的命令
set mouse=a " 允许使用鼠标, n是normal生效,a则是全模式生效


""""""""""""""
" 缩进配置 "
""""""""""""""

set smarttab " 智能tab
set smartindent " 智能缩进
set autoindent " 自动换行缩进
set cindent " C Program 自动缩进
set expandtab " tab 换成空格
set tabstop=4 " tab 替换成4个空格
set softtabstop=4 " 连续数量的空格看作一个制表符
set shiftround " shift缩进取整
set shiftround " shift缩进取整
set shiftwidth=4 " shift每次移动4个空格
if has('autocmd')
filetype plugin indent on " 载入文件类型拆件,载入相关缩进文件
endif

" 打开折叠
if has('folding')
set foldenable
set foldmethod=indent " 基于缩进的折叠
set foldlevel=99 " 默认打开所有缩进
endif

""""""""""""""
" 外观配置 "
""""""""""""""
set shortmess+=c " 报错信息使用简写
"set shortmess=atI " 启动的时候不显示那个援助乌干达儿童的提示
set number " 显示行号
" set relativenumber " 设置相对行号
set wrap " 自动折行
set cmdheight=3 "命令窗口高度
" set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离
set visualbell " 报错时闪烁
" set background=dark "背景使用黑色
set ruler " 显示光标当前位置
set confirm " 显示确认对话框
set showmode " 显示当前模式
set linebreak " 软折行
set cursorline " 光标所在行高亮
" set textwidth=80 " 一行显示多少字符
set laststatus=2 " 总是显示状态行


"""""""""""""
" 搜索配置 "
""""""""""""""
set showmatch " 高亮括号
set hlsearch " 高亮匹配结果
set incsearch " 跳至第一个匹配结果
set ignorecase " 忽略大小写



""""""""""""""
" 编辑配置 "
""""""""""""""
set noswapfile " 禁止生成swap文件
set nobackup " 不创建备份文件
set nowritebackup
set noundofile " 删除撤销历史
set hidden " 终端隐藏后不结束
set ignorecase" 忽略大小写
" set smartcase
set clipboard+=unnamed " 共享剪贴板
set autoread " 文件在外部被修改过,重新读入
set autowrite " 自动写回
set infercase
set history=500 " 历史命令
" set splitbelow " 在下方分割
set splitright " 在右方分割
set sessionoptions+=globals



""""""""""""""
" 性能配置 "
""""""""""""""
set matchtime=2 " 匹配括号所用时间,单位为0.1秒
set lazyredraw " 延迟绘制,提升性能
set ttimeout
set timeoutlen=500
set ttimeoutlen=10
set updatetime=100 " 更新时间100ms 默认4000ms 写入swap的时间


""""""""""""""
" 性能配置 "
""""""""""""""
" 其余配置
set ffs=unix,dos,mac " 文件换行符,默认使用unix换行符
set winaltkeys=no " 不允许使用alt键

if has('nvim') == 0 && has('patch-8.1.2020')
set cursorlineopt=number cursorline
endif

if has('patch-8.1.1564')
set signcolumn=yes
" set signcolumn=number
else
set signcolumn=yes
endif

" 定位到退出位置并移动到屏幕中央
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif | normal! zvzz
endif



" 6. 补全配置
set wildmenu " 显示补全菜单
set wildmode=full " 补全模式





" 一下内容来自韦大的配置
" 文件搜索和补全时忽略下面的扩展名
set suffixes=.bak,~,.o,.h,.info,.swp,.obj,.pyc,.pyo,.egg-info,.class
"stuff to ignore when tab completing
set wildignore=*.o,*.obj,*~,*.exe,*.a,*.pdb,*.lib
set wildignore+=*.so,*.dll,*.swp,*.egg,*.jar,*.class,*.pyc,*.pyo,*.bin,*.dex
" MacOSX/Linux
set wildignore+=*.zip,*.7z,*.rar,*.gz,*.tar,*.gzip,*.bz2,*.tgz,*.xz
set wildignore+=*DS_Store*,*.ipch
set wildignore+=*.gem
set wildignore+=*.png,*.jpg,*.gif,*.bmp,*.tga,*.pcx,*.ppm,*.img,*.iso
set wildignore+=*.so,*.swp,*.zip,*/.Trash/**,*.pdf,*.dmg,*/.rbenv/**
set wildignore+=*/.nx/**,*.app,*.git,.git
set wildignore+=*.wav,*.mp3,*.ogg,*.pcm
set wildignore+=*.mht,*.suo,*.sdf,*.jnlp
set wildignore+=*.chm,*.epub,*.pdf,*.mobi,*.ttf
set wildignore+=*.mp4,*.avi,*.flv,*.mov,*.mkv,*.swf,*.swc
set wildignore+=*.ppt,*.pptx,*.docx,*.xlt,*.xls,*.xlsx,*.odt,*.wps
set wildignore+=*.msi,*.crx,*.deb,*.vfd,*.apk,*.ipa,*.bin,*.msu
set wildignore+=*.gba,*.sfc,*.078,*.nds,*.smd,*.smc
set wildignore+=*.linux2,*.win32,*.darwin,*.freebsd,*.linux,*.android

其他

  • :pwd 当前工作目录
  • :cd path 切换工作目录
  • :set autochdir 根据编辑的文件自动切换工作目录
  • :set nu 设置行号

vim 配置

NeoVim 配置

我的 neovim 配置 是 forked from fgheng/vime

目录

安装

Plug 'preservim/nerdtree'
Plug 'Xuyuanp/nerdtree-git-plugin'

快捷键

<F2> 打开目录
W 竖分屏
w 横分屏
h 关闭文件夹
l 打开文件夹
L 递归打开文件夹
. 显示隐藏文件

bb 进入目录
<backspace> 回到上一级目录
t 在新的tab打开
yp 复制文件路径
<leader>v 搜索目录

Vim-Server

特别简单的 vim 配置,没有任何插件,适用于服务器端的配置

Github: https://github.com/wklken/vim-for-server

参考教程