使用Mac的Applescript定制sublime执行C/C++程序弹出终端


tags: MacOS Tips Sublime

写在前面

最近又开始折腾编辑器了, 当然还是一个历史遗留问题, 我最爱的Sublime还是不能通过终端执行C/C++程序, 或者就是执行完之后直接退出了, 绕了一圈, 从每一个程序中加上system(read);算是一个折中的方案, 但是终归有点麻烦, 采用AppleScript(命令行中使用osascript -e)的方法当然可以, 但是我找了半天也没一个能跑明白… 只能说自己功力不够

针对Terminal

下面倒是一个可以通过applescript跑起来的例子, 就是对iTerm不行, 只能对系统默认的终端(Terminal.app)来操作… 还是有点鸡肋的. 这个命令我参考了1, 并做了一些改动.

# double `-e`
osascript -e 'tell application "Terminal" to activate' -e 'tell application "Terminal" to do script "/Users/xxx/Desktop/main && read -n && exit"'
# single `-e`
osascript -e 'tell application "Terminal" to activate do script "clear && /Users/xxx/Desktop/main && read -n && exit"'

稍加配置就可以直接在sublime中运行了, 这里的配置就不详细说了. 其实万变不离其宗, 都是通过修改后缀为.sublime-build的JSON文件实现的编译系统的配置. 下面主要以主流的iTerm为例进行配置.

针对iTerm

这里借鉴一位印度开发者的gist2, 这里我修改成直接能运行的配置, 如下:

{
    "shell_cmd": "g++ $file_name -o ${file_base_name}.out && \"/Users/xxx/Library/Application Support/Sublime Text 3/Packages/User/run-in-iTerm.sh\" ${file_path}/${file_base_name}.out",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++, source.cxx, source.cpp",
}

其中的run-in-iTerm.sh如下(其实还是Apple脚本):

#!/bin/bash

################################################
# https://stackoverflow.com/questions/32675804/how-do-i-execute-a-command-in-an-iterm-window-from-the-command-line
# https://www.iterm2.com/documentation-scripting.html
# Better Examples @ https://gitlab.com/gnachman/iterm2/wikis/Applescript
################################################

osascript - "$@" <<EOF
on run argv
tell application "iTerm"
    activate
    set new_term to (create window with default profile)
    tell new_term
        tell the current session
            repeat with arg in argv
               write text arg
            end repeat
        end tell
    end tell
end tell
end run
EOF

但是我后来发现, 这个appleScript脚本还是有一些不方便的地方, 就比如每次执行之后都会创建一个新的iTerm窗口, 需要自己关闭, 我需要的是按下enter之后就销毁窗口(这点在vs或者dev-c++上就做得很好).

于是我又找到另外一种脚本3, 如下:

#!/bin/bash

osascript - "$@" <<EOF
on run argv
tell application "iTerm"
    tell current session of current window
        repeat with arg in argv
            write text arg
        end repeat
  end tell
end tell
end run
EOF

上面脚本的意思是通过现有的窗口完成程序的运行, 但是这个也有一个问题, 就是必须要有一个已经打开的iTerm窗口, 否则就会报错说找不到打开的iTerm窗口, 这个还是有点烦, 接着找…

后来接连看了几篇回答和对应的外链(其实就是gist代码段和iTerm官方给出的代码), 分别是4,5, 发现Applescript已经被iTerm弃用了, 取而代之的是Python-API, 但是配置起来还是比较麻烦(其实就是因为自己没学过async)

后来几经摸索, 我想出来了一个方案, 就是在前面给出的json的基础上, 设置一些参数, 使得Press ENTER to exit得以实现, 下面是最后的配置, 当然, 这里也参考了sublime的build system的主要配置参数6, 比较简单, 这里我直接贴出来代码了:

{
    "shell_cmd": "g++ -std=c++20 $file_name -o ${file_base_name}.out && \"/Users/xxx/Library/Application Support/Sublime Text 3/Packages/User/run-in-iTerm.sh\" \"clear && ${file_path}/${file_base_name}.out && read 'word?Press ENTER to exit!' && exit\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++, source.cxx, source.cpp",
}

