hello,最近在服务器开发机写 go 比较多(因为某些原因不好本地开发),介绍下一些方便的技巧。当然有些技巧可能老手早已习以为常, 但是对于很多新手来说应该还是很有帮助的。 (自己摸索,未必是最佳实践,有问题可以留言)
配置 ssh/config
相信你已经生成了公钥了(一般 github 需要配置我们的公钥),如果没有请使用如下命令:
# 一路回车就行
ssh-keygen -t rsa -b 4096 -C <your_email@example.com>这个时候在你的用户根目录下就生成了 ~/.ssh 隐藏文件夹, ~/.ssh/id_rsa.pub 文件包含了你的公钥。 对于经常访问的服务器,你可以编辑你的 ~/.ssh/config 文件,加上你使用服务器相关配置:
Host dev
HostName x.xxx.xxx.xx
Port 22
User root这样我们就可以直接 ssh dev 而不是输入难记忆的 ip 地址来登录服务器了。
快速登录:开发机加入你的公钥
如果每次登录都需要输入用户名和密码略显繁琐,我们可以编辑服务器上的 vi ~/.ssh/authorized_keys 文件,加入你的电脑刚才生成的 id.pub 里的公钥,之后我们直接 ssh dev 就可以登录上去啦。
安装 tmux 终端复用
在服务器上,一旦我们断开连接,运行的进程就会被杀掉,这个时候我们可以使用方便的终端复用软件tmux。 tmux 除了终端复用,还有分屏,托管进程不被杀掉,建立多个会话工作区等强大功能
笔者之前有录视频讲如何使用 tmux https://zhuanlan.zhihu.com/p/43687973
登录服务器自动 attach tmux 会话
介绍一个方便的技巧,就是登录到服务器上以后,自动 attach 到你的 tmux 会话。 编辑你的 .bashrc 或者 .zshrc (假如你服务器开发机器也装了 oh-my-zsh) 文件,加入如下脚本:
if [[ -z "$TMUX" ]] && [ "$SSH_CONNECTION" != "" ]; then
SESSION_NAME="sessionname"
tmux attach-session -t $SESSION_NAME || tmux new-session -s $SESSION_NAME
fi其中引号中 sessionname 是你的 tmux 会话名称,这样每次 ssh dev 到服务器会自动 attach tmux 会话, 真正实现自动化(如果你还想进一步控制 tmux 会话,你可以试试 tmuxp)
服务器用 vim-go 撸 go
对于静态语言借助各种 go 工具和 go 的 Language Server gopls,即使是编辑器也可以愉快写代码。 笔者最近用的 vim-go 居多,介绍一些常用命令。
# 最近一直在开发机服务器上直接用 neovim+vim-go 写 golang,具有完备开发功能(vim-go借助各种go工具实现)
# https://github.com/fatih/vim-go
# https://github.com/fatih/vim-go-tutorial # vim-go 官方教程,最好过一遍
let g:go_def_mode='godef' # 有时候 gopls 有问题可以用 godef 跳转,默认用 gopls
# 如何生成 interface 接口定义
type S struct{} # cursor 放在 S 上执行 :GoImpl io.Reader
# 常用的方便命令(命令模式Tab补全), 参考 https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt
:GoFmt 格式化,你可以配置 vim-go 直接保存自动执行格式化或者直接执行 GoImports
:GoRun, GoTest, GoTestFunc 运行代码和单测
:GoMetaLinter 执行 lint,可以配置 .gometalinter.json 忽略一些 lint 错误。https://github.com/PegasusWang/linux_config/blob/master/golang/gometalinter.json
:GoRename 快速重构
:GoImpl 为 struct 生成接口函数定义。如果一个 interface 有很多需要实现的函数,比较方便
:GoAddTags GoRemoveTags json 快速给 struct field 增加 json tag,支持 visual 模式多选
:GoKeyify 把无名称初始化的 struct literals 转成包含字段名的初始化方式
:GoIfErr 生成 if err 返回值(或者用 snippets)
:GoImplements 找到实现当前 interface 的 struct
:GoCallers 找到当前函数被调用的地点
:GoChannelPeers 寻找可能的 channel 发送和接收点视频(BGM: Ever Eternity)
视频里演示了下我配置的效果,ssh 到服务器上直接到你的 tmux 里,甚至都可以一直不用退出 vim 窗口,大大提升了开发体验。
小结
以上就是笔者的一些小经验,当然如果你不熟悉 vim 或者喜欢用强大的 IDE 工具比如 Goland 开发,也可以用插件配置远程开发,具体可以搜索下相关 文章。不过这个专栏既然是专门讲一些终端开发工具的,主要内容还是以终端开发为主。如果你有一些方便的技巧也可以留言评论,让更多读者朋友看到。 欢迎关注笔者的 B 站同名用户 PegasusWang。