AcWing「Linux基础课」第 2 讲 Tmux 和 Vim

Tmux

Tmux 简介

全名:终端复用器,Terminal MultipleXer,一个会话可以开启多个终端。

功能:

  • 分屏,方便代码书写
  • 允许终端断开之后,继续运行 Tmux 中的进程,在 tmux 里打开的窗口关掉终端后再打开不会丢掉。

结构组成:一个 tmux 可以包含多个 session,一个 session 可以包含多个 window。一个 window 可以包含多个 pane(shell 窗口)

1
2
3
4
5
6
7
8
9
10
11
12
tmux:
session 0:
window 0:
pane 0
pane 1
pane 2
...
window 1
window 2
...
session 1
session 2

Tmux 命令

Ctrl + a 是修饰键 / 前缀键,默认是 Ctrl + b,可以在配置文件中自定义 vim ~/.tmux.conf

$\color{RoyalBlue}{除了以 Ctrl 和 tmux 开头的命令,其他无特殊说明所有命令执行前,先按修饰键。}$

启动 tmuxtmux,新建一个 session,其中包含一个 window,window 中包含一个 pane,可以把 pane 看作是一个 shell。

分屏操作:

  • 左右分屏:%
  • 上下分屏:"",双引号
  • 关闭当前分屏:Ctrl + d,如果当前 window 的所有 pane 均已关闭,则自动关闭 window;如果当前session 的所有 window 均已关闭,则自动关闭 session。
  • 切换分屏
    - 鼠标点击切换分屏
    - Ctrl + a 后,按方向键,可以选择相邻的 pane
  • 调整分屏分割线
    - 鼠标直接拖动分割线
    - Ctrl + a + 方向键
  • 全屏 / 取消全屏:z

session、window、pane 操作:

  • 挂起 session:d
  • 打开之前挂起的 session:tumx a
  • 查看并选择其他 session:s,按方向键查看其他 session 中的 window 及其下的 pane,回车选择切换到当前 window 下的 pane。
  • 创建 window:c,在当前 session 中创建一个 window
  • 查看并选择其他 window:w,和查看 session 一样,只不过查看 window 默认会打开 window 这一级菜单。
  • 翻阅当前 pane 的内容
    - 鼠标滚轮
    - 按 PageUp、PageDown,按 q 退出

从 tmux 中复制和黏贴文本

  • (不需要 Ctrl + a)按住 Shift 鼠标选中文本,然后 Ctrl + Insert 复制文本,Shift + Insert 粘贴文本
  • [ 然后鼠标选中要复制的文本,会自动复制到 tmux 的剪切板中,按 ] 将剪切板中的内容粘贴到光标处。

Vim

Vim 简介

功能:

  • vim 可以编辑在 Linux 上所有的文件
  • 可以根据文件扩展名自动识别变成语言,支持代码缩进、高亮等
  • 打开 / 新建一个文件:vim xxx.txt

VIm 下有三种模式:

  1. 一般命令模式:ESC,默认打开一个文件就是在一般命令模式下。
  2. 编辑模式:i,或者 I、A、a 等等
  3. 命令行模式:: / ? 三个字母中的任意一个可以进入命令行模式,通常是做一些 vim 配置、查找、替换、保存退出等。

Vim 命令

移动命令

  • 移动光标:h j k l 或者 方向键,左上下右,中间上下,两边左右
  • 行内移动:
    - 0:移动到开头
    - $:移动到末尾
    - n<space>:光标向后移动 n
  • 页内移动
    - G:移动到最后一行
    - gg:移动到第一行
    - :n 或者 nG:n 是数字,表示要跳到第几行
    - n<Enter>:光标向下跳 n 行
    - Ctrl + d 向下翻页,Ctrl + u 向上翻页
  • 单词间移动
    - w:跳转到下一个单词开头
    - e:跳转到下一个单词末尾
    - b:跳转到上一个单词开头
    - W、E、B 跳转时按空格来区分一个单词,w、e、b 按特殊符号来区分一个单词

查找和替换

查找

  • 全文查找
    • /word:查找光标之后值为 word 的字符串
    • ?word:查找光标之前值为 word 的字符串
    • n:查找下一个
    • N:查找上一个
  • 行内查找
    • f:从当前光标位置向后查找,比如要查找当前行的 > 位置,输入命令 f>
    • F:反向查找,从当前光标位置向前查找。

替换

  • 全文替换
    • :n1,n2s/word1/word2/g:将行号 n1 到 n2 之间所有的 word1 替换为 word2
    • :1,$s/word1/word2/g:将全文的 word1 替换为 word2
    • :1,$s/word1/word2/gc:将全文的 word1 替换为 word2,且在替换前选择是否替换
  • 替换字符
    • r 替换当前字符,R 进入替换模式,可以一直替换字符(相当于你打开了 Windows 的 Insert 键输入)。
  • 行内替换
    • :/s/word1/word2/g,将当前行的 word1 替换为 word2

文本操作