通过捕获read命令的方式进行配置7, 这里也有一个坑, 就是之前的read -p "xxx"的方式在zsh上面失效了, 就必须采用read "name?what's your name?"的方式进行读取, 一个测试的例子如下:

read "name?what's your name?"
what's your name?paul
❯ echo $name
paul

# another format
❯ read name\?"what's your name?"
what's your name?paul
❯ echo $name
paul

这里当然就是随便选取一个别名即可, 我取的就是Press ENTER to exit!

这里有一个小插曲, 就是看第一段applescript中的代码, 里面的

repeat with arg in argv
   write text arg
end repeat

部分是不是很像Python的for i in range()呢? 其实就是逐参数读取的命令, 这里我设置了一连串的命令, 就是方便其在iTerm中执行:

\"clear && ${file_path}/${file_base_name}.out && read 'word?Press ENTER to exit!' && exit\"

总体效果还是很不错的, 如下:

aa

参考


  1. macos - How to use osascript to open the Terminal App in a new window and make sure it’s on the top of all other windows? - Ask Different (stackexchange.com); ↩︎

  2. Sublime Text 3 CPP Basic Setup (on Mac). (github.com); ↩︎

  3. iterm_cmd.sh (github.com); ↩︎

  4. How do I execute a command in an iTerm window from the command line? - Stack Overflow; ↩︎

  5. Scripting - Documentation - iTerm2 - macOS Terminal Replacement; ↩︎

  6. Build Systems — Sublime Text Unofficial Documentation (sublime-text-unofficial-documentation.readthedocs.io); ↩︎

  7. bash - zsh: read:-p: no coprocess error while using read command with -p flag - Ask Ubuntu; ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
 【为什么购买本课程?】1、学会Photoshop脚本,可以大幅提高您的工作效率、摆脱大量重复设计任务的束缚;2、扩展Photoshop的功能:天气预报、to-do设计任务管理、中文加拼音、图层文字中英互译、每日一句英语、OCR智能识别图片上的文字内容、 为上万影片批量生成九宫格预览图、为数百个视频自动添加内容不同的片头、自动获取图片的主题颜色、快速生成不限数量并且不重复的漂亮卡通头像、给Photoshop添加猜数字、贪吃蛇游戏等等;3、利用人工智能技术:在Photoshop中识别图片中指定颜色的物体、进行面部识别;4、掌握99%Photoshop设计师不曾接触的技能,打造自己的职场护城河!5、重要的是:只有我们这里提供系统、全面、易学的Photoshop脚本教程,只此一家,别无选择!  【Photoshop脚本是什么?】* Photoshop神秘和强大的一项秘技!* 它可以允许您以代码的方式来操作文档、美化图像、处理图层、控制通道、编辑选区、使用滤镜等等,就像在Photoshop界面上操作一样。* 与PhotoShop动作(Action)相比,PhotoShop脚本更强大、更智能、更富有逻辑判断功能。* PhotoShop脚本主要用于重复性的任务或用于制作非常复杂的特殊效果。 【学会Photoshop脚本,可以做什么?】* 一键给n个图片批量添加水印;* 一键将n个图片批量生成指定尺寸的缩略图;* 一键将PSD网页设计稿的各功能区域,批量输出为Web所用格式;* 一键生成iOS、Andriod应用和游戏必需的十几种尺寸的图标;* 一键将n个小图拼合为一张大图,并输出各小图在大图中的坐标信息;* 甚至开发一款运行在Photoshop上的趣味游戏!我们向您保证,学习PhotoShop脚本所花费的时间,可以在完成几项重复性的复杂任务时得到补偿。快来学习Photoshop脚本吧!  【课程的特点】1、创新的教学模式:手把手教您Photoshop自动化技术,一看就懂,一学就会;2、贴心的操作提示:让您的眼睛始终处于操作的焦点位置,不用再满屏找光标;3、语言简洁精练:瞄准问题的核心所在,减少对思维的干扰,并节省您宝贵的时间;4、视频短小精悍:即方便于您的学习和记忆,也方便日后对功能的检索;5、课程源码素材:购买课程之后,进入最后一章的最后一节的课件列表,下载课程源码素材。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zorchp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值