操作符和动作
- Vim两个基本概念:操作符
operator
和动作motion
。operator
看作动词,motion
看做名词。 - 操作符是用于对文本内容进行操作的命令,比如修改c、删除d、y复制到寄存器、~交换大小写、g~反转大小写、>增加(右)缩进、<减小(左)缩进、=自动缩进、zf定义折叠、gu转为小写、gU转为大写等。
# 查看操作符 :h operator
- 动作是指移动光标的命令等。比如h、j、k、l、/、w、b、e、^、0、$、%、s等。用来限定范围。
动作 = 移动光标的命令 或 动作 = [数字] + 移动光标的命令 # 数字表示移动次数,默认为1
# 查看motion帮助文档 :h motion.txt :h motion
operator
和motion
结合实现Vim操作的语法如下[数字] + 操作符 + [数字] + 动作 # 第1个数字表示执行(操作符 + [数字] + 动作)的次数,默认为1;第2个数字表示执行动作的次数,默认为1 # 比如2d2w表示执行2次d2w,d2w表示删除2个词(包括词后面的空格)
此时,operator表示要执行的操作(比如删除d,修改c,复制y等),motion表示该operator能操作的范围(比如2w表示能对2个单词执行该操作)。简而言之,操作符用来告诉Vim我要做什么操作,动作用来告诉Vim我要操作的具体范围(对哪部分文本进行操作)。
- 以行为单位的操作的语法
[数字] + 操作符 + [数字] + 操作符 # 前后两个操作符一样。 # 第一个数字表示执行"操作符 + 数字 + 操作符"的次数,默认为1。 # 第二个数字为从当前行开始,向下操作的行数(包括当前行),默认为1
行操作时,用数字来控制该操作符能操作的范围。
y2y复制2行,d3d删除3行,2c3c删除6行并进入插入模式(等价于c6c),>5>右缩进5行等。使用行操作有时候可以在不使用行可视行模式的情况下,对多行进行批量操作。
- 总结操作符和动作语法公式
动词 + 名词
动词用来表示具体执行什么操作(比如删除,修改,复制等),名词用来限制该动词操作的范围。
# operator为动词,motion为名词 公式一: [数字] + operator + [数字] + motion 公式二: [数字] + operator + [数字] + operator
- 操作符(operator)结合文本对象(text-object)公式
核心:只要掌握了operator、motion和text-objects,就可以使用不同的operator和不同的motion或text-object进行组合使用,从而实现无尽的操作。# operator为动词,text-object为名词 [数字] + operator + [数字] + text-object
buffers和windows以及tabs
A buffer is the in-memory text of a file.
A window is a viewport on a buffer.
A tab page is a collection of windows.
buffers
- buffer(缓冲区):即为内存中的一块空间,用vim打开一个文件时,该文件的数据就与一个buffer绑定,用户在buffer中编辑文本。
- 命令模式下,查看当前缓冲区具体有哪些文件
:buffers :ls :files
- 不同buffer之前切换
:bnext # 切换到下一个buffer :bprevious # 切换到上一个buffer :buffer + n # n是buffer编号 :buffer + 文件名 # 切换到指定文件名的buffer :bdelete + 文件名/buffer编号 # 删除
ctrl-^ # 跳到先前编辑过的buffer
- 退出buffer/关闭vim
:xall # 保存并退出所有的buffer :wall # 保存所有buffer :wqall # 保存所有buffer并退出 :qall # 关闭所有buffer,但是不报存变更
windows
- window(窗口):一个窗口是在buffer上面的一个视口,一个buffer可以对应多个窗口。查看文档
:h window
- 命令模式下划分窗口
:sp # 水平分割 :vs # 垂直分割 :new # 创建新文件并打开
更多窗口内容请参考下文中多窗口编辑.
tabs
- tabs(选项卡):是窗口的集合,可将多个窗口收集(放在)一个tab中,从而在不同的tab中实现不同的窗口布局。在Vim中,打开tab不表示打开了一个文件;同样关闭tab也不代表关闭一个文件。文件的数据依然存储在内存的buffers中。
- 命令模式下窗口命令
:tabs # 查看tab数 :tabnew # 新建tab :tabclose # 关闭当前tab :tabnext # 切换至下一个tab :tabprevious # 切换至上一个tab :tablast # 切换到最后一个tab :tabfirst # 切换到第一个tab
- 普通模式下窗口命令
gt # 切换到下一个tab gT # 切换到上一个tab n + gt # 切换到编号n的窗口
- 终端命令行启动时创建多个窗口选项
-p
。 - tab的优点:将不同的窗口放到不同tab中,可以在不同的tab里面使用不同的窗口布局。比如第一个tab包含2个垂直窗口,第2个tab中为水平或垂直混合窗口布局。
模式切换技巧
Esc # 其他模式切换到普通模式
Ctrl+[ # 其他模式切换到普通模式
gi # 从其他模式快速跳转到最后一次编辑的地方并进入插入模式
- 插入模式下jk映射为esc,按下jk会从插入模式退回普通模式
# 在配置文件vimrc文件里面添加
inoremap jk <esc>
打开文件光标快速跳转到上一次编辑的位置:打开文件,之后按下gi