vim神器分享
—— 蔡宜利
本次分享的主要内容
- 打开文件
- 移动光标
- 插入代码
- 寄存器
- 宏
- ex命令
打开文件
- 输入完整路径
- vim /path/to/file
- vim /path/to/file +20 //打开并定位到20行
- vim /path/to/file +/str //打开并搜索str
- vim /path/to/file +"cmd" //打开并执行命令cmd
find命令
- :find/:sfind/:tabfind {filename}
- 在path目录下去查找文件名为{filename}的文件
- :set path+=** 就可以在当前目录下递归查找。
- 如果有多个匹配
- 使用菜单栏自动补全完整路径。
- {c-d}列出候选项;{tab}补全
- 设置项:set wildmenu/wildmode/wildchar
- gf
- ~/.vimrc:4 按gf打开光标下文件。
- gF打开并跳转到指定行;{c-w}gf在新窗口中打开。
移动光标
- normal模式下移动光标
- k j h l ;上下左右
- 0 $ ;行首行尾
- g0/g$/gj/gk ;物理行的操作
- w/W b/B e/E 整个单词/字串的移动
- [num]G ;直接跳转到[num]行
- %: 跳转到匹配的对应符号{}/()/<>/...
- 命令模式
- :[num] ;命令模式下直接输入行号跳转到[num]行
- :+/-[num] ;当前行+/-[num]行
查找&搜索
- 单行内的查找
- f/F{char}移动到某个字符
- t/T{char}移动到字符之前的一个字符
- ";"重复上次查找,","反向查找
- dt) delete直到下一个"之前
- 多行之间搜索
- /pattern 正向查找; ?pattern 反向查找
- :set hlsearch(搜索高亮); :set incsearch(实时搜索)
- n重复,N反向
- */# 查找光标下面的词
motion
- motion指一次光标移动,可以接在一些特定命令后面
- 用法:{number}{command}[text-object or motion]
- {command}:y:复制,d:删除,c:替换,v:选中 ……
- {motion}:上/下/左/右/查找/搜索/跳转……
- 举个栗子
- yl 复制到下一行 (dl/yh/y20G/ggyG)
- df, 修改到到一个"," (dt"/df,/cF;)
- cw 修改一个单词
- d/function 删除到下一个function
- v% 选中到下一个匹配的括号
文本对象
- 以一定标准分隔符来标识一段文本。
- 操作范围
- i: inner, 不包含空格或包围符本身
- a: around, 包括空格或包围符本身
- 操作对象
- w/s/p/<([{/t (单词/句子/段落/块/tag)
- word/sentence/paragraph/block/tag
- 举个栗子
- daw: delete a word,删除光标下的一个单词
- ci(: change inner () ,修改()里面的内容
- yi": yank inner " 复制双引号里面的字符串
- 好处:极大提高工作效率,操作更具有可重复性
寄存器
- 所有可用的寄存器{a-zA-Z0-9.%#:-"}
- :reg {name} 显示寄存器里面的内容
- 把内容复制到指定寄存器x
- normal模式下:"xy{motion}
- view模式下:{visual}"xy
- 命令模式::[range]yank x
- 把寄存器x里面的内容粘贴出来
- normal模式:"xp
- view模式:{visual}"xp //与normal模式类似
- 命令模式:[line]put x //把x寄存器的内容粘贴到[line]行
- 插入模式:{c-r}x //插入x寄存器里面的内容
- 把内容粘贴到命令行里面::{c-r}x
- 总结:normal模式下的有名寄存器的操作都是以引号+寄存器名开头
特殊寄存器
- 无名寄存器(""):x s d c y命令都会覆盖无名寄存器
- 复制专用寄存器("0):y同时复制到无名寄存器和复制专用寄存器
- 黑洞寄存器("_):"_d{motion} 删除该文本,不会覆盖无名寄存器
- 系统剪贴板("+) ("*)
- + 系统剪切板 * 主剪切板, 在windows和mac中无区别
- 查看vim是否被激活,(:version) 命令,找xterm_clipboard
- 表达式寄存器("=):可以输入一段vim脚本(注:特别有用!!!)
- 只读寄存器
- % 当前文件名
- # 轮换文件名
- . 上次插入的文本
- : 上次执行的ex命令
- / 上次执行的查找 (如何在命令行里快速输入上次查找的字符)
宏
- 构造可重复的命令,让vim去做吧
- 最简单的宏:"."
- 录制宏:
- 回放宏:
- 举例:
ex命令
- 起源于ex编辑器
- 在满屏编辑器之前,与计算机是靠打印在终端来沟通,以行为向导
- 基本命令
- ex /path/to/file
- 1,3p //打印第1-3行
- 3s/dev/dev2 //把第3行的dev替换为dev2
- 2m4 //第二行移动到第4行
- 3co5/3t5 //第3行copy到第5行
- /pattern/d //搜索到下一个包含pattern的行删除掉
- 1,/pattern/p
- 行寻址符号:"."当前行,"$"最后一行,"%"每一行,/pattern/ 匹配到pattern的行。可组合使用
两个强大的ex命令
- :substitute 替换
- :10,20s/dev-m/test-m/g
- :.s/\v([0-9]+)/"\1"/g 给当前行数字加上双引号
- :global全局命令
- 默认作用范围是整个文件
- :[range]global[!] /pattern/ [cmd]
- :g/re/p 全局搜索re匹配的并print出来——这就是grep
- :g!(或:v) 与g相反
Q&A
谢谢!^_^!