Vim 操作文件内容有一个原则:<operation> <motion> 操作 + 动作,==一个字母的命令是操作,结合其他命令(常跟表示操作范围的指令)可以打出组合拳。==

  • 选中文本:v,按 h j k l 或者方向键连续选中,按 两次 ESC 取消选中。
  • 选中一块文本:Ctrl + v,按按 h j k l 或者方向键连续选中,按 两次 ESC 取消选中。
  • 插入:
    • i 当前光标前插入,a 当前光标后插入,I 行首插入,A 行末插入,o 插入一行,O 在上面插入一行
  • 删除(==剪切,可以通过 p 粘贴)
    - d:表示删除动作,需要和其他命令结合才能真正删除,比如 dd 是删除一行,d3w 是删除三个词,d2h 删除左边两个字符。
    - D:从当前位置删除到末尾
    - x:删除当前字符
    - X:删除前一个字符
    - s:删除当前字符并进入编辑模式(可以理解为修改)
  • 复制:y
  • 修改:c,后面跟表示操作范围的指令,cw 修改从当前光标开始以后的一个单词,**ciw** 表示无论光标在当前单词的任何位置都可以先删除它然后进入插入模式进行修改,cf> 表示修改从当前位置一直到第一个 > 的位置。(记住 ciw 非常好用!!!)
  • 删除当前行:dd
  • 复制当前行:yy
  • 粘贴:p,如果复制的是一个字符串,就在当前光标位置粘贴;如果复制的是一行,就在下一行粘贴。p 是在后面粘贴、P 是在前面粘贴。
  • 撤销:u
  • 取消撤销:Ctrl + r
  • 缩进:
    - 将选中的多行向右缩进:>
    - 将选中的多行向左缩进:<
    - 将当行向右缩进:按两次 >
    - 将当行向左缩进:按两次 <
  • gg=G:将全文代码格式化,== 格式化当前行
  • ggdG:删除全文

文件操作

  • :w:保存
  • :w!: 强制保存
  • :q:退出
  • :q!:强制退出
  • :wq:保存退出

命令行操作:配置 Vim

  • :set nu:显示行号,一般写代码的时候开启,方便跳转
  • :set nonu:隐藏行号,在从 vim 中复制代码出去的时候,关掉行号,否则要把行号也复制进去。
  • :noh:取消高亮,在查找之后使用。
  • :set paste:设置成粘贴模式,取消代码自动缩进,原代码什么样粘贴就是什么样。
  • :set nopaste:取消粘贴模式,粘贴完代码后再开启代码自动缩进继续写代码。

宏录制:q + 字母 开始宏录制(如 q + a 表示将操作录制在 a 这个寄存器【常用:字母寄存器 a-z 或 A-Z】上),接下来进行你希望重复执行的操作,录制完成后按 q 结束录制,如何执行它呢?@ + 字母 即可,如果想重复执行多次,可以前面加一个 num,如 20@a 就是执行 @a 操作 20 次

异常处理:

  • 每次用 vim 编辑文件时,会自动创建一个 .filename.swap 的临时文件,保存后会自动消失
  • 如果打开某个文件时,该文件的swp文件已存在,则会报错。此时解决办法有两种:
    (1) 找到正在打开该文件的程序,并退出
    (2) 直接删掉该swp文件即可

其他:

  • . 可以重复执行刚才的命令
  • ==Ctlr + q==:当执行一个非常耗时的操作 vim 卡死的时候,可以取消当前正在执行的命令。

作业代码

homework_0

1
2
3
4
5
6
7
8
9
10
11
cd homework_0
touch names.txt
vim names.txt
i
AcWing
yxc
Bob
张强
李明
Alice
:wq

homework_1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cd homework_1
vim problem.txt

[1]
G
100<space> # 向后跳 100 下到达 101 个字符位置 / 或者 101<space>,到达第 102 个字符位置
x # 删除第 101 个位置 / X 向前删掉第 101 个字符

[2]
3G
7<space>
x

[3]
gg
29<space>
x

[4]
16G
54<space>
x

[5]
9G
79<space>
x

:wq

homework_2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cd homework_2
vim problem.txt

[1]
gg
/two<Enter>
ea # e 到达单词的末尾,a 在当前光标的下一个位置输入内容
<ESC>

[2]
n
i
def
<ESC>

[3]
n
d12<space>

[4]
n
dd

:wq

homework_3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd homework_2
vim problem.txt

[1]
:5,15s/of/OF/g<Enter>

[2]
:1,$s/the/THE/g<Enter>

[3]
:1,$s/is/IS/gc<Enter>
n y n y ...

:wq

homework_4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cd homework_2
vim problem.txt

[1]
11G
dd

[2]
G
p

[3]
5G
yy

[4]
G
p

:wq

homework_5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cd homework_5
vim problem.txt

[1]
11G
14<space>
v # 进入可视化模式,选择文本
h j k l 移动光标选中要删除的部分
d # 删除

[2]
G
$
p

[3]
5G
87<space>
h j k l 移动光标选中要删除的部分
y # 复制

[4]
G
$
p

:wq

homework_6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
cd homework_6
vim problem.txt

[1]
vim source0.cpp source1.cpp # 同时打开两个文件
# 现在在 source0.cpp 中
ggdG
:w # 切换前需要保存文件

[2]
:n # 切到 1.cpp

gg # 复制前三行
v
kk$
y

:N # 切到 0.cpp
p # 粘贴
:w

:n # 切到 1.cpp
12G # 复制 12-24 行
v
y
G$

:N # 切到 0.cpp
G
o<ESC> # 末尾新起一行
p # 粘贴
:wq

homework_7

1
2
3
4
5
cd homework_7
vim source.cpp

gg=G
:wq

homework_8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd homework_8
vim source.cpp

[1]
15G
v
21G
>
. # 重复上一次的组合命令,再缩进一次

[2]
22G
v
j
<

:wq

homework_9

1
2
3
4
5
cd homework_9
vim source.cpp

抄代码
:wq

image-20220330152037602.png

Author: tonngw
Link: https://tonngw.com/2022/03/30/AcWing/第 2 讲 Tmux 和 Vim/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.