<commit_before>👉[English](README.en.md)

# dotfiles

快速配置\*nix开发环境以及装机必备神器。😱

## 1 ssh

如果条件允许的话，建议使用[mosh](https://mosh.org/)替代ssh，mosh基于UDP传输，比ssh更稳定、更容忍网络故障和延迟，不会像ssh那样轻易掉线。由于很多服务器目前并没有安装mosh，使用ssh的还是占主流，并且mosh也不支持ssh-agent、X11-forward等。因此在本地需要配置下ssh。

### 1.1 快速配置

在ssh目录下直接运行`setup.sh`脚本即可，不需要其它额外配置。

### 1.2 连接复用

通常我们ssh连接到一台服务器退出后连接即断开，再次连接时会重新建立连接，需要重新校验密钥或密码。如果使用密码登录，则需要反复输入密码，在需要管理大量远程服务器时效率极低。密码是静态不变使用sshpass可以避免每次输入密码，但显然这是极其不安全的。如果密码是动态生成的，比如跳板机，每次需要打开手机查看动态密码非常麻烦。

ssh连接复用是指一旦成功建立远程主机的ssh连接会保持一段时间的session，在session有效期内可以复用该连接，不需要重新做身份验证。这有点类似sudo命令，第一次输入密码后，再次执行sudo命令不需要输入密码了。

ssh连接复用配置如下:

```
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/socks/%h-%p-%r
```

第一次建立连接时会在ControlPath目录下生成一个socket文件，文件格式为`%h-%p-%r`, 其中`%h`表示远程主机名，`%p`指连接的端口,`%r`是登录用户名。

**注意：** 

* `.ssh`目录权限应设为`600`.
* `~/.ssh/socks`目录需要手动创建。

### 1.3 保持会话

ssh成功登录到一台服务器即创建了一个新的会话，当该会话超过一定时间内没有接收任何请求时，会话会自动断开连接。有时这不是我们所期望的，比如ssh到一台服务器后，google下资料回来发现ssh断开了。

为了保持会话，可以设置ssh客户端每隔一段时间自动发送一个心跳，比如每隔60s发送一个hello包。

```
ServerAliveInterval 60
```

我们还可以设置允许发送心跳的最大数量`ServerAliveCountMax`，当超过这个数量仍然没有接收用户响应时则会自动断开连接。

### 1.4 禁用主机key校验

ssh连接时会检查主机的公钥，如果第一次连接主机会显示该主机的公钥指纹，需要用户确实是否信任该主机。

```
The authenticity of host '192.168.56.4 (192.168.56.4444)' can't be established.
RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f.
Are you sure you want to continue connecting (yes/no)?
```

如果我们跑后台脚本时就会堵塞直到接收用户输入，导致后台脚本不能正常运行。

如果确认信任该主机并且保证不会被劫持攻击的话，可以跳过主机公钥校验，配置如下:

```
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
```

如果通过shell连接，不建议禁用公钥校验。

## 2 tmux

### 2.1 快速配置

运行`tmux/setup.sh`脚本即可，不需要其它额外配置。

### 2.2 配置说明

`prefix`键为默认的`ctrl-b`，个人感觉`ctrl-b`挺方便的，很多人设置为`ctrl-a`，这会与在命令行下快速移动光标到行首冲突，需要按两下ctrl-a。

设置分屏:

```
# Split windows
bind \ split-window -h
bind - split-window -v
```

这样容易记住，`|`垂直分屏，`-`水平分屏。

禁用windows自动命名，主要是它会覆盖原来的名字:

```
set-option -g allow-rename off  # prevent system from renaming our window
```

设置windows从1开始索引：

```
set -g base-index 1 # window index from 1, not zero
```

重新加载配置文件（prefix+r)：

```
bind r source-file ~/.tmux.conf \; display "Reloaded!"
```

打开一个临时窗口查看man手册:

```
bind-key / command-prompt "split-window -h 'exec man %%'"
```

只需要输入`prefix+/`,然后输入需要查询的命令即可。

## 3 vim

### 3.1 Setup

在`dotfiles/vim`目录下运行`setup.sh`即可自动完成配置，配置过程中会自动安装vundle以及插件。

配置过程中可能出现Solarized方案不存在错误，由于该方案还没有安装，直接忽略该错误即可。

除了以上配置还需要系统完成以下包的安装:

* `ctags`
* `cmake`
* `g++`(CentOS下包名为`gcc-c++`)
* `python-devel`

检查ctags是否安装成功:

