---
title: vim学习手记(2)
date: 2019-03-30 20:45:01
tags: 
  - linux
  - vim
categories: 
  - linux
---

## 修改 查找 替换

### 大小写的转换
+ `~` - 转换当前光标所在的字符( 如果是小写就转为大写, 反之转为小写, 下同 )
+ `g~w` - 当前光标之后的一个单词转换大小写
<!-- more -->
这里同样是 操作+动作 的组合方式
比如`g~$`就是对当前位置到行尾进行大小写转换

`~`表示的是小写转大写, 大写转小写
如果要全部转大写, 就是`U`, 全部转小写, 就是`u`
比如`gU$`就表示从当前位置到行尾全部转大写
`gu$`就表示从当前位置到行尾全部转小写


> 按下`.`就是重复上一个修改操作
比如上一个操作是执行了**g~w**, 按下`.`就是再次执行转换单词的大小写

### 查找

`/{string}`是用于查找指定字符串
如果设置了**ignorecase** , 查找时会忽略大小写
如果设置了**hlsearch**, 会同时高亮所有匹配的位置

之后按`Enter`再按`n`, 就可以将光标切换到下一个匹配的位置
`N`是切换到上一个匹配的位置

![查找](/images/linux/vim-search.png)

### 替换(substitute)
替换需要使用命令模式执行, 也就是先输入`:`
格式统一为`[range]s/from/to/[flags]`

range是搜索范围
+ `1,10` - 表示1到10行
+ `10` - 只有第10行
+ `%` - 所有整篇文档
+ `10,$` - 从第10行到文档末尾

flags是替换方式的标识
+ `c` confirm 每次替换都询问
+ `e` error 不显示错误
+ `g` global 在当前指定的范围内全局替换
+ `i` ignore case 忽略大小写

例如
+ **s/str1/str2/g** - 将当前行中的str1替换为str2
+ **%s/str1/str2/g** - 将整篇文档所有的str1替换为str2

> **from**的位置是可以使用正则表达式的
与通用的正则元字符基本相同, 但是大部分要加`\`转义
比如`\d+`在通用的正则结构当中表示匹配至少1个的数字
在vim当中要写作`\d\+`
除了[]不需要, `\d\+`同样可以写作`[0-9]\+`

## 缓冲区
缓冲区是vim进行多文件编辑的一个基础功能

所有的文本编辑器在对文件进行编辑的时候, 都是先把文件的内容读到内存当中
只有在进行修改后保存时才写入到磁盘
缓冲区中的就是此时读取到内存的文件

我们可以使用vim命令同时打开多个文件
比如`vim buf-*.txt`或者是`vim buf-1.txt buf-2.txt buf-3.txt`

此时主界面显示出的是其中的第一个文件
执行`:ls`或者`:buffers`或者`:files`可以查看缓冲区当中的文件
![缓冲区](/images/linux/buffers.png)

其中的 **%a** 是缓冲区的标记
有以下几种
+ `a` - 激活的 ( active )
+ `h` - 隐藏的 ( hidden )
+ `%` - 当前
+ `#` - 交换
+ `=` - 只读
+ `+` - 已经更改的
+ `-` - 不可更改的

其中交换代表的意思就是当前缓冲区的上一个
比如从第二个切换到了第三个, 那么当前的是第三个, 交换是第二个

### 缓冲区切换

+ `:bp` - 上一个 ( buffer previous )
+ `:bn` - 上一个 ( buffer next )
+ `:bf` - 第一个 ( buffer first )
+ `:bl` - 最后一个 ( buffer last )
+ `:b {序号}/{文件名}` - 切换到指定缓冲区
+ `:ball` - 同时激活所有缓冲区
+ `:b#` - 切换到交换缓冲区

### 缓冲区列表操作

添加文件到缓冲区 ( buffer add )
`:badd {文件名}`
( 这个文件不是必须存在, 不存在的话相当于创建新文件 )

删除缓冲区中的文件 ( buffer delete )
`:bd {序号}/{文件名}`

+ `:qall` - 退出全部缓冲区
+ `:wall` - 写入全部缓冲区
+ `:bufdo {命令}` - 对所有缓冲区执行该命令, 比如 **:bufdo set number**
( 所以退出全部缓冲区也可以写`:bufdo q` )

## 分屏
只有缓冲区的操作, 毕竟一次只能看到一个文件
vim还提供了分屏的支持
使用参数`-O/o` ,分别代表竖直分屏和水平分屏
```
vim -O buf-1.txt buf-2.txt
```
![竖直分屏](/images/linux/竖直分屏.png)

### 添加分屏

+ `:sp` - 添加水平分屏
+ `:vsp` - 添加竖直分屏
![添加分屏](/images/linux/添加分屏.png)

此时分屏出来的窗口当中打开的还是同一个缓冲区
之后可以通过**缓冲区切换**来打开不同的缓冲区

### 焦点切换
`ctrl+w h` 跳转到左边的窗口
`ctrl+w j` 跳转到下面的窗口
`ctrl+w k` 跳转到上面的窗口
`ctrl+w l` 跳转到右边的窗口

`ctrl+w t` 跳转到最顶上的窗口
`ctrl+w b` 跳转到最底下的窗口

### 调整大小

高度调整
`ctrl+w {数字}+` 增大当前窗口的高度(行数), 默认是1
`ctrl+w {数字}-` 减小当前窗口的高度(行数), 默认是1

宽度调整
`ctrl+w {数字}>` 增大当前窗口的宽度(列数), 默认是1
`ctrl+w {数字}<` 减小当前窗口的宽度(列数), 默认是1