0%

三大状态区:工作区、暂存区和版本库

从工作区到暂存区

1
git add <filename>

从暂存区到版本库

1
git commit -m "<text>"

撤销指定文件在工作区的修改。如果添加到了暂存区,回退至暂存区内的状态;如果未添加到暂存区,回退至版本库内的状态

1
git checkout -- <filename>

从版本库中删除一个文件

1
2
3
4
rm <filename>
git rm <filename>
# 或者 git add <filename>
git commit -m "<text>"

远程库

推送时关联本地库和远程库,以后推送和拉取时可以简化命令

1
2
3
4
# 首次命令
git push -u origin master
# 后续命令
git push origin master

分支

查看分支

1
git branch

创建分支

1
2
3
4
5
6
git checkout -b dev
# 或者
git switch -c dev
# 等效于以下两条命令
git branch dev
git checkout dev

合并指定分支到当前分支

1
git merge dev

删除分支

1
git branch -d dev

创建本地分支与远程分支的对应关系

1
git branch --set-upstream-to=origin/<branchName> <branchName>

标签

为commit打上文字标签,便于标记历史版本

1
2
3
4
5
6
7
8
# 显示所有标签
git tag
# 为当前所在版本打标签
git tag <tagName>
# 为指定版本打标签
git tag <tagName> <commitID>
# 删除标签
git tag -d <tagName>

vscode-vim插件,normal模式下自动切换英文输入法

  1. 首先下载 im-select.exe 程序,将其放置于 "C:\bin\im-select.exe"

  2. 在vscode配置文件 settings.json 中添加如下配置

1
2
3
4
"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.defaultIM": "1033",
"vim.autoSwitchInputMethod.obtainIMCmd": "C:\\bin\\im-select.exe",
"vim.autoSwitchInputMethod.switchIMCmd": "C:\\bin\\im-select.exe {im}",

Section 1 基本移动/模式切换

