当前位置: 首页 > 工具软件 > Neovim > 使用案例 >

VIM(Neovim)基本概念与高效使用方法

翟学文
2023-12-01

操作符和动作

  • Vim两个基本概念:操作符operator和动作motionoperator看作动词,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
    
  • operatormotion结合实现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为动词,text-object为名词
    [数字] + operator + [数字] + text-object
    
    核心:只要掌握了operator、motion和text-objects,就可以使用不同的operator和不同的motion或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

 类似资料: