是否可以将一个片段的输出包含在另一个片段中?
Is it possible to include the output of one snippet inside another?
生命短暂,所以我正在创建一组片段。其中一个名为 Muletilla.sublime-snippet
,看起来像这样
<snippet>
<content><![CDATA[
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
${1:}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>muletilla</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.php</scope>
<description>Create the mulelitlla!</description>
</snippet>
输出为
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
另一个名为 CreateCustomController.sublime-snippet
,看起来像这样:
<snippet>
<content><![CDATA[
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
class Custom${1:Module}Controller extends SugarController
{
public function action_${2:name}()
{
${3:// add logic here}
}
}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>controller</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.php</scope>
<description>create a custom controller</description>
</snippet>
如您所见,我需要再次使用 muletilla
输出,并且我需要在其他代码段中执行相同的操作。是否可以将一个片段的输出包含在另一个片段中?
在这种情况下,在我创建的任何其他片段中使用 muletilla
的输出。
提前致谢
从我猜你想要它的意义上来说,这种事情是不可能直接发生的,你可以在第二个片段中添加一些东西来告诉它它应该提取第一个片段的内容并且将它连同其他所有内容一起插入。
人们可能会认为插件可以在片段即将展开时捕获并即时重写它。但是,在一般情况下,当要插入片段时,插件没有真正的方法来捕获,因为缓冲区完成,sublime-snippet
和 sublime-completions
文件都混合在可以完成的项目列表中。
一个潜在的解决方案是一个插件,它从其他地方获取它的片段数据,并将它们作为定制的完成提供,而不是直接使用片段。在那种情况下,插件本身将负责提供插入的内容,它可以根据需要重写这些内容。
另一种解决方案是允许您以中间格式指定代码段的程序包,以便它可以为您生成最终代码段,在这种情况下,它将减轻必须手动更新所有代码段的负担当 sub-snippet 改变时。
就是说,不幸的是,我不知道有任何现有的软件包可以执行这些操作。
对于您问题中概述的情况,如果您将第一个片段的末尾指定为 [=15=]
而不是 </code>,Sublime 将展开它并将光标放在 <code>{[=17=]}
点而不提供任何扩展字段。这将允许您触发它,然后立即触发第二个,而无需先按 Tab。
不过,这只是节省了一次按键操作。
虽然这不是一个通用的解决方案,但这是使用核心 Sublime 执行您想要的操作的另一种方法。
首先,您需要在 User
包中创建一个如下所示的 tmPreferences
文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>scope</key>
<string>source.php</string>
<key>settings</key>
<dict>
<key>shellVariables</key>
<array>
<dict>
<key>name</key>
<string>muletilla</string>
<key>value</key>
<string><![CDATA[if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');]]>
</string>
</dict>
</array>
</dict>
<key>uuid</key>
<string>75888874-b1ed-460d-ab0e-9d1741d50188</string>
</dict>
</plist>
文件名无关紧要(只有扩展名很重要),您需要将 scope
更改为适当的。
在 shellVariables
中定义自定义变量及其内容。此示例创建一个名为 muletilla
的变量,其内容是您的第一个代码段(通用文本)的第一行。
注意CDATA
的内容是逐字插入的;这意味着任何前导或尾随换行符都将进入,并且您不能在值中使用任何变量替换,因为它们将被插入 as-is 而不会进一步扩展。
有了这个,你的第一个片段就变成了:
<snippet>
<content><![CDATA[
${muletilla}
[=11=]
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>muletilla</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.php</scope>
<description>Create the mulelitlla!</description>
</snippet>
第二个片段变为:
<snippet>
<content><![CDATA[
${muletilla}
class Custom${1:Module}Controller extends SugarController
{
public function action_${2:name}()
{
${0:// add logic here}
}
}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>controller</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.php</scope>
<description>create a custom controller</description>
</snippet>
这适用于这种情况,但在您希望通用文本包含某种占位符的情况下会失效。如果你想改变它,你必须记住你定义变量的位置,而不是简单地引用另一个片段,这也可能更痛苦。
生命短暂,所以我正在创建一组片段。其中一个名为 Muletilla.sublime-snippet
,看起来像这样
<snippet>
<content><![CDATA[
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
${1:}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>muletilla</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.php</scope>
<description>Create the mulelitlla!</description>
</snippet>
输出为
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
另一个名为 CreateCustomController.sublime-snippet
,看起来像这样:
<snippet>
<content><![CDATA[
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
class Custom${1:Module}Controller extends SugarController
{
public function action_${2:name}()
{
${3:// add logic here}
}
}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>controller</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.php</scope>
<description>create a custom controller</description>
</snippet>
如您所见,我需要再次使用 muletilla
输出,并且我需要在其他代码段中执行相同的操作。是否可以将一个片段的输出包含在另一个片段中?
在这种情况下,在我创建的任何其他片段中使用 muletilla
的输出。
提前致谢
从我猜你想要它的意义上来说,这种事情是不可能直接发生的,你可以在第二个片段中添加一些东西来告诉它它应该提取第一个片段的内容并且将它连同其他所有内容一起插入。
人们可能会认为插件可以在片段即将展开时捕获并即时重写它。但是,在一般情况下,当要插入片段时,插件没有真正的方法来捕获,因为缓冲区完成,sublime-snippet
和 sublime-completions
文件都混合在可以完成的项目列表中。
一个潜在的解决方案是一个插件,它从其他地方获取它的片段数据,并将它们作为定制的完成提供,而不是直接使用片段。在那种情况下,插件本身将负责提供插入的内容,它可以根据需要重写这些内容。
另一种解决方案是允许您以中间格式指定代码段的程序包,以便它可以为您生成最终代码段,在这种情况下,它将减轻必须手动更新所有代码段的负担当 sub-snippet 改变时。
就是说,不幸的是,我不知道有任何现有的软件包可以执行这些操作。
对于您问题中概述的情况,如果您将第一个片段的末尾指定为 [=15=]
而不是 </code>,Sublime 将展开它并将光标放在 <code>{[=17=]}
点而不提供任何扩展字段。这将允许您触发它,然后立即触发第二个,而无需先按 Tab。
不过,这只是节省了一次按键操作。
虽然这不是一个通用的解决方案,但这是使用核心 Sublime 执行您想要的操作的另一种方法。
首先,您需要在 User
包中创建一个如下所示的 tmPreferences
文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>scope</key>
<string>source.php</string>
<key>settings</key>
<dict>
<key>shellVariables</key>
<array>
<dict>
<key>name</key>
<string>muletilla</string>
<key>value</key>
<string><![CDATA[if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');]]>
</string>
</dict>
</array>
</dict>
<key>uuid</key>
<string>75888874-b1ed-460d-ab0e-9d1741d50188</string>
</dict>
</plist>
文件名无关紧要(只有扩展名很重要),您需要将 scope
更改为适当的。
在 shellVariables
中定义自定义变量及其内容。此示例创建一个名为 muletilla
的变量,其内容是您的第一个代码段(通用文本)的第一行。
注意CDATA
的内容是逐字插入的;这意味着任何前导或尾随换行符都将进入,并且您不能在值中使用任何变量替换,因为它们将被插入 as-is 而不会进一步扩展。
有了这个,你的第一个片段就变成了:
<snippet>
<content><![CDATA[
${muletilla}
[=11=]
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>muletilla</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.php</scope>
<description>Create the mulelitlla!</description>
</snippet>
第二个片段变为:
<snippet>
<content><![CDATA[
${muletilla}
class Custom${1:Module}Controller extends SugarController
{
public function action_${2:name}()
{
${0:// add logic here}
}
}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>controller</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.php</scope>
<description>create a custom controller</description>
</snippet>
这适用于这种情况,但在您希望通用文本包含某种占位符的情况下会失效。如果你想改变它,你必须记住你定义变量的位置,而不是简单地引用另一个片段,这也可能更痛苦。