VNote支持一个类似于VSCode Tasks的简单任务系统,可以方便地执行第三方程序。
VNote会尝试从下面三个位置加载任务:
默认配置文件夹/tasks包含内置的任务用户配置文件夹/tasks包含用户定义的任务笔记本配置文件夹/tasks包含该笔记本定义的任务一个任务由一个*.json的入口文件给出定义。
点击任务菜单中的添加任务,打开用户定义的任务文件夹。
新建一个文件夹hello并在其下面新建一个文件hello.json。编辑该文件如下:
{
"command": "echo 'Hello Tasks'"
}
重新加载任务,我们可以看到菜单里面列出了一个新的任务hello。点击运行该任务。
{
"label": "Hello",
"icon": "tasks-solid.svg",
"shortcut": "Alt+H, T",
"command": "echo",
"args": [
"Hello tasks!"
]
}
其中的图标文件tasks-solid.svg需要保存在JSON入口文件同目录。
任务可以无限嵌套。子任务会继承父任务的大部分属性。
{
"label": "Hello Tasks",
"icon": "tasks-solid.svg",
"shortcut": "Alt+H, T",
"command": "echo",
"args": ["Hello tasks!"],
"tasks": [
{
"label": "Hello Cat",
"icon": "cat-solid.svg",
"shortcut": "Alt+H, C",
"args": ["Hello cat!"]
},
{
"label": "Hello Dove",
"icon": "dove-solid.svg",
"shortcut": "Alt+H, D",
"args": ["Hello dove!"]
},
{
"label": "Hello Fish",
"icon": "fish-solid.svg",
"shortcut": "Alt+H, F",
"args": ["Hello fish!"]
}
]
}
任务的type属性定义了该任务的命令是如何被执行的。
shell: 默认,将命令作为一个shell命令执行process: 将命令作为一个独立的程序执行
{
"type": "process",
"label": "Open File with",
"args": ["${file}"],
"tasks": [
{
"label": "Typora",
"icon": "Typora.svg",
"command": "C:\\Programs\\Typora0.9.98\\x64\\Typora.exe"
},
{
"label": "VS Code",
"icon": "vscode.svg",
"command": "C:\\Users\\tootal\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe"
}
]
}
::: alert-info
是的,tootal就是那个发起VNote任务系统的贡献者!
:::
VNote没有提供一个终端。我们可能需要使用start或者gnome-terminal或者konsole来在终端里面运行某些程序。
{
"label": "Vim",
"icon": "vim.svg",
"type": "process",
"command": "gnome-terminal",
"args": [
"--execute",
"vim",
"${file}"
]
}
可以通过一个区域字符串JSON对象来提供本地化。
{
"label": {
"en_US": "Hello",
"zh_CN": "你好"
}
}
可以使用windows/linux/osx关键词来指明不同平台的选项。
{
"type": "process",
"label": "Open File with",
"args": ["${file}"],
"tasks": [
{
"label": "Typora",
"icon": "Typora.svg",
"windows": {
"command": "C:\\Programs\\Typora0.9.98\\x64\\Typora.exe"
},
"linux": {
"command": "/usr/bin/typora"
}
},
{
"label": "VS Code",
"icon": "vscode.svg",
"windows": {
"command": "C:\\Users\\tootal\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe"
},
"linux": {
"command": "/usr/bin/code"
}
}
]
}
一个任务可以有多个选项,其中有一些是必须的。
我们使用[m]来标记必须选项,[l]来标记支持本地化的选项。
version: 任务文件的版本label[l]: 任务的名字type: 任务的类型,shell(默认)或者processcommand[l]: 需要执行的命令args[l]: 传递给命令的参数options: 运行任务的选项
cwd: 运行任务时的当前工作目录;如果不指定,会顺序尝试当前笔记本根文件夹,然后当前缓冲区所在文件夹,然后是当前任务文件所在文件夹env: 运行任务的环境变量shell: shell类型的任务的选项
executable: shell可执行文件;Windows上默认为Powershell.exe,Linux/macOS上默认为/bin/bashargs: 启动shell的参数tasks: 定义子任务inputs: 定义输入变量
id[m]: 输入变量的IDtype: promptString(默认,会提示用户输入),pickString(提示用户选择)description[l]: 输入变量的描述default[l]: 默认值password: promptString类型下,是否启用密码模式options[l]: pickString类型下提供的选项windows: 指定Windows系统的选项linux: 指定Linux系统的选项osx: 指定macOS系统的选项一个任务可以通过形式${variableName}来使用VNote提供的变量。变量可以在任务运行时提供有用的信息。
变量可以在选项command/args/options.cwd/options.env中使用。
笔记本相关变量:
notebookFolder: 笔记本根文件夹路径notebookFolderNamenotebookNamenotebookDescription缓冲区相关变量:
buffer: 当前缓冲区路径bufferNotebookFolder: 当前缓冲区所属笔记本的根文件夹路径bufferRelativePathbufferNamebufferBaseNamebufferDir: 当前缓冲区所在目录bufferExt: 当前缓冲区的扩展名后缀selectedText: 当前缓冲区查看窗口的所选文本任务相关变量:
cwd: 当前工作目录taskFile: 任务入口文件路径taskDir: 任务入口文件所在目录exeFile: VNote可执行文件路径pathSeparator: 平台相关的路径分隔符notebookTaskFolder: 当前笔记本任务文件夹路径userTaskFolder: 用户任务文件夹路径appTaskFolder: 默认任务文件夹路径userThemeFolder: 用户主题文件夹路径appThemeFolder: 默认主题文件夹路径userDocsFolder: 用户文档文件夹路径appDocsFolder: 默认文档文件夹路径其他特殊变量:
${magic:snippet_name}引用VNote的片段${env:env_name}访问环境变量${config:[main|session].json_object_path}访问VNote的配置选项
main对应读取自vnotex.json的主要配置,session对应读取自session.json的会话配置arr[index]来访问一个JSON数组${config:main.core.shortcuts.FullScreen}可以读取FullScreen对应的快捷键一个任务可以通过${input:input_id}使用输入变量来提示用户提供输入
目前有两种类型的输入变量:
promptStringpickString
{
"command": "echo",
"args": ["${input:what}"],
"inputs": [
{
"id": "what",
"type": "promptString",
"description": "Type something, it will show in output panel."
}
]
}
一个任务可以通过${shell:shell_command}使用shell变量来执行一个shell命令并获取其输出。
${shell:git rev-parse --abbrev-ref HEAD} → master${shell:whoami} → tootal${shell:dig github.com -4 +short} → 52.69.186.44在默认配置任务文件夹中有一个内建的Git任务。
编译并运行:
{
"command": "g++ \"${file}\" -o \"${fileBasenameNoExtension}\"; if ($?) { start cmd \"/c `\"${fileBasenameNoExtension}`\" & pause\" }"
}
运行一个HTTP服务:
{
"command": "start cmd.exe \"/c python -m http.server\" ; start http://localhost:8000"
}