快捷键 意义
j, k 上下
h, l 左右(不能跨行)
w 下一个单词(开头)
b 词头(上一个单词)
e 词尾(下一个单词)
yy 复制行
dd 删除行
u 撤销
V 可视行模式
v 可视模式
ctrl+v, ctrl+q 可视列模式
d, y, p 可视模式下删除、复制、粘贴
i 在光标前方插入模式
esc, ctrl+[ 回到普通模式

所有的删除和复制操作共用一个数据寄存器

可视模式下按O可将光标切换至选区的另一角

Section 2 进阶操作/搜索

快捷键 意义
o 向下插入一行,并进入插入模式
O 向上插入一行,并进入插入模式
P 向上黏贴
W, B, E 以空格为界跳转
a 在光标后方进入插入模式
/ 向下搜索
? 向上搜索
n, N 在搜索中前后跳转
* 向后搜索光标所在单词
# 向前搜索光标所在单词

搜索完毕后取消搜索的高亮 :noh

搜索时忽略大小写 :set ic,不忽略大小写 :set noic

Section 3 行内操作

快捷键 意义
f, F 跳转到行内指定字母(光标后、前)
t, T 跳转到行内指定字母前(光标后、前)
; , f搜索后,往后、往前跳转
x 删除一个字母
s 删除一个字母并进入插入模式
c 删除后进入插入模式(其余与d相同)
y, d, v, c 均可以与f, t等配合
D 删除当前行中剩余部分
C 删除当前行中剩余部分,并进入插入模式
S 删除当前整行,并进入插入模式

Section 4 垂直跳转

快捷键 意义
gg 跳转至第一行
G 跳转至最后一行
: 跳转至指定行
{, } 跳转到上/下一空行
ctrl+u 向上半页
ctrl+d 向下半页
% 跳转与光标所在括号对应的括号
di{ di( di[ 删除光标所在括号包裹的内容
dip diw 删除光标所在段落/单词
da{ 删除光标所在括号包裹的内容和括号本身

上述操作中d可以换成c/v/y执行对应操作

命令前加数字,代表重复命令多次

Section 5 文件级操作

快捷键 意义
:e 打开文件
ctrl+o 返回上一次光标所在位置(可以跨文件)
ctrl+i 重做ctrl+o
m 文件内标记光标所在位置
m(capitalized) 全局标记
` 前往标记的光标所在位置

其他

快捷键 意义
r/R 更改一个/多个字母
q<char/num> … q 录制宏,结束录制宏
@<char/num> 播放宏,前面可以加上数字表示重复次数

在vscode中,宏是在当前窗口中暂时性的。不过就宏本身想要解决的痛点来说,宏本身就是一种暂时性的解决方案,没有必要进行长久的全局的保存。

命令 说明
:! 执行外部命令
:w 将当前文件内容写入新文件中
(可通过可视模式选中指定内容执行该操作)
:r 文件内容插入至当前光标后
:r ! 执行外部命令,将标准输出结果插入至当前光标后
快捷键 意义
zz 使当前光标居中
动作 意义
gu 转换为小写
gU 转换为大写
g~ 大小写对换

每个动作后都需要指定名词,如w, p, [, {,其中除了w以外其他名词必须指定i/a参数

名词简称

名词 意义
( = b
{ = B
< = t

标签

快捷键 意义
gt 切换到下一个标签
gT 切换到上一个标签
:tabnew 新建标签,可指定文件名
:tabc[lose] 关闭当前标签
:tabo[nly] 仅保留当前标签
:tabdo 在所有标签中执行命令

推荐教程(含虚拟机):

https://next.idev365.com/vim/

操作概览图

docker

具体命令

仓库 -> 镜像

从远端仓库中拉取镜像

1
docker pull nginx

镜像

查看当前所有的docker镜像

1
docker images

镜像 -> 容器

运行镜像

1
docker run -d -p 80:80 --name mynginx -v `pwd`:/usr/share/nginx/html --link myng1:myng nginx:latest
  • -d 在后台运行
  • -p 指定端口映射,前者为外部端口,后者为内部docker容器的接口
  • –name 指定容器的名字
  • -v 指定文件路径映射
  • –link 将容器myng的ip映射到myng1域名

容器

查看当前所有在运行的docker容器

1
docker ps

在指定容器中执行指定命令,其中bash/sh命令可以进入容器终端

1
docker exec -it {containerID}/{containerName} bash

停止指定容器

1
docker stop {containerID}

删除指定容器

1
docker rm {containerID}

容器 -> 镜像

将当前容器提交为镜像

1
docker commit {containerID} {imageName}

DockerFile -> 镜像

通过dockerfile构建镜像

1
docker build -t {imageName} {dirPath}

镜像 -> Tar文件

将指定镜像保存为tar文件

1
docker save {imageName} > {tarFileName}

Tar文件 -> 镜像

通过tar文件加载镜像

1
docker load < {tarFileName}

注意事项

docker容器中,在安装新应用之前,需要先更新apt-get,防止安装其他包时报错

1
apt-get update

安装vim

1
apt-get install vim-gtk

语法

https://regexone.com/

单个字符

符号 意义
. 任意字符
\w 任意字母数字字符
\W 任意非字母数字字符
\d 任意数字
\D 任意非数字
\s 任意空白:空格、换行符、制表符、回车
\S 任意非空白
\b 词和非词的边界
[abc] abc中任意一个字符
[^abc] 除了abc以外的一个字符
[a-z] a-z中任意一个字符
[^a-z] 除了a-z的任意一个字符

重复模式

符号 意义
{5} 之前一个匹配模式重复5次
{1,5} 之前一个匹配模式重复1-5次
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或1次

位置匹配

符号 意义
^ 行首
$ 行尾

分组提取

符号 意义
(…) 提取括号中内容
(…(…)…) 嵌套括号,以括号出现的先后顺序分别提取内容
(abc|def) 匹配abc或def

分组还可以不提取,用来判别复杂的模式,如(…)?判别某模式出现与否

反向引用

符号 意义
\0 匹配到的全文
\1 匹配到的第一组
\2 匹配到的第二组

\1 \2 可以用在文本编辑器匹配并替换中,(\d+)-(\d+) 替换为 \2-\1

注:在vscode中,搜索中用\1 \2,替换中用$1 $2

常用表达

表达式 意义
^-?\d+(,\d+)*(.\d+(e\d+)?)?$ 匹配各种类型的数字,包含负号、小数、科学计数、分隔符
(\w+).(gif|jpg|png)$ 匹配所有图片类型,提取文件名和扩展名
^\s*(.*)\s*$ 去除行首行尾多余的空白,提取有信息的内容
[\w\.]+ 匹配文件名,包含数字字母和.
(\w+)://([\w-.]+)(:(\d+))?/ 提取url中的协议、域名、端口

Python 中的应用

https://regexone.com/references/python

查找首次出现的匹配

1
2
3
import re

matchObject = re.search(pattern, input_str, flags=0)

matchObject为特殊数据结构,需要调用方法提取出匹配的文本

返回匹配的整体

1
matchObject.group(0)

返回匹配的 capture group

1
2
matchObject.group(1)
matchObject.group(2)

返回匹配的整体在原字符串中的位置

1
2
matchObject.start()
matchObject.end()

re.findall

查找全部出现的匹配,返回列表

如果无 capture group,返回匹配整体的列表

1
2
3
4
regex = r"[a-zA-Z]+ \d+"
matches = re.findall(regex, "June 24, August 9, Dec 12")

# matches = ['June 24', 'August 9', 'Dec 12']

如果有 capture group,返回每个匹配提取出的 capture group 的元组组成的列表

1
2
3
4
regex = r"([a-zA-Z]+) (\d+)"
matches = re.findall(regex, "June 24, August 9, Dec 12")

# matches = [('June', '24'), ('August', '9'), ('Dec', '12')]

re.finditer

查找全部出现的匹配,返回由 matchObject 构成的迭代器,可以迭代调用 matchObject 的方法

1
2
3
4
5
6
7
8
9
regex = r"([a-zA-Z]+) (\d+)"
matches = re.finditer(regex, "June 24, August 9, Dec 12")
for match in matches:
print(match)

# output:
# <re.Match object; span=(0, 7), match='June 24'>
# <re.Match object; span=(9, 17), match='August 9'>
# <re.Match object; span=(19, 25), match='Dec 12'>

re.sub

搜索并替换,返回替换后的全文,count明确做几次替换,忽略则默认替换所有

1
replacedString = re.sub(pattern, replacement_pattern, input_str, count)

可以用到反向引用

1
2
3
4
regex = r"([a-zA-Z]+) (\d+)"
re.sub(regex, r'\2 of \1', "June 24, August 9, Dec 12")
# output:
# '24 of June, 9 of August, 12 of Dec'

re Flags

re 模块中每一种匹配方法基本上都有 flags 参数,默认为0.

Flag 意义
re.IGNORECASE 不区分大小写
re.MULTILINE 使^和$将\n分开的各行作为行,否则默认是全文
re.DOTALL 使.能够匹配\n

re.RegexObject

需要多次重用相同的pattern匹配时,可以将pattern提前编译,提高运算速度

1
regexObject = re.compile(pattern, flags=0)

regexObject 拥有的方法与之前re的函数基本相同

1
2
3
4
5
regex = re.compile(r'(\w+) World')

result = regex.search('Hello World is the easiest')
results = regex.findall('Hello World, Bonjour World')
replacedString = regex.sub(r'\1 Earth', 'Hello World')