```
ctags --list-languages<commit_msg>Add neovim<commit_after>👉[English](README.en.md)

# dotfiles

快速配置\*nix开发环境以及装机必备神器。😱

## 1 ssh

如果条件允许的话，建议使用[mosh](https://mosh.org/)替代ssh，mosh基于UDP传输，比ssh更稳定、更容忍网络故障和延迟，不会像ssh那样轻易掉线。由于很多服务器目前并没有安装mosh，使用ssh的还是占主流，并且mosh也不支持ssh-agent、X11-forward等。因此在本地需要配置下ssh。

### 1.1 快速配置

在ssh目录下直接运行`setup.sh`脚本即可，不需要其它额外配置。

### 1.2 连接复用

通常我们ssh连接到一台服务器退出后连接即断开，再次连接时会重新建立连接，需要重新校验密钥或密码。如果使用密码登录，则需要反复输入密码，在需要管理大量远程服务器时效率极低。密码是静态不变使用sshpass可以避免每次输入密码，但显然这是极其不安全的。如果密码是动态生成的，比如跳板机，每次需要打开手机查看动态密码非常麻烦。

ssh连接复用是指一旦成功建立远程主机的ssh连接会保持一段时间的session，在session有效期内可以复用该连接，不需要重新做身份验证。这有点类似sudo命令，第一次输入密码后，再次执行sudo命令不需要输入密码了。

ssh连接复用配置如下:

```
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/socks/%h-%p-%r
```

第一次建立连接时会在ControlPath目录下生成一个socket文件，文件格式为`%h-%p-%r`, 其中`%h`表示远程主机名，`%p`指连接的端口,`%r`是登录用户名。

**注意：** 

* `.ssh`目录权限应设为`600`.
* `~/.ssh/socks`目录需要手动创建。

### 1.3 保持会话

ssh成功登录到一台服务器即创建了一个新的会话，当该会话超过一定时间内没有接收任何请求时，会话会自动断开连接。有时这不是我们所期望的，比如ssh到一台服务器后，google下资料回来发现ssh断开了。

为了保持会话，可以设置ssh客户端每隔一段时间自动发送一个心跳，比如每隔60s发送一个hello包。

```
ServerAliveInterval 60
```

我们还可以设置允许发送心跳的最大数量`ServerAliveCountMax`，当超过这个数量仍然没有接收用户响应时则会自动断开连接。

### 1.4 禁用主机key校验

ssh连接时会检查主机的公钥，如果第一次连接主机会显示该主机的公钥指纹，需要用户确实是否信任该主机。

```
The authenticity of host '192.168.56.4 (192.168.56.4444)' can't be established.
RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f.
Are you sure you want to continue connecting (yes/no)?
```

如果我们跑后台脚本时就会堵塞直到接收用户输入，导致后台脚本不能正常运行。

如果确认信任该主机并且保证不会被劫持攻击的话，可以跳过主机公钥校验，配置如下:

```
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
```

如果通过shell连接，不建议禁用公钥校验。

## 2 tmux

### 2.1 快速配置

运行`tmux/setup.sh`脚本即可，不需要其它额外配置。

### 2.2 配置说明

`prefix`键为默认的`ctrl-b`，个人感觉`ctrl-b`挺方便的，很多人设置为`ctrl-a`，这会与在命令行下快速移动光标到行首冲突，需要按两下ctrl-a。

设置分屏:

```
# Split windows
bind \ split-window -h
bind - split-window -v
```

这样容易记住，`|`垂直分屏，`-`水平分屏。

禁用windows自动命名，主要是它会覆盖原来的名字:

```
set-option -g allow-rename off  # prevent system from renaming our window
```

设置windows从1开始索引：

```
set -g base-index 1 # window index from 1, not zero
```

重新加载配置文件（prefix+r)：

```
bind r source-file ~/.tmux.conf \; display "Reloaded!"
```

打开一个临时窗口查看man手册:

```
bind-key / command-prompt "split-window -h 'exec man %%'"
```

只需要输入`prefix+/`,然后输入需要查询的命令即可。

## 3 vim

注意：当加载太多插件时，vim启动会很慢，并且vim 8以前插件加载都是同步的，必须等待插件执行完才能继续下一个任务. 因此我把自动生成tags功能默认是关闭的, 避免每打开一个文件都要卡顿几秒。可以使用[neovim](https://neovim.io/)替代vim。

### 3.1 Setup

在`dotfiles/vim`目录下运行`setup.sh`即可自动完成配置，配置过程中会自动安装vundle以及插件。

配置过程中可能出现Solarized方案不存在错误，由于该方案还没有安装，直接忽略该错误即可。

除了以上配置还需要系统完成以下包的安装:

* `ctags`
* `cmake`
* `g++`(CentOS下包名为`gcc-c++`)
* `python-devel`

检查ctags是否安装成功:

```
ctags --list-languages
{'fraction_non_alphanumeric': 0.15113791091227388, 'fraction_numerical': 0.02664851196265318, 'mean_word_length': 7.214057507987221, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 4, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7671199', 'n_tokens_mistral': 3703, 'n_tokens_neox': 4043, 'n_words': 272}