WrapCommand
一个统一的、易于使用的变量扩展界面命令包装器。
详细信息
安装次数
- 总计 780
- Win 433
- Mac 228
- Linux 119
8月6日 | 8月5日 | 8月4日 | 8月3日 | 8月2日 | 8月1日 | 7月31日 | 7月30日 | 7月29日 | 7月28日 | 7月27日 | 7月26日 | 7月25日 | 7月24日 | 7月23日 | 7月22日 | 7月21日 | 7月20日 | 7月19日 | 7月18日 | 7月17日 | 7月16日 | 7月15日 | 7月14日 | 7月13日 | 7月12日 | 7月11日 | 7月10日 | 7月9日 | 7月8日 | 7月7日 | 7月6日 | 7月5日 | 7月4日 | 7月3日 | 7月2日 | 7月1日 | 6月30日 | 6月29日 | 6月28日 | 6月27日 | 6月26日 | 6月25日 | 6月24日 | 6月23日 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Windows | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Mac | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Linux | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
README
- 源代码
- bitbucket.org
Wrap Command
为Sublime Text 2和Sublime Text 3命令提供统一、易用且强大的界面命令包装器。
示例
{ "command": "wrap_command", "args": { "command": "open_file": "args": {"file": "${input:File to open}"} } }
这将提示用户输入,然后运行open_file命令。
动机
在尝试设置构建系统和配置包时,我发现根据包的不同,指定参数的机会更多或更少。
例如,我试图为django应用集合设置构建系统,其中构建系统运行测试
manage.py test <APPLICATION NAME>
但这只部分可行
{ "selector": "source.python", "cmd": ["python", "manage.py", "test", "${file_path/.*[\\/\\\\]//}" ], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "working_dir": "${project_path:}/webapps" }
问题在于它仅适用于应用程序根目录中的文件。
解决方案
我创建了一个新包WrapCommand,提供命令wrap_command。上述问题将如下解决
{ "selector": "source.python", // we wrap the default "exec" target with with "wrap_command" "target": "wrap_command", "wrap_command": "exec", // make sure we have wanted evaluation order "order": ["f", "django_site", "django_app"], // get normed filename "f": "${n:$file_path}", // get normed django-site (folder where manage..py is located) "django_site": "${n:${d:${back:$f;manage.py}}}", // extract django app name from filename "django_app": "${s:${django_site}/([^/]+).*;$1;$f}", "args": { "cmd": ["python", "manage.py", "test", "${django_app}"] "working_dir": "${django_site}", } "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)" "name": "Run" }
我必须承认它看起来不好,但它确实有用。在设置此类模式时,您会发现控制台输出很有用。
我主要不使用构建系统,而是使用SublimeREPL中的命令,以便轻松调试
{ "command": "wrap_command", "caption": ":django manage test", "args": { "wrap_command": "repl_open", "order": ["f", "django_site", "django_app"], "f": "${n:$file_path}", "django_site": "${n:${d:${back:$f;manage.py}}}", "django_app": "${s:${django_site}/([^/]+).*;$1;$f}", "args": { "type": "subprocess", "encoding": "utf8", "cmd": ["python", "-i", "-u", "manage.py", "test", "${django_app}"], "cwd": "${django_site}", "syntax": "Packages/Python/Python.tmLanguage", "external_id": "python", "extend_env": {"PYTHONIOENCODING": "utf-8"} } } }
设置
WrapCommand解析以下设置
名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
wrap_command_debug | 布尔值 | false | 切换到控制台调试日志以帮助跟踪扩展。 |
选项
- 选择
选择一个参数集
{ "select": "${ext:$file_name}" "foo": { "wrap_command": "echo", ... } "bar": { "wrap_command": "echo", ... } }
请注意,首先评估所有参数,然后在调用命令之前应用选择。您可以在所选参数中覆盖wrap_command参数。
默认为选择“args”。
- wrap_command
- 要运行的命令。此键也可以在参数部分中。它将从传递给要运行的命令的参数中删除。
- 顺序
按给定顺序评估在顺序中指定的变量。
您可以指定参数解析的顺序(或仅指定其一部分)。如果使用命名的捕获并在以后重用,或者使用其他参数的值,这很有用。以下示例中使用了平台无关的路径分隔符
{ "order": ["sep"], // make sure $sep can be used in // other configs like args "sep": "(?:\\\\|/)", // file separator pattern "wrap_command": "exec" "args": { ... } }
- args
- 包装命令的参数。
- *
- 任何其他参数都可以用于命名参数集,可以通过选择或预定义值来选择。每个参数在处理后将作为变量可用。
参数展开
变量
首先,有支持构建系统变量,这些变量如构建系统的文档中所述。
$file_path | 当前文件的目录,例如,C:\Files。 |
$file | 当前文件的完整路径,例如,C:\Files\Chapter1.txt。 |
$file_name | 当前文件的名字部分,例如,Chapter1.txt。 |
$file_extension | 当前文件的扩展名部分,例如,txt。 |
$file_base_name | 当前文件仅有的名称部分,例如,Document。 |
$packages | “武器库”文件夹的完整路径。 |
$project | 当前项目文件的完整路径。 |
$project_path | 当前项目文件的目录。 |
$project_name | 当前项目文件的名字部分。 |
$project_extension | 当前项目文件的扩展名部分。 |
$project_base_name | 当前项目文件仅有的名称部分。 |
除此之外,还有以下变量可用
$installed_packages | 返回的 sublime.installed_packages() 值 |
$settings_path | 你的设置目录的目录,会话文件位于其中。 |
$session_file | 会话文件的完整路径。 |
$auto_session_file | 自动会话文件的完整路径。 |
$session | 存储在会话中的数据字典 |
$auto_session | 存储在自动会话中的数据字典 |
$settings | 设置字典 |
$project_buildsystems | 构建系统列表 |
$project_folders | 项目文件夹列表 |
$project_settings | 项目设置字典。 |
$env | 环境字典 |
你可能已经注意到了,还有更多复杂类型可用。你可以像访问通常的数据一样访问它们
$session[dictionary]
将提供字典文件的路径,如你的设置中指定的那样。
因此,你可以访问你的项目第一个构建系统的cmd
$project_buildsystems[0][cmd]
所有这些值你也可以使用${}表示法访问,它
${project_buildsystems[0][cmd]}
如果变量不存在,你可以提供一个默认值
${project_buildsystems[0][cmd]:Default}
快捷键
有一些快捷键以更方便地访问
$PB | $project_buildsystems |
$PS | $project_settings |
$PF | $project_folders |
$S | $settings |
匿名正则表达式捕获
所有变量 $0、$1、$2、...、$9 都自动展开为 \1、\2 等,以方便捕获参数。所以,替代
{ "foo": "${s:f(oo);\\\\1}" }
您可以写
{ "foo": "${s:f(oo);$1}" }
列表插值
在命令中,你通常对值列表更感兴趣,而不仅仅是单个字符串
{ "cmd": [ "echo", "${project_folders}" ] }
将展开为
{ "cmd": [ "echo", "folder1/foo;folder2/bar" ] }
这可能是你不想看到的。请考虑列表插值符号 "@"
{ "cmd": [ "echo", "@{project_folders}" ] }
在列表的上下文中,这将展开为
{ "cmd": [ "echo", "folder1/foo", "folder2/bar" ]}
函数
除了变量之外,你还可以在这些变量上评估小函数。可能还有更多有用的函数,但是这些现在应该已经足够了。
- basename, base, b
获取文件的名称。请注意,在这里文件的扩展名也包括在内
${b:foo/bar.txt} -> bar.txt
- 参数
- 文件的路径
- count
计算列表中的变量数量或字符串中的字符数量
${count:a;b;c} -> 3
- Argunents
- 任何内容
- dirname, dir, d
获取文件名的目录部分
${d:foo/bar.txt} -> foo
- 参数
- 文件的路径
- escape, esc, e
跳过给定的值(或值)以便进一步处理。(";" 和 "" 已跳过,以便您可以将其作为参数进一步使用)。这在例如 map 函数中很有用。
${e:foo;bar} -> foo;bar- 参数
- 任何内容
- 返回
- 字符串
- 存在性
测试给定文件是否存在
${exists:$packages/WrapCommand} -> true ${exists:does/not/exist} ->
如果某个内容不存在,将返回空字符串。
- 参数
- 文件路径
- 扩展名,ext
返回文件的扩展名
${ext:foo/bar.txt} -> txt
- 参数
- 文件路径
- 过滤器
从列表中过滤出一些元素
${filter:oo;foo;gloo;fue;glue} -> foo;gloo
- 参数
- 模式
- 要过滤的列表
- 查找
返回与正则表达式匹配的文件路径列表
${find:$packages;\\.sublime-commands$} -> sublime command files
结果列表包含相对于给定根的文件路径。
- 参数
- 开始搜索的根目录
- 模式
- find_back,back
返回与正则表达式匹配的文件路径列表。与 find 的区别是搜索是反向执行的路径中。将返回父目录中第一个非空文件集。
结果列表包含绝对路径名。
- 参数
- 开始的根目录
- 模式
- 有
检查一个变量是否有条目
${has:var[item]}
请注意,${has:$var[item]} 不同于。
- 参数
- 一个itemgetter
- 如果
如果第一个参数评估为真(非空)的值,则返回第二个参数,如果没有给出则返回第三个参数或 ""
${if:condition;then;else} -> then ${if:;then;else} -> else
- 参数
- 条件
- 非空条件的结果
- 空条件的结果
- 输入,in
获取一些用户输入
${in:User Prompt} -> Open a user input ${in:User Prompt;default} -> Open a user input
- 参数
- 输入的标题
- 默认值(可选)
不能以嵌套方式使用 ${in:foo}
${exists:${input:Filename}} THIS DOES NOT WORK AS EXPECTED, result will be the user's input
- 连接
使用第一个参数作为连接字符串将列表的所有部分连接起来
${join: ;first;second;third} -> first second third
- 参数
- 连接字符串
- 任何其他参数
- 长度,len
返回字符串的长度
${length:foo} -> 3
- 参数
- 一个字符串
- 一个列表
创建一个列表
${list:first;second;third} -> Explicitely create a list
- 参数
- 列表项
- 映射
将函数映射到多个值
${map:${e:s:/$;;$_};first/;second;third/}
此示例将删除末尾的反斜杠(如果有)。请注意,第一个参数将按 map 对每个后续参数进行评估,将 $_ 替换为参数的值。
必须使用跳过函数来以优雅的方式编写此内容,否则您必须跳过所有 ";" 和 "$"。
upper 命令实际上等同于
${list:${s:/$;;first/};${s:/$;;second};${s:/$;;third/}}
如果您的映射函数只接受一个参数,则可以省略跳过的步骤
${map:abspath;$_;first;second;third}
- 参数
- 带或不带 "${}" 的 map 函数
- 要映射的列表
- 匹配,m
匹配一个字符串。如果匹配包含命名捕获,这些捕获将更新为变量字典,供以后使用
${m:f(?P<o>oo);foobar} -> foo ${m:f(?P<o>oo);foobar}$o -> foooo
返回匹配的字符串。
- 参数
- 模式
- 要匹配的字符串
- normpath,norm,n
规范化路径
${norm:foo//bar} -> foo/bar
- 参数
- 模式
- 选择,select
打开一个快速面板供用户选择
${sel:first;second;third} -> Open a panel and user can select between first, second, third ${sel:first\nmore info;second\n;third\nalso more info} -> Open a panel and user can select between first, second, third with displayed more info
- 参数
- 快速面板中显示的值
不能以嵌套方式使用 ${sel:foo}
${exists:${sel:Filename}} THIS DOES NOT WORK AS EXPECTED, result will be the user's input
这里推荐打开 "foo.txt" 或 "bar.txt"
{ "command": "wrap_command", "args": { "command": "open_file", "args": {"file": "${sel:foo.txt;bar.txt}"} } }
如果您必须处理从用户那里获得的结果
{ "command": "wrap_command", "args": { "command": "open_file", "filename": "${sel:foo.txt;bar.txt}", "args": {"file": "${s:\\.txt;\\.cpp;${filename}}"} } }
- subs,s
用值替换匹配的模式
${s:foo;bar;foobar} -> barbar ${s:f(oo);bar\1;foobar} -> baroobar ${s:f(oo);bar$1;foobar} -> baroobar
请注意,在 JSON 上下文中,您必须转义 "\"
{ foo: "${s:f(oo);bar\\1;foobar}" }
- 参数
- 模式
- 替换项
- 要处理的字符串
添加自定义函数
在 sublime text 2 上下文中,这很简单
import expander @expander.modifier('my', 'funcs', 'names') def _myfunc(*args): return args
变化
添加了用于收集用户输入的函数。