ctrl+shift+p filters: :st2 :st3 :win :osx :linux
浏览

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

变化

添加了用于收集用户输入的函数。