跳至主要內容

Vim笔记

Scarb大约 8 分钟

原文地址:http://hscarb.github.io/other/20191229-vim-note.htmlopen in new window

Vim笔记

Vim模式

Normal普通模式

移动、操作

  • u undo

Insert插入模式

进入

  • i insert
  • a append
  • o open a line below
  • I insert before line
  • A append after line
  • O append a line above
  • gi 快速跳转到最后一次编辑的地方并进入插入模式

退出

  • esc 退出到Normal模式
  • ctrl+c 回退到Normal模式
  • ctrl+[ 回退到Normal模式

插入模式快捷键

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

Command命令模式

Normal下输入:后执行命令

  • :vs (vertical split)
  • :sp (split)
  • :% s/foo/bar/g 全局替换
  • :set number/set nu 显示行号
  • :set nonu 隐藏行号
  • :syntax on 语法高亮
  • :set hls 搜索高亮 highlight search
  • :set incsearch 增量搜索 边搜索边高亮
  • :help {cmd} 查看帮助
  • :e 重新加载该文件

Read

  • :r! echo % 插入文件名

  • :r! echo %:p 插入文件名全路径

  • :help read

  • :help filename-modifiers

Visual可视模式

  • v Normal模式下进入
  • V 选择行
  • ctrl+v 块状选择

可视模式下快捷键

  • d delete 删除
  • y yank 复制
  • p paste 粘贴

快速移动

在Normal模式下

  • word 以非空白符分割的单词
  • WORD 以空白符分割的单词

移动

  • hjkl ←↓↑→
  • w/W 下一个word/WORD开头
  • e/E 下一个word/WORD尾
  • b/B backword 回到上一个word/WORD开头

行间搜索移动

  • f{char} find 移动到char字符
  • F{char} rfind 从行尾开始搜索移动到char
  • t till 移动到char的前一个字符
  • T rtill 从行尾移动到char前一个字符
  • ;/,继续搜索该行下一个/上一个

水平移动

  • 0 移动到行首
  • ^移动到第一个非空白字符
  • $ 移动到行尾
  • g_移动到行尾非空白字符

垂直移动

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

页面移动

  • gg/G 移动到文件开头/结尾
  • ctrl+o 快速返回
  • H/M/L 跳转到屏幕开头Head 中间Middle 结尾Lower
  • ctrl+u upword 向上翻页
  • ctrl+f 向下翻页
  • zz 把屏幕置为中间

快速增删改查

快速删除

快速删除字符/单词

  • x 删除一个字符
  • d{} delete 配合文本对象删除一个单词
  • dw delete (around) word
  • daw = dw delete around word (include space)
  • diw delete word (exclude space)

删除行

  • dd delete line
  • dt{} delete till {}
  • d$ delete to end of the sline
  • d0 delete to start of the line

重复

  • {num}{cmd} repeat cmd num times
  • {num}x 删除num个字符
  • {num}dd 删除num

快速修改

  • r{} replace 替换一个字符为{}

  • s substitute 删除当前字符并进入插入模式

  • c{obj} change 删除文本对象并进入插入模式

  • ct{} change to {} 删除到``并进入插入模式

  • R 连续替换字符

  • S 删除整行并进入插入模式

  • C 删除整行并进入插入操作

  • {num}r{char} 替换num个字符为char

  • {num}s 删除num个字符并入插入模式

快速查询

  • / 前向搜索
  • ? 反向搜索
  • n/N 跳转到上一个/下一个匹配
  • */# 搜索光标所在的当前单词,前向/后向匹配

正则搜索替换

  • :[range]s[ubstitute]/{pattern}/{string}/[flags] 查找并且替换文本,支持正则表达式
  • range 表示范围,10,20表示10-20行,%表示全部
  • pattern 要替换的模式(正则表达式)
  • string 替换后文本
  • flags 替换标志
    • g global 全局范围执行
    • c confirm 替换前需要确认
    • n number 报告匹配的次数而不替换,可用来查询匹配次数

多文件操作

  • vim {filename1} {filename2} -O 在多个窗口打开多个文件

三种多文件操作概念

  • Buffer: 打开的一个文件的内存缓冲区
  • Window: Buffer可视化的分割区域
  • Tab:可以组织为窗口的一个工作区

Buffer缓冲区

  • :ls 列举当前缓冲区

  • :b n 跳转到第n个缓冲区

  • :bpre :bnext :bfirst :blast

  • :b buffer_name 加上tab补全来跳转

  • :e {文件名} 修改文件

Window窗口

是可视化的分割区域

  • 一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区
  • ctrl + w, s :sp 水平分割
  • ctrl + w, v :vs 垂直分割
  • 每个窗口可以继续被无限分割

窗口切换

  • ctrl + w, w 窗口间循环切换
  • ctrl + w, h 切换到左边的窗口
  • ctrl + w, j 切换到下边的窗口
  • ctrl + w, k 切换到上边的窗口
  • ctrl + w, l 切换到右边的窗口

移动窗口

  • ctrl + w, H 左移窗口
  • ctrl + w, J 下移窗口
  • ctrl + w, K 上移窗口
  • ctrl + w, L 右移窗口

重排窗口

  • :h window-resize 查看文档
  • ctrl + w, = 使所有窗口等宽、等高
  • ctrl + w, _ 最大化活动窗口的高度
  • ctrl + w, | 最大化活动窗口的宽度
  • [N], ctrl + w, _ 把活动窗口的高度设为[N]
  • [N], ctrl + w, | 把活动窗口的宽度设为[N]

Tab标签页 将窗口分组

Tab是可以容纳一系列窗口的容器

  • :h tabpage 查看文档
  • Vim的Tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
  • 如一个Tab管理所有Python文件,一个Tab管理所有HTML文件

Tab操作

  • :tabnew {filename} 新建标签页,打开{filename}
  • :tabe[dit] {filename} 在新标签页中打开{filename}
  • ctrl + w, T 把当前窗口移到一个新标签页
  • :tabc[lose] 关闭当前标签页及其中的所有窗口
  • :tabo[nly] 只保留活动标签页,关闭所有其他标签页

Tab切换

Command模式命令普通模式命令用途
:tabn[ext] {N}{N}gt切换到编号为{N}的标签页
:tabn[ext]gt切换到下一标签页
:tabp[revious]gT切换到上一标签页

Vim的Text Object

文本对象操作方式

  • [number]<command>[text object]
  • number 次数
  • command 命令 d(elete), c(hange), y(ank), v(isual)
  • text object 操作的文本对象 w单词,s句子,p段落
  • iw inner word,表示这个单词,不包含单词外的字符
  • aw around word,这个单词及环绕这个单词的字符(包含空格)

操作成对括号中的内容

  • i( i) 1 * ([2 + 3])

  • a( a) 1 * [(2 + 3)]

  • i< i> The <[tag]>

  • ......

  • {}

  • []

  • ""

  • ``

  • ci" 删除双引号里面的内容并进入插入模式

Vim复制粘贴与寄存器

Normal模式赋值粘贴

  • y(ank) 复制
  • p(ut) 粘贴
  • d(elete) 剪切
  • v(isual) 选中要复制的地方
  • yiw 复制一个单词
  • yy 复制一行

Insert模式复制粘贴

  • 和其他编辑器差不多
  • 在vimrc设置autoindent,粘贴代码会缩进错乱
  • 需要用:set paste :set nopaste解决

Vim寄存器

  • Vim复制粘贴操作的是寄存器而不是系统剪贴板
  • 默认复制和剪切的内容放到了“无名寄存器”
  • Vim使用多组寄存器进行剪切、复制与粘贴
  • "{register} 指定寄存器 {register}为有名寄存器a-z
  • "" 无名寄存器
  • "ayiw 复制一个单词到寄存器a
  • "bdd剪切当前行到寄存器b中
  • :reg {register}查看寄存器内容

常见寄存器

  • "0 复制专用寄存器,使用y复制文本同时会被拷贝到复制寄存器0
  • "+ 系统剪贴板,在复制前加上"+可以将内容复制到系统剪贴板
  • "% 当前文件名
  • ". 上次插入文本
  • :set clipboard=unnamed set clipboard+=unnamed 直接复制粘贴系统剪贴板内容

Vim宏(Macro)

  • 一系列命令的集合
  • 可以使用宏录制一系列操作,然后用于回放
  • 可以方便的应用在多行文本上

录制和回放宏

  • q{register} 在普通模式下录制到register寄存器
  • q 结束录制
  • @{register} 回放某寄存器中的宏

将宏应用到多行,在Command模式下执行Normal模式命令

  • visual模式下选择多行
  • :'<,'> 输冒号进入Command模式
  • :'<,'>normal @a 为多行执行normal命令

Vim补全

命令补全类型常用
ctrl + n普通关键字
ctrl + w, ctrl + n当前缓冲区关键字
ctrl + x, ctrl + i包含文件关键字
ctrl + x, ctrl + ]标签文件关键字
ctrl + x, ctrl + k字典查找
ctrl + x, ctrl + l整行补全
ctrl + x, ctrl + f文件名补全
ctrl + x, ctrl + o全能(Omni)补全

