vim学习笔记

vim学习笔记

Chandery Computer Vision

Vim简介

Vim是从vi发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。

Vim适用于纯文本的编辑(代码、markdown文件、LaTeX源码等)

优势:

  • 高效的移动
  • 高效的编辑
  • 高效的批量处理

“Edit Test at the Speed of Thought”

img

Vim基础知识和学习路线

强烈建议去b站看up bililbili@郁结YuJie关于vim的教程,做的非常的好!以下的总结是对其讲述内容的总结

Vim:思维导图

一、基础知识

Vim的操作有四种模式:

  1. Normal模式:默认进入的模式,也是最常用的模式
  2. Insert模式:插入模式,像正常的文本编辑器一样输入
  3. Command模式:命令模式,在底部输入命令,可以完成很多批量的功能
  4. Visual模式:可视模式,对文本进行选择

Normal模式:基础移动

  • hjkl:上下左右
  • gg:跳到第一行
  • G:跳到最后一行
  • <Ctrl-u>/<Ctrl-b>:往上翻半页/一页(Up / Backward)
  • <Ctrl-d>/<Ctrl-f>:往下翻半页/一页(Down / Forward)
  • {lineon}gg:跳到第 lineon
  • zz/zt/zb:光标行设置为 屏幕居中/屏幕第一行/屏幕最后一行 (Zone / Zone Top / Zone Button)

进入Insert模式

Normal模式下通过特定的命令进入Insert模式

  • i:当前光标之前开始插入(insert)
  • a:当前光标之后开始插入(append)
  • o:下方插入新的一行,然后开始输入
  • s:删除当前光标的字符,然后开始输入
  • I:在本行的开头开始输入
  • A:在本行的结尾开始输入
  • O:上方插入新的一行,开始输入
  • S:删除当前行,开始输入

进入Command模式

Normal模式下输入:进入Command模式

  • :w 保存当前文件
  • :q 退出
  • :q! 放弃当前更改,然后退出
  • :wq 保存当前更改,然后退出
  • h {command} 显示关于命令的帮助
  • <Esc> 回到Normal模式

进入 Visual 模式

Normal 模式下按v进入可视模式
进入可视模式后可以用 Normal 模式下的移动命令选择文本

  • 可视模式下x/y:剪切/复制;回到 Normal 模式下p:粘贴
  • Normal 模式下按<V>进入行可视模式,一次选中一整行,在需要选中多行时很方便
  • <Esc>回到 Normal 模式

二、移动和编辑

简单的hjkl无法实现快速的移动,因此我们需要一些更加高效的移动

基于单词的移动

  • w:word,跳转到下一处单词的开头
  • b:back,跳转到上一处单词的开头
  • e:end,跳转到下一处单词的结尾
  • gee的反向版本,跳转到上一处单词的结尾

wbe大写版本WBE对应的单词是连续的非空字符

image-20241010213047227

基于搜索的移动

行内搜索:
  • f<char>/t<char>:跳转到本行下一个 char字符出现处/前
  • ;/,:快速向后/向前重复 ft 查找
  • F<char>/T<char>:跳转到本行上一个 char字符出现处/前(向前搜索)
文件中搜索:
  • /<pattern>:跳转到本文件中下一个 pattern出现的地方
  • ?<pattern>:跳转到本文件中上一个 pattern出现的地方
  • pattern可以是正则表达式
  • *:跳转到本文件中下一个和当前光标下的单词相同的单词处
  • nN:快速重复 /查找 (n:正向找,m:反向找)

基于标记的移动

  • m{mark}:把当前位置标记为 mark
  • '{mark}:跳转到名为 mark的标记位置

marka~z的字符

内置标记:

  • '':回到上次跳转前的位置
  • '.:回到上次修改的位置
  • '^:回到上次插入的位置

记住一个就可以 mm,方便按,然后修改完别的地方按 ''即可回到标记处

一些实用的跳转

  • ^/$:跳转到本行的开始/结尾(分别对应shift+6和4,其中6是开始,4是结尾,和按的时候是反过来
  • %:跳到匹配的配对符(括号,大括号等)处

简单的公式:Operation+Motion=Action

{operation}{motion}:一次编辑操作

常见的:

  • c:代表”change”,删除内容并进入插入模式
  • d:代表”delete”,删除
  • y:代表”yank”,复制
  • v:代表”visual”,选中文本,进入可视模式

例如:

  • dgg:从当前位置删除到第一行
  • ye:复制到单词结尾
  • d$:删除到行结尾
  • dt;:删除当前位置到分号之前的内容

“操作符+移动”是很重要的操作逻辑,类似鼠标拖动之后操作

大部分操作符连续按两次(cc/yy/dd):将其作用在一行上

例如 dd:删除一行

重复操作

  • .:重复上次的操作
  • u:撤回 (相当于ctrl+z)
  • <Ctrl-r>:重做 (相当于ctrl+y)

.省去了重复输入命令,大大提高效率

批量操作:数字+动作

{count}{action}:重复 countaction操作

比如移动,编辑

  • 4j:向下移动四行
  • 3dw:向后删除三个单词
  • 2yy:复制两行
  • 4p:粘贴4次

.操作可以直观地看到每一次的变化,在合适的时候停下来

数字+动作则需要预先知道动作的次数

技巧:使用相对行号确定移动范围

:set relativenumber:开启相对行号

:set norelativenumber:关闭相对行号

总结

[count]{operator}{motion} 操作逻辑

三、文本对象操作

介绍 {operator}{textobjects}操作逻辑

{textobjects}:语义化的文本片段

常见的对象:

  • w/Wsp:单词、句子、段落
  • (/),[/],{/},</>,'/":配对符定义的对象

i表示inner;a代表append,额外包括周围的空格或者配对符

image-20241011213652454

文本对象提供了为文本赋予了结构化的含义,因此可以以一个语义对象作为操作单元

[count]{operator}{textobjects}

  • diw:删除一个单词
  • ci(:修改小括号内部
  • yi{:复制大括号内部

textobjects VS motion

{operator}{motion}{operator}{textobjects}

解耦了操作与操作的对象,大大提升了操作的效率

  • motion是能够移动光标的指令,可以独立使用(如wbe
  • 文本对象只能跟在 operator后面,不能独立使用(如iw
  • motion通过光标的移动确定 operator的作用范围,范围更加灵活但是不够明确
  • textobjects则是显示地指定操作的对象,范围明确

一些操作符的补充

  • gu/gU/g~:操作符(因此后面要接textobjects或者motion),转小写/转大写/翻转大小写
  • J:join,连接两行
  • </>:左右缩进(连按两下可以本行缩进)

建议:让你的命令更加模块化

尽量让你的命令更加模块化,具有清晰的含义和作用范围,以便于与 .等命令协同

例如:dawdw具有更加清楚的语义,也更模块化

练习技巧:用 v先可视化修改的范围

一开始不熟练,可能不确定 motiontextobjects具体覆盖了哪部分文本,可以先用 v{motion}/v{textobjects}将其选中,再执行 c/d/y等操作

但是熟练后,尽可能直接使用完整的命令继续宁操作,因为相比于 viwddiw更加模块化,也更容易进行重复操作

  • Title: vim学习笔记
  • Author: Chandery
  • Created at : 2024-10-10 02:24:52
  • Updated at : 2024-12-11 10:43:51
  • Link: https://chandery.chat/2024/10/10/vim学习笔记/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments