Missing Semester Notes - Editor(Vim)

2020-05-15

讲讲Vim

原文链接:https://missing.csail.mit.edu/2020/editors/

Vim哲学

Vim是个模态编辑器。一般来说编辑器在使用时大部分时间是用于看,少部分时间才是操作文本,故设计成对应多个模式。Vim的设计让你的手可以不需要离开键盘,甚至不需要碰方向键因为那样太慢。最终使得你的输入效率可以达到你的思维速度。

模态编辑

  • 常规模式:看文件与编辑文件
  • 插入模式:插入新文本
  • 替换模式:顾名思义
  • 可视模式:(常规,行,块)用于按单位选择文本
  • 命令行模式:跑命令

同样的命令在不同的模式下有不同的意义。ESC用于从任何模式退回到正常模式。在正常模式中,用i进入插入模式,用R进入替换模式,用v进入可视模式,用V进入行可视模式,用C-v进入块可视模式,用:进入命令行模式。由于会频繁使用ESC键,可以考虑map到大小写键上方便敲击(尤其是某些按ESC很不方便的机器,没错说的就是你macbook)

基础

插入文本

进入插入模式,然后和其他编辑器一毛一样

缓冲区,分页和窗口

Vim会维护一个打开文件的集合,叫缓冲区们。一个Vim会话含有一些分页,每个分页含有一些窗口(分屏)。每个窗口展示一个缓冲区。不像其他的应用,这里的缓冲区和窗口不是一一对应的,窗口仅仅作为一个展示器。一个缓冲区可能被多个窗口打开,即使在同一个分页中。这是个十分便利的地方, 例如同时展示同一个文件中不同的部分。

Vim模式只启动一个分页,一个分页仅仅包含一个窗口。

命令行

当进入命令行模式后,光标会跳到底部的命令行。命令可以用于打开关闭保存退出种种。

  • :q 退出
  • :w 保存
  • :wq 保存退出
  • :e {name of file} 打开文件
  • :ls 显示缓冲区
  • :help {topic} 打开帮助,可以是按键或者命令

Vim界面是一种编程语言

这是理解Vim的一个重要观点。

移动

大部分时间都在常规模式下使用移动命令浏览缓冲区。移动在Vim中也叫“名词”,因为他们指向文本块。

  • 基础移动:hjkl 左下上右
  • 单词粒度:w下一词,b到词首,e到词尾
  • 行内粒度:0到行首,^到行内首个非空字符,$到行末
  • 屏幕粒度:H到屏顶,M到屏居中,L到屏底
  • 滚动:C-u向上,C-d向下
  • 文件粒度:gg文件首,G文件尾
  • 行号::行号<按回车>行号G行号gg
  • 迷:%
  • 行内查找(快速移动):ftFT+字符 f表示向右移动到字符上,大写表示反向。t则表示向右移动到字符前,大写表示反向。;表示重复上一次的命令,,表示反向重复上一次的命令。所有命令前均可加数字。
  • 搜索:/{regex},用n/N来选择导航结果

选择

视觉模式有三种:普通 行 块。可以用移动键来做选择。

编辑

所有你用鼠标熟悉的操作都可以用键盘的命令组合来实现。这正是Vim命令为何与编程语言相似之处。Vim编辑命令也叫动词,因为它们在名词之上进行操作。

  • i 进入插入模式
  • o or O 在下或上插入新行
  • d{motion} 删除{motion}
    • 例如dw删除词 d$删除到行末 d0删除到行首
  • c{motion} 可以看作是d{motion} 紧接着i
  • x 删除字符 等价于dl
  • s 替换字符 等价于xi
  • 视觉模式下操作
    • 选择文本后用dc
  • u 撤销 C-r 重做
  • y 拷贝(yank)
  • p 粘贴
  • 很多其他命令例如~可以反转大小写

计数

可以用来与名词或动词连用,表示同一个动作执行数次。

  • 3w 向前移动三行
  • 5j 向下移动5行
  • 7dw 删掉7个词

组合修改

用于改变名词的意义。i表示“内部inner”,a表示“周围around”

  • ci( 若当前在小括号内,整个括号内的内容作为c的对象
  • ci[ 同上,改为方括号
  • da' 删除一个单引号字符串

定制Vim

Vim是一个能够深度定制的编辑器,而且只要放到~/.vimrc就行了

扩展VIM

Vim有一大坨插件,从8.0开始就不需要插件管理器了(网上的老教程会让你装),因为有内置的插件管理系统。

只需要创建目录~/.vim/pack/vendor/start把插件扔进去。

这里只是简单的列出了一些插件,vim-awesome有很多好的插件

进阶

搜索与替换

:s 替换命令

  • %s/foo/bar/g 全局把foo替换成bar
  • %s/\[.*\](\(.*\))/\1/g 全局把md类型的链接改成普通链接

多窗口

  • :sp / :vsp 分屏

  • q{character} 录制并以{character}注册宏
  • q 停止录制
  • @{character} 执行宏
  • {number}@{character} 执行多次

其他的见原页面

Missing Semesternotes

Missing Semester Notes - Data Wrangling

Missing Semester Notes - Shell Tools and Scripting