SublimeText的远程编译插件

Remote compilation plugin for SublimeText

经常在Win上写一些跑在Linux上的测试小代码还需要手动在Linux下执行编译命令有些麻烦,而且我用树莓派配置samba将代码共享到Win上也需要ssh上去手动编译,有点浪费时间。
这几天闲时写了一个SublimeText的小插件,用来在windows下远程编译C/C++的代码,就是在Windows上写代码但是实际会在Linux上执行。目前只是实现了功能,等放假后休息时有空优化一下。
代码放在Github上:sublimeRemoteCompile,使用了一些C++11的特性,编译时需指定。

Update:2017.02.18

  1. 修改执行逻辑
    UploadCurrentFolder改为UploadCurrentFolderAndRun,上传当前文件所在的文件夹,并在上传完成后执行编译和运行操作。
  2. 添加UploadCurrentFolderAndTerminalRun模式,会上传当前文件所在的文件夹并在新的窗口中打开运行。
  3. 使用上面两种模式上传的文件夹均不会自动删除,其路径为ini中设定的remoteTempFolder/RunTime,RunTime为执行上传操作时获取的时间点。
  4. 当源文件在Samba目录时以上两种上传模式均不会执行。

Update:2017.01.26

  1. 优化代码。
  2. 增加另一种机制:如果将远程主机的目录通过samba映射到本地,对其中的源文件进行编译时直接对该远程目录的源文件进行操作(将本地映射路径转换为远程主机的绝对路径),不执行上传源文件这一步骤(因为该文件已经存在于远程主机了)。
    比如:远程主机有一个samba文件夹~/code,我将其映射到了我的Z盘,我在Z盘(也就是远程主机的~/code)下新建源文件hw.cc,然后使用本插件进行远程编译时,会直接执行编译操作(非samba下会先上传再编译),从而提高运行速度。

使用方式:
需要在setting.ini指定sambaDrive项为远程samba映射到本地的盘符,remoteSambaPath为映射到本地sambaDrive盘符的远程主机samba文件夹路径。

1
2
3
4
5
6
7
;远程主机的~/目录被映射到本地的Z盘

;samba mapping to local DeskDrive
sambaDrive=Z

;remote sambda Path
remoteSambaPath=~/

这样,在本地的Z盘中的文件执行“远程编译”不会被执行上传(UploadThisFileUploadCurrentFolder模式均不会执行)。


裹了一层ssh操作,用来写一些简单的测试代码还是挺爽的,错误信息也会捕获到SublimeText的Panel中。复杂项目可以使用VisualStudio+VisualGDB。
通过ini读取配置信息,具有七种运行模式:

已根据2017.02.18更新修改下列表格。

参数 模式
panelRun 运行在SublimeText的Panel
terminalRun 在新窗口中运行
uploadThisFile 上传当前打开的文件到远程主机的临时目录
UploadCurrentFolderAndRun 上传当前打开的文件所在的文件夹到远程主机的临时目录并在ST的panel中执行
UploadCurrentFolderAndTerminalRun 上传当前打开的文件所在的文件夹到远程主机的临时目录并在新窗口中执行
cleanUpTemp 清理远程主机的临时目录
openTerminal 打开一个SSH连接窗口到远程主机

运行模式需要在启动时指定。
运行时需要指定两个参数:源文件路径和运行模式。在SublimeText的build system中源文件路径可以通过${file}获得。

编译时会根据源文件后缀判断语言,C语言默认使用gcc编译,C++则会使用g++,对应的标准版本则是c99和c++11。建议在Linux环境上安装clang,然后在setting.ini中指定编译器为clang,错误提示好很多。如果指定clang也会自动匹配后缀选择编译器为clang或者clang++

如何使用?

这里下载二进制压缩包,解压到本地的一个目录中。
然后在SublimeText中添加一个build system,然后将下面的代码填入其中:

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
33
34
35
{
// binary absolute path
"path": "C:\\Program Files (x86)\\SystemTools\\Tookit\\RemoteCompile",
"cmd": ["cmd", "/c","remotecompile","${file}","panelRun"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"selector": "source.c,source.cc,source.cpp,source.c++",
"shell": true,
"variants":
[
{
"name": "TerminalRun",
"cmd": ["start", "cmd", "/k","remotecompile_clangxx","${file}","terminalRun"]
},
{
"name": "UploadThisFile",
"cmd": ["cmd", "/c","remotecompile_clangxx","${file}","uploadThisFile"]
},
{
"name": "UploadCurrentFolderAndRun",
"cmd": ["cmd", "/c","remotecompile_clangxx","${file}","uploadCurrentFolderAndRun"]
},
{
"name": "UploadCurrentFolderAndTerminalRun",
"cmd": ["start", "cmd", "/k","remotecompile_clangxx","${file}","uploadCurrentFolderAndTerminalRun"]
},
{
"name": "CleanUpTemp",
"cmd": ["cmd", "/k","remotecompile_clangxx","${file}","cleanUpTemp"]
},
{
"name": "OpenTerminal",
"cmd": ["cmd", "/k","remotecompile_clangxx","${file}","openTerminal"]
}
]
}

path处填上你将压缩包解压到的位置(也就是本程序在你电脑中的绝对路径)。
然后可以简单写个代码,按Ctrl+Shift+B就可以看到构建系统列表了:

随便选择一个,会开始执行。
如果是首次使用,会在二进制所在目录生成一个setting.ini文件,需要填写你自己的环境信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[RemoteCompileSSHSetting]
;remote host addr(e.g root@192.168.137.2)
host=
;remote host port(e.g:22)
port=22
;remote host user password
password=
;sshKey(e.g:C:\\Users\\imzlp\\.ssh\\id_rsa.ppk)
sshKey=
;compiler(e.g:gcc/clang)
compiler=gcc
;e.g:-o/-o2
optimizied=-o
;std version e.g:c99/c11 or c++0x/c++11
stdver=-std=c++11
;other compile args e.g:-pthread
otherCompileArgs=-pthread
;remote host temp folder e.g:/tmp
;It is recommended that you leave the default values(/tmp)
remoteTempFolder=/tmp
;Upload SourceFile to remote host path
;auto create a name is localtime of folder
uploadTo=/tmp

建议填写hostpassword或者sshKey,其他保持默认即可。
另外,sshKey要求是ppk秘钥,需要将ssh的秘钥使用puttygen转换成ppk才可以(puttygen在SSHTools目录下),建议使用password

panelRun

terminalRun

uploadThisFile

uploadCurrentFolder

cleanUpTemp

openTerminal

全文完,若有不足之处请评论指正。

微信扫描二维码,关注我的公众号。

本文标题:SublimeText的远程编译插件
文章作者:查利鹏
发布时间:2017/01/25 01:43
本文字数:2k 字
原始链接:https://imzlp.com/posts/11793/
许可协议: CC BY-NC-SA 4.0
文章禁止全文转载,摘要转发请保留原文链接及作者信息,谢谢!
您的捐赠将鼓励我继续创作!