更换配色

  • :colorscheme 显示当前主题颜色,默认default
  • :colorscheme <ctrl + d> 显示所有配色
  • :colorscheme {配色名} 修改配色

插件

安装插件管理器

  • 推荐插件:https://github.com/junegunn/vim-plugopen in new window
  • 安装:
    iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
        ni "$(@($env:XDG_DATA_HOME, $env:LOCALAPPDATA)[$null -eq $env:XDG_DATA_HOME])/nvim-data/site/autoload/plug.vim" -Force
    
  • 使用:
    • :edit $MYVIMRC
    call plug#begin()
    
    " List your plugins here
    Plug 'tpope/vim-sensible'
    
    call plug#end()
    
    • Reload the file :source % or restart Vim, then you can,
      • :PlugInstall to install the plugins
      • :PlugUpdate to install or update the plugins
      • :PlugDiff to review the changes from the last update
      • :PlugClean to remove plugins no longer in the list

插件网站

快速跳转插件

if exists('g:vscode')
  Plug 'asvetliakov/vim-easymotion', { 'as': 'vsc-easymotion' }
else
  Plug 'vim-easymotion/vim-easymotion'
endif


" ...

" easy motion 添加递归映射(后面那个也是一个映射,所以要递归映射)
" 含义为:按下 ss,就开始搜索 2 个字符的 EasyMotion 跳转
nmap ss <Plug>(easymotion-s2)ggjjjjjjjjjjk

" easy motion
let g:EasyMotion_smartcase = 1   " 启用智能大小写匹配
nmap <Leader>j <Plug>(easymotion-jumptoanywhere) " 按下;j跳转到任意位置
nmap <Leader>f <Plug>(easymotion-s2)    " 按下;f触发双字符搜索

欢迎关注公众号【消息中间件】(middleware-mq),更新消息中间件的源码解析和最新动态!