forked from study-area-cn/study-area-cn.old
main #1
|
@ -14,6 +14,7 @@ additional-css = [
|
||||||
"theme/css/font.css",
|
"theme/css/font.css",
|
||||||
"theme/font/icons.woff2",
|
"theme/font/icons.woff2",
|
||||||
"theme/font/noto.otf",
|
"theme/font/noto.otf",
|
||||||
|
"theme/font/sourcecodepro.woff2",
|
||||||
]
|
]
|
||||||
additional-js = [
|
additional-js = [
|
||||||
"theme/js/mdui.global.js",
|
"theme/js/mdui.global.js",
|
||||||
|
|
|
@ -41,10 +41,11 @@
|
||||||
- [在 VirtualBox 上创建虚拟磁盘](./learn_linux_basic/file_and_path/diskpart_and_filesystem/create_disk_on_vbox.md)
|
- [在 VirtualBox 上创建虚拟磁盘](./learn_linux_basic/file_and_path/diskpart_and_filesystem/create_disk_on_vbox.md)
|
||||||
- [tar打包软件](./learn_linux_basic/file_and_path/tar_command.md)
|
- [tar打包软件](./learn_linux_basic/file_and_path/tar_command.md)
|
||||||
- [gzip与xz](./learn_linux_basic/file_and_path/gzip_and_xz.md)
|
- [gzip与xz](./learn_linux_basic/file_and_path/gzip_and_xz.md)
|
||||||
- [备份]()
|
- [备份](./learn_linux_basic/file_and_path/backup.md)
|
||||||
- [Shell与Shell Script]()
|
- [Shell与Shell Script](./learn_linux_basic/shell_and_shell_script/shell_and_shell_script.md)
|
||||||
- [学习Shell]()
|
- [学习Shell](./learn_linux_basic/shell_and_shell_script/learn_shell.md)
|
||||||
- [Vim编辑器]()
|
- [Job]()
|
||||||
|
- [Vim编辑器](./learn_linux_basic/shell_and_shell_script/vim_editor.md)
|
||||||
- [Shell Script基本语法]()
|
- [Shell Script基本语法]()
|
||||||
- [条件判断语句]()
|
- [条件判断语句]()
|
||||||
- [循环]()
|
- [循环]()
|
||||||
|
@ -56,7 +57,6 @@
|
||||||
- [程序、线程和进程]()
|
- [程序、线程和进程]()
|
||||||
- [什么是程序]()
|
- [什么是程序]()
|
||||||
- [线程和进程]()
|
- [线程和进程]()
|
||||||
- [Job]()
|
|
||||||
- [进程与线程的管理]()
|
- [进程与线程的管理]()
|
||||||
- [特殊的进程和文件]()
|
- [特殊的进程和文件]()
|
||||||
- [SELinux]()
|
- [SELinux]()
|
||||||
|
|
|
@ -1,11 +1,27 @@
|
||||||
# 约定
|
# 约定
|
||||||
|
|
||||||
本文中如有转载文章,均已与原站取得授权,如有疑问请联系 “<rarmicrozip@outlook.com>”
|
## 内容
|
||||||
|
|
||||||
本站对一些文章进行了适当的修改和删减,以适合当下的环境。
|
|
||||||
|
|
||||||
章节之间可能会出现「笔者」的部分类似于配置的信息不一致的问题,这是因为「笔者」不是一个人,而是指代整个贡献这列表中的所有直接编辑过本书的人,所以会出现该问题,敬请谅解。
|
章节之间可能会出现「笔者」的部分类似于配置的信息不一致的问题,这是因为「笔者」不是一个人,而是指代整个贡献这列表中的所有直接编辑过本书的人,所以会出现该问题,敬请谅解。
|
||||||
|
|
||||||
|
在本教程中,快捷键使用以下格式表示:
|
||||||
|
`Ctrl`键使用`^`(如 `^C`)或者`C`表示,`Alt`键使用`M`表示,`Super`(即`Windows`键)使用`S`表示。
|
||||||
|
它们的排列顺序是这样的:`C-M-S-<Other Key>`。
|
||||||
|
|
||||||
|
你可能会看到这种内容:`<Esc>:q!<Enter>`,其中 `<按键名>` 表示按下对应的按键(包括上面的快捷键)。
|
||||||
|
|
||||||
|
例如上面的内容,就表示:
|
||||||
|
|
||||||
|
1. 按一下键盘上的 `[Esc]`
|
||||||
|
2. 输入 `:q!`
|
||||||
|
3. 再按一下 `[Enter]`
|
||||||
|
|
||||||
|
## 授权
|
||||||
|
|
||||||
|
本文中如有转载文章,均已与原站取得授权,如有疑问请联系 “<rarmicrozip@outlook.com>”
|
||||||
|
|
||||||
且转载文章会在末尾处注明作者与出处。
|
且转载文章会在末尾处注明作者与出处。
|
||||||
|
|
||||||
|
本站对一些文章进行了适当的修改和删减,以适合当下的环境。
|
||||||
|
|
||||||
本站原创文章若无特别说明均在 [MIT](./licenses/LICENSE-MIT.md) 与 [Apache2](./licenses/LICENSE-APACHE.md) 的双重许可下发布,转载请遵守相关规定。
|
本站原创文章若无特别说明均在 [MIT](./licenses/LICENSE-MIT.md) 与 [Apache2](./licenses/LICENSE-APACHE.md) 的双重许可下发布,转载请遵守相关规定。
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
# 备份
|
||||||
|
|
||||||
|
## 概念
|
||||||
|
|
||||||
|
备份是计算机使用中非常重要的操作。原则上来说,进行任何重大修改(比如更新系统、更新生产环境中的软件。)之前都需要备份。
|
||||||
|
|
||||||
|
按照备份的范围来分,常用的备份方式有以下几种:
|
||||||
|
|
||||||
|
- 全量备份:指把硬盘等存储介质中的所有文件**一次性完整复制**到其他介质上。
|
||||||
|
- 增量备份:对上一次备份后的数据后修改的数据进行备份。
|
||||||
|
- 差异备份:在完整备份之后,修改备份中与当前数据有差别的数据。
|
||||||
|
- 选择性备份:仅对系统中的一部分进行备份。
|
||||||
|
|
||||||
|
按照备份的时间来分,常用的备份方式分为以下两种:
|
||||||
|
|
||||||
|
- 计划性备份:比如一周一备份、一天一备份等。
|
||||||
|
- 操作前备份:在重大操作前备份,以便在操作后出现问题时可以快速回滚,减少损失。
|
||||||
|
|
||||||
|
> 有的人可能会说:“我们自己用电脑,备份有什么意义呢?” 2017年,勒索病毒WannaCry的肆虐,为我们敲响了警钟。这个病毒用AES加密用户电脑上的所有文件,以勒索钱财。没有人知道,下一个被勒索的,究竟是不是自己,我们只能通过备份将损失降到最低。
|
||||||
|
|
||||||
|
## 备份软件
|
||||||
|
|
||||||
|
Linux下,常用的备份工具有以下几种:
|
||||||
|
|
||||||
|
- dd:直接克隆整个分区。
|
||||||
|
- tar:将需要备份的文件打包压缩。
|
||||||
|
- rsync:可以进行增量备份、全量备份以及可以将备份传输到远程。
|
||||||
|
|
||||||
|
### `dd`命令
|
||||||
|
|
||||||
|
> 这个小节的内容,了解即可。
|
||||||
|
|
||||||
|
备份整块`sda`硬盘到`sdb`只需要以下命令。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dd if=/dev/sda of=/dev/sda
|
||||||
|
```
|
||||||
|
|
||||||
|
> 注意!这里的sdb物理容量必须大于sda!并且sdb上所有的文件都会被覆盖!**无法找回!**
|
||||||
|
|
||||||
|
### `tar`命令
|
||||||
|
|
||||||
|
Linux中,可以直接使用`tar`打包需要的文件,比如备份`/etc`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /
|
||||||
|
sudo tar -zcvf etc_backup.gz etc
|
||||||
|
```
|
||||||
|
|
||||||
|
## `rsync`命令
|
||||||
|
|
||||||
|
在之前的章节中,我们创建了一个新的虚拟磁盘。现在,让我们挂载它到`/mnt/backup`进行备份。
|
||||||
|
|
||||||
|
> 如果你完成了之前的课后作业,那么sdb上应该有唯一的一个xfs分区占满了整个磁盘。如果你已经持久挂载了磁盘,本步骤可以跳过。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo mkdir /mnt/backup
|
||||||
|
sudo mount /dev/sdb1 /mnt/backup
|
||||||
|
sudo mkdir /mnt/backup/etc
|
||||||
|
```
|
||||||
|
|
||||||
|
现在,我们使用`rsync`命令,将虚拟磁盘中的文件复制到新的虚拟磁盘上。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo rsync -avz /etc /mnt/backup/etc
|
||||||
|
```
|
||||||
|
|
||||||
|
`rsync`命令的参数如下:
|
||||||
|
|
||||||
|
- `-a`:递归模式,表示以递归方式传输文件,并保持所有文件属性。
|
||||||
|
- `-v`:显示详细输出。
|
||||||
|
- `-z`:压缩传输的数据。
|
||||||
|
- `/etc`:源文件。
|
||||||
|
- `/mnt/backup/etc`:目标文件。
|
||||||
|
|
||||||
|
`rsync`命令会自动判断源文件和目标文件是否相同,如果相同,则不会进行复制。如果不同,则会复制不同的文件。
|
||||||
|
|
||||||
|
> `rsync`命令是一个非常强大的命令,它不仅可以进行文件复制,还可以联网进行文件的同步、文件的删除等操作。如果你需要备份大量的文件,那么`rsync`命令是一个非常好的选择。
|
||||||
|
|
|
@ -455,10 +455,10 @@ losetup -d [设备文件]
|
||||||
|
|
||||||
## 课后作业
|
## 课后作业
|
||||||
|
|
||||||
由于本节课非常长并且十分重要,所以设置了以下作业:
|
由于这章长且十分重要,所以设置以下作业:
|
||||||
|
|
||||||
1. 在虚拟机中创建一个虚拟磁盘,大小大于等于系统磁盘
|
1. 在虚拟机中创建一个虚拟磁盘,大小大于等于系统磁盘
|
||||||
2. 给这个磁盘初始化分区表并且创建一个 xfs 分区,填满整个磁盘
|
2. 给这个磁盘初始化分区表并且创建一个 xfs 分区,分区大小为整个磁盘的容量。
|
||||||
3. 尝试把这个磁盘挂载到 `/mnt/test`
|
3. 尝试把这个磁盘挂载到 `/mnt/test`
|
||||||
4. 使用 dd 命令从 `/dev/zero` 读取,写入大小为 20MB 的空文件到 `/mnt/test/hello.img`
|
4. 使用 dd 命令从 `/dev/zero` 读取,写入大小为 20MB 的空文件到 `/mnt/test/hello.img`
|
||||||
5. 卸载这个磁盘
|
5. 卸载这个磁盘
|
||||||
|
|
|
@ -5,10 +5,6 @@
|
||||||
其实,Linux 的很多逻辑以及文件的组织结构都是与 Windows 大不相同的,接下来,我们就一起了解一下。
|
其实,Linux 的很多逻辑以及文件的组织结构都是与 Windows 大不相同的,接下来,我们就一起了解一下。
|
||||||
|
|
||||||
> 注意,以下操作,若无特殊说明,输入命令均在终端(Terminal)下操作,可以按下 C-M-T 呼出。
|
> 注意,以下操作,若无特殊说明,输入命令均在终端(Terminal)下操作,可以按下 C-M-T 呼出。
|
||||||
---
|
|
||||||
> 本文中,快捷键使用以下格式表示:
|
|
||||||
> `Ctrl`键使用`^`或者`C`表示,`Alt`键使用`M`表示,`Super`(即`Windows`键)使用`S`表示。
|
|
||||||
> 它们的排列顺序是这样的:`C-M-S-<Other Key>`
|
|
||||||
|
|
||||||
## Linux 路径的格式
|
## Linux 路径的格式
|
||||||
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
Binary file not shown.
After Width: | Height: | Size: 102 KiB |
|
@ -0,0 +1,179 @@
|
||||||
|
# 学习 Shell。
|
||||||
|
|
||||||
|
## 概念
|
||||||
|
|
||||||
|
Shell(也称为壳)在计算机中指“为用户提供用户界面”的软件,通常指的是命令行界面的解析器。一般来说,这个词是指操作系统中提供访问内核所提供之服务的程序。Shell也用于泛指所有为用户提供操作界面的程序,也就是程序和用户交互的层面。因此与之相对的是内核(英语:Kernel),内核不提供和用户的交互功能。[1]
|
||||||
|
|
||||||
|
但是,在 Linux 中,我们通常所讲的 Shell 是指命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序来实现自动化的功能。
|
||||||
|
|
||||||
|
Shell 也指代一种命令语言,由这种语言编写的脚本称为 Shell Script。
|
||||||
|
|
||||||
|
Shell 命令语言的标准为参考 AT&T 的 ksh 和 GNU 计划的 Bourne Again Shell (bash) 制定的 The Open Group Base Specifications Issue 6 中的 [2.Shell Command Language](https://pubs.opengroup.org/onlinepubs/9690949599/utilities/xcu_chap02.html)。
|
||||||
|
|
||||||
|
本章我们将学习 Shell 的基本使用。
|
||||||
|
|
||||||
|
## 快捷键
|
||||||
|
|
||||||
|
Shell 也有快捷键?是的。大多数 Shell 都支持以下的快捷键:
|
||||||
|
|
||||||
|
- `C-C`:终止当前进程。
|
||||||
|
- `C-Z`:暂停当前进程。
|
||||||
|
- `C-D`:退出当前Shell(实际上是发送一个 `EOF` 文件结束字符)。
|
||||||
|
- `C-L`:清屏。
|
||||||
|
|
||||||
|
> 其中 `C-C` 和 `C-D` 是十分重要的两个快捷键,十分常用。
|
||||||
|
|
||||||
|
在 Bash 中,还有一些特殊的快捷键,它们继承自 GNU Emacs 编辑器,用于快速移动光标以及编辑文本:
|
||||||
|
|
||||||
|
- `C-A`:移动光标到行首。
|
||||||
|
- `C-E`:移动光标到行尾。
|
||||||
|
- `C-B`:向左移动光标。
|
||||||
|
- `C-F`:向右移动光标。
|
||||||
|
- `C-K`:删除从光标位置到行尾的文本。
|
||||||
|
- `C-U`:删除从光标位置到行首的文本。
|
||||||
|
- `C-W`:删除光标左侧的单词。
|
||||||
|
- `C-Y`:粘贴之前删除的文本。
|
||||||
|
|
||||||
|
> 这部分只需要了解即可
|
||||||
|
|
||||||
|
## 命令
|
||||||
|
|
||||||
|
命令分为内部命令和外部命令,内部命令是 Shell 自带的命令,外部命令是 Shell 外部的可执行程序。
|
||||||
|
|
||||||
|
一条 Shell 的指令的标准格式为:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
command [options] [arguments]
|
||||||
|
```
|
||||||
|
|
||||||
|
其中,`command` 是命令的名称,`options` 是命令的选项,`arguments` 是命令的参数。
|
||||||
|
|
||||||
|
它的格式不一定必须遵守,但是通常遵守这个格式会带来更好的可读性(用什么工具采用什么方式对什么文件做什么)。
|
||||||
|
|
||||||
|
但是,有一个例外,就是指定输出,这时,我们推荐將指定输出的选项以及参数放在文件明后面。
|
||||||
|
|
||||||
|
例如,`ls` 命令用于列出当前目录下的文件和文件夹,它的选项可以是 `-l`、`-a` 等,参数可以是文件名或目录名。
|
||||||
|
|
||||||
|
## 变量
|
||||||
|
|
||||||
|
Shell 中的变量分为环境变量和用户变量,环境变量是Shell启动时自动设置的变量,用户变量是用户自定义的变量。
|
||||||
|
|
||||||
|
用户变量可以通过 `export` 命令设置为临时环境变量,例如:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export GREET="Hello, World!"
|
||||||
|
```
|
||||||
|
|
||||||
|
然后我们在这个 Shell 里启动一个新的 Shell,仍然可以在环境中找到这个变量。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash -c 'echo $GREET'
|
||||||
|
```
|
||||||
|
|
||||||
|
> `export` 声明的变量只在当前环境下有效,如果你开启了个新的终端或者重启,那么这个环境就无效了
|
||||||
|
|
||||||
|
用户变量可以通过 `declare` 命令声明,例如:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
declare USER_GREET="Hello, Shell"
|
||||||
|
```
|
||||||
|
|
||||||
|
变量可以通过 `${}` 或 `$` 符号来引用,例如:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo ${GREET}
|
||||||
|
echo $USER_GREET
|
||||||
|
```
|
||||||
|
|
||||||
|
> 当变量的前后有别的内容紧挨着,那么只能使用 `${}`。
|
||||||
|
|
||||||
|
## 特殊的环境变量
|
||||||
|
|
||||||
|
Shell 中有一些特殊的环境变量,它们在 Shell 启动时自动设置,例如:
|
||||||
|
|
||||||
|
- `$HOME`:当前用户的主目录。
|
||||||
|
- `$PATH`:可执行文件的搜索路径。
|
||||||
|
- `$SHELL`:当前Shell的名称。
|
||||||
|
- `$PWD`:当前工作目录。
|
||||||
|
- `$USER`:当前用户的用户名。
|
||||||
|
|
||||||
|
其中最重要也是最常用的就是 PATH,它决定了Shell在执行命令时搜索可执行文件的路径。当我们发现明明安装了某个软件但是找不到可执行文件的时候应该首先检查 PATH 的设置。如果你熟悉 Windows,你会发现 Windows 的 PATH 是一串由分号分隔的路径。而 Linux 下的路径使用的是 `:` 冒号分隔。
|
||||||
|
|
||||||
|
> 在 Windows 中的 PATH 中有一条路径是 `.` 就是当前目录,而 Linux 中默认是不会搜索当前目录的。如果你在当前目录有一个 `run.sh`,那么你必须要使用 `./run.sh` 才能执行。
|
||||||
|
|
||||||
|
## 管道
|
||||||
|
|
||||||
|
Shell 中的管道是链接两个命令的方式,管道遵守下面的格式。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
command1 | command2
|
||||||
|
```
|
||||||
|
|
||||||
|
`command1` 的输出将会作为 `command2` 的输入提供,例如:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -a | grep "test"
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令将会列出当前目录下的所有文件,然后使用 `grep` 命令过滤出文件名包含"test"的文件。
|
||||||
|
|
||||||
|
## 输出重定向
|
||||||
|
|
||||||
|
Shell 中的重定向是改变命令的输出地点的方式,重定向遵守下面的格式。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
command > file
|
||||||
|
```
|
||||||
|
|
||||||
|
`command` 的输出将会被重定向到 `file` 中,例如:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -a > files.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令将会列出当前目录下的所有文件,然后使用 `>` 符号将输出重定向到 `files.txt` 中。
|
||||||
|
|
||||||
|
## 输入重定向
|
||||||
|
|
||||||
|
Shell 中的输入重定向是改变命令的输入地点的方式,输入重定向遵守下面的格式。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
command < file
|
||||||
|
```
|
||||||
|
|
||||||
|
`command` 的输入将会被重定向到 `file` 中,例如:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat < files.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令将会读取 `files.txt` 中的内容,然后使用 `cat` 命令输出到标准输出中。
|
||||||
|
|
||||||
|
## 将命令的输出作为参数
|
||||||
|
|
||||||
|
让我们想像这个场景:有一个文件有一个文件名列表,我们想要获取这些文件的详细信息,这怎么实现呢?
|
||||||
|
|
||||||
|
运算符 `$()` 可以将命令的输出作为参数,它的标准格式如下:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
command1 $(command2)
|
||||||
|
```
|
||||||
|
|
||||||
|
`command2` 的输出将会作为 `command1` 的参数。
|
||||||
|
|
||||||
|
实现前文的场景所需的命令如下:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -l $(cat files.txt)
|
||||||
|
```
|
||||||
|
|
||||||
|
这个命令将会读取 `files.txt` 中的文件名列表,然后使用 `ls -l` 命令获取这些文件的详细信息。
|
||||||
|
|
||||||
|
## 课后作业
|
||||||
|
|
||||||
|
1. 使用 Shell 的输出重定向功能,在主目录中创建一个保存了主目录中所有文件列表的文件,命名为 `files.txt`
|
||||||
|
2. 使用 `cat` 读取所有文件的内容。
|
||||||
|
|
||||||
|
## 参考
|
||||||
|
|
||||||
|
- [Shell - 维基百科,自由的百科全书](https://zh.wikipedia.org/wiki/Shell)
|
|
@ -0,0 +1 @@
|
||||||
|
# Shell 与 Shell Script
|
|
@ -0,0 +1,198 @@
|
||||||
|
# Vim 编辑器
|
||||||
|
|
||||||
|
> 在 Vim 中所有的键位注意区分大小写,所有大写的命令都需要按下 `Shift` 键,例如 `V` 表示为 `S-v`
|
||||||
|
|
||||||
|
不知道你有没有听说过 Bram 发明的 Vim 编辑器,有这么一个梗,就是:
|
||||||
|
|
||||||
|
> 如何产生一串随机字符串?答:让新手退出 Vim。
|
||||||
|
|
||||||
|
你应该能看出 Vim 的操作是多么“反人类”了吧。事实上,在 Vim 发明的时候,电脑上还没有鼠标,所有的操作只能靠命令完成的(可以想一想 tty)。所以,Vim 的设计理念就是让用户通过键盘完成所有的操作。
|
||||||
|
|
||||||
|
但是,我们如果要通过终端远程管理一台 Linux 服务器,那么必须使用像 Vim 这样的终端编辑器。Vim 的功能比前文的 Nano 强大许多,如果你熟悉了 Vim,那么你的速度可能远远超过那些使用其它编辑器的人。
|
||||||
|
|
||||||
|
> Vim 的前身是 Vi,本文的绝大部分命令同样适用于 Vi。几乎所有的 Linux 发行版都自带 Vi 或是 Vim 其中之一,不用担心是否安装了 Vim。其实 Windows 上也可以安装 Vim。
|
||||||
|
>
|
||||||
|
> 如果你在 Vim 中困住了,只需要按下 `<Esc>:q!<Enter>` 就可以退出 Vim 了
|
||||||
|
|
||||||
|
## 启动 Vim
|
||||||
|
|
||||||
|
Vim 的启动十分简单,只需要在终端输入 `vim` 即可。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
vim [文件名]
|
||||||
|
```
|
||||||
|
|
||||||
|
文件名是可选的。如果文件存在,Vim 就会打开这个文件;如果文件不存在,Vim 就会创建这个文件。
|
||||||
|
|
||||||
|
然后你会看到如下界面:
|
||||||
|
|
||||||
|
![Vim](./assets/2.3.2.1.png)
|
||||||
|
|
||||||
|
## Vim 的使用
|
||||||
|
|
||||||
|
首先,我们进入 Vim,会发现我们并不能像 Nano 一样直接打字。这是因为 Vim 默认处于“命令模式”,我们需要按下对应的按键可以进入到不同的模式。记住:无论在任何时候,按下 `Esc` 键都可以回到命令模式。
|
||||||
|
|
||||||
|
下面是一张 Vim 的键位图:
|
||||||
|
|
||||||
|
![Vim Keymap](./assets/2.3.2.2.png)
|
||||||
|
|
||||||
|
如果看不懂也没关系,下面我们会讲解其中常用的一些功能。
|
||||||
|
|
||||||
|
### Vim 的“模式”
|
||||||
|
|
||||||
|
Vim 有一个最基本的东西“模式”,在不同模式下,快捷键的功能会有所不同。Vim 会在左下角提示你所在的模式。
|
||||||
|
|
||||||
|
以下是常见的模式:
|
||||||
|
|
||||||
|
- `命令模式` 这个是 Vim 启动所在的模式,以下的所有内容均在这个模式内进行。其它模式均可以使用 `Esc` 退出到命令模式。
|
||||||
|
- `编辑模式` 使用 `i` 进入,底部会提示 `-- INSERT --`(`-- 插入 --`),在这个模式下,你可以正常编辑文档,和一般的文本编辑器无异。
|
||||||
|
- `替换模式` 底部会提示 `-- REPLACE --`(`-- 替换 --`),使用 `R` 进入,这个模式与编辑模式差别不大,但是你输入的所有内容都会替换光标后的内容。
|
||||||
|
- `选择模式` 原名是“可视模式”,使用 `v` 进入,底部会提示 `-- VISUAL --`(`-- 可视 --`),你可以选择一段文本进行操作。
|
||||||
|
- `选择行模式` 使用 `V` 进入,底部会提示 `-- VISUAL LINE --`(`-- 可视 行 --`),此时所有的选择都变成了整行选择。操作没有任何区别。
|
||||||
|
- `底部命令行模式` 使用 `:`、`/`、`?` 进入(功能不同),此时整个底部都会变成命令行,以 `:` 与 `/` 等字符开头,此时可以输入命令,按下 `Enter` 就可以执行并退出。
|
||||||
|
|
||||||
|
### 移动光标
|
||||||
|
|
||||||
|
在命令模式下,我们可以使用键盘上的方向键来移动光标。但是,我们也可以使用 Vim 提供的命令来移动光标:
|
||||||
|
|
||||||
|
```text
|
||||||
|
^
|
||||||
|
k
|
||||||
|
< h l >
|
||||||
|
j
|
||||||
|
v
|
||||||
|
```
|
||||||
|
|
||||||
|
> 当你熟悉了 `hjkl` 的使用后,你会发现使用这几个命令比使用方向键快多了
|
||||||
|
|
||||||
|
### 命令行
|
||||||
|
|
||||||
|
我们输入 `:` 就可以进入命令行(和上面的底部命令行模式有点区别)了。在 Vim 中,命令行负责了许多复杂的工作。
|
||||||
|
|
||||||
|
下面是最常见的命令组合:
|
||||||
|
|
||||||
|
- `:w` 保存文件
|
||||||
|
- `:wq` 保存并退出 Vim
|
||||||
|
- `:q!` 强制退出 Vim(文件未保存的情况下)
|
||||||
|
|
||||||
|
> `!` 接在命令后表示强制执行一个命令
|
||||||
|
>
|
||||||
|
> 另外,在 `w` 命令后面可以接上文件保存的路径,实现另存为的功能,例如 `:w 1.txt`
|
||||||
|
|
||||||
|
其中命令行模式的其它功能我们在下面还会讲到。
|
||||||
|
|
||||||
|
### 删除与剪切
|
||||||
|
|
||||||
|
假如有一大段文字,在 Vim 中又不能像图形化一样鼠标一拖一删,那么如何快速删除呢?
|
||||||
|
|
||||||
|
在 Vim 中,我们可以单独使用 `x` 和 `d` 命令,也可以在“可视模式”(待会会讲到)下编辑。
|
||||||
|
|
||||||
|
`x` 命令可以删除光标所指的当前字符,而 `d` 命令的功能就比较复杂了。`d` 命令是一个“多字符命令”,需要在 `d` 后面输入其它的东西搭配使用。
|
||||||
|
|
||||||
|
> `d` 命令实际上是剪切,后面会说如何粘贴
|
||||||
|
|
||||||
|
下面是一些例子(均包括开头的 `d`):
|
||||||
|
|
||||||
|
- `dd` 删除整行
|
||||||
|
- `dw` 删除当前单词(以空格分割)
|
||||||
|
- `d0` 删除这行从光标的位置到最前
|
||||||
|
- `d$` 删除这行从光标的位置到最后
|
||||||
|
|
||||||
|
> 在 Vim 中,很多命令例如 `x`、`d` 和后文的 `y`、`G`、`gg` 等前面都可以加一个数字,表示重复这个命令多少次,例如 `5dd` 就是删除5行,包括 `hjkl` 也可以。
|
||||||
|
|
||||||
|
### 复制
|
||||||
|
|
||||||
|
前面我们说到了 `d` 的本质是剪切,那么我们如何复制呢?`y` 命令便可以复制。
|
||||||
|
|
||||||
|
> 注意:Vim 的剪贴板是独立的,和系统使用的不同
|
||||||
|
|
||||||
|
`y` 命令和 `d` 命令的用法如出一辙,例如 `yy` 就是复制整行,`yw` 就是复制单词。
|
||||||
|
|
||||||
|
### 粘贴
|
||||||
|
|
||||||
|
`p` 命令代表 `parse`,就是粘贴。可以粘贴使用 `y` 复制或者 `d` 剪切的内容。
|
||||||
|
|
||||||
|
### 跳转
|
||||||
|
|
||||||
|
如果我们想要快速在文件中跳转,那么`gg` 命令和 `G` 命令是不可或缺的。
|
||||||
|
|
||||||
|
`gg` 命令可以让你快速来到文件的开头,而 `G` 命令单独使用可以来到文件尾部,
|
||||||
|
|
||||||
|
这个两个命令前面加上数字,就可以快速跳转到指定的行(`G` 命令也是从头开始数的)。
|
||||||
|
|
||||||
|
使用也非常简单,按一下就可以,前面也可以加数字。
|
||||||
|
|
||||||
|
另外,可以使用 `0` 跳转到行首和 `$` 跳转到行尾。
|
||||||
|
|
||||||
|
`d` 和 `y` 命令后面也可以接 `gg`、`G`、`0`、`$` 命令,效果就是从指定的位置选择到当前光标所在处。
|
||||||
|
|
||||||
|
### 重复上一个命令
|
||||||
|
|
||||||
|
这个命令是 `.`,没错,就是点。可以重复你的上一个命令。
|
||||||
|
|
||||||
|
### 选择模式(可视模式)
|
||||||
|
|
||||||
|
可视模式,这个名字其实有点误导人。事实上,这个模式就是选择一段文字。(事实上你如果在终端中直接使用鼠标进入的就是这个模式)
|
||||||
|
|
||||||
|
下面是在可视模式中的操作:
|
||||||
|
|
||||||
|
- 使用 `hjkl` 移动(当然方向键也可以)
|
||||||
|
- `y` 复制
|
||||||
|
- `d` 剪切
|
||||||
|
- `x` 删除
|
||||||
|
- `p` 覆盖粘贴
|
||||||
|
- `gg`、`G`、`0`、`$` 移动光标
|
||||||
|
|
||||||
|
### 查找内容
|
||||||
|
|
||||||
|
在 Vim 中,我们可以使用 `/` 进行查找,输入 `/` 然后再输入关键词。
|
||||||
|
|
||||||
|
在查找过程中,我们可以使用 `n` 查找下一个,`N` 查找上一个。
|
||||||
|
|
||||||
|
### 小技巧:使用 `:!` 快速调试 Shell 脚本
|
||||||
|
|
||||||
|
在使用 Vim 的过程中,假如我们需要调试一个 Shell,那么我们就需要退出 Vim,启动脚本,再打开 Vim,十分的麻烦。不过 Vim 提供了一个命令 `:!` 来让我们快速运行一行命令。
|
||||||
|
|
||||||
|
```text
|
||||||
|
:! [要执行的命令]
|
||||||
|
```
|
||||||
|
|
||||||
|
然后我们会跳出 Vim,并看到这个命令的执行结果。如果想要回到 Vim,只需要在程序结束后敲一下 `<Enter>` 便可以回到 Vim 了。
|
||||||
|
|
||||||
|
另外,我们可以单独使用 `:!` 查看执行的历史记录。
|
||||||
|
|
||||||
|
## Vim 的配置
|
||||||
|
|
||||||
|
在 Vim 中,我们可以使用 `:set (no)[配置名]` 去开关某些配置。
|
||||||
|
|
||||||
|
对于有参数的配置,可以使用 `:set [配置名]=[值]`
|
||||||
|
|
||||||
|
下面是一些常用配置:
|
||||||
|
|
||||||
|
```text
|
||||||
|
:set number "启用行号
|
||||||
|
:set autoindent "自动缩进
|
||||||
|
:set autoread "如果文件有更改自动更新文件
|
||||||
|
:set wrap "自动折行
|
||||||
|
:set encoding=utf-8 "设置显示格式,文件显示乱码可尝试调整
|
||||||
|
:set fileencoding=utf-8 "设置写入格式
|
||||||
|
:set hlsearch "高亮搜索结果
|
||||||
|
```
|
||||||
|
|
||||||
|
这些配置都是临时启用,如果每次启动时都要手动配置,属实有点麻烦。那么该怎么办呢?我们可以将配置文件写入 `~/.vimrc` 文件实现永久配置。(注意所有配置不要带冒号)
|
||||||
|
|
||||||
|
> 其实 Vim 的功能远不止如此,感兴趣的可自行了解 VimScript 相关内容。
|
||||||
|
|
||||||
|
## 课后作业
|
||||||
|
|
||||||
|
Vim 的功能十分强大,并且在维护时十分常用。下面的练习可以帮你更好掌握 Vim:
|
||||||
|
|
||||||
|
> 试试看在下面的过程中,全程不使用方向键吧!
|
||||||
|
|
||||||
|
1. 使用 `touch` 新建一份 `.sh` 文件,文件名随意
|
||||||
|
2. 使用 Vim 编辑这个文件,使用 `echo` 输出一个 `helloworld`
|
||||||
|
3. 保存这个文件
|
||||||
|
4. 使用 `:!` 运行这个文件
|
||||||
|
5. 退出 Vim
|
||||||
|
6. 使用 Vim 定制你的 `~/.vimrc` 配置文件
|
||||||
|
7. 你也可以将这个配置文件发到论坛上与小伙伴交流
|
|
@ -2,6 +2,26 @@ if (window.innerWidth > 640) { // 自动展开导航栏
|
||||||
document.getElementById("toc-drawer").setAttribute('open', true);
|
document.getElementById("toc-drawer").setAttribute('open', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 细节修复
|
||||||
|
function update_text() {
|
||||||
|
console.log(1)
|
||||||
|
// 修复 table
|
||||||
|
var tables = document.getElementsByTagName("table")
|
||||||
|
if (tables != undefined) {
|
||||||
|
for (let i = 0; i < tables.length; i++) {
|
||||||
|
tables[i].parentNode.classList.add('mdui-table');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修复 hr
|
||||||
|
var hrs = document.getElementsByTagName("hr")
|
||||||
|
if (hrs != undefined) {
|
||||||
|
for (let i = 0; i < hrs.length; i++) {
|
||||||
|
hrs[i].replaceWith(document.createElement("mdui-divider"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function prevPage() {
|
function prevPage() {
|
||||||
var link = document.getElementById("helper_prevpage").href;
|
var link = document.getElementById("helper_prevpage").href;
|
||||||
|
|
||||||
|
@ -71,6 +91,9 @@ function changePage(url) {
|
||||||
|
|
||||||
// 刷新高亮
|
// 刷新高亮
|
||||||
hljs.highlightAll();
|
hljs.highlightAll();
|
||||||
|
|
||||||
|
// 修复内容
|
||||||
|
update_text();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// 发送 XHR
|
// 发送 XHR
|
||||||
|
@ -83,3 +106,5 @@ window.addEventListener('popstate', function (event) {
|
||||||
console.log('pop state:', window.location.protocol + "//" + window.location.host + location.pathname);
|
console.log('pop state:', window.location.protocol + "//" + window.location.host + location.pathname);
|
||||||
changePage(window.location.protocol + "//" + window.location.host + location.pathname);
|
changePage(window.location.protocol + "//" + window.location.host + location.pathname);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
update_text();
|
Loading…
Reference in New Issue