是否可以在另一个片段中包括一个片段的输出



生活很短,所以我正在创建一组摘要。其中一个名为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输出,并且我需要在其他Snipptes中进行相同的操作。可以在另一个片段中包含一个摘要的输出?

在这种情况下,在我创建的任何其他片段中使用muletilla的输出。

预先感谢

从我猜想的意义上说,这种事情是不可能的第一个片段的内容并将其与其他所有内容一起插入。

人们可能会认为插件即将扩展并随时进行重写时,插件可能会捕获。但是,当摘要即将在一般情况下插入时,插件没有真正的方法可以捕获,因为缓冲区完成, sublime-snippetsublime-completions文件都在可以完成的项目列表中混合在一起。

一个潜在的解决方案将是一个插件,该插件从其他地方源为片段数据,并将其作为自定义完成,而不是直接使用片段。在这种情况下,插件本身将负责提供插入的内容,可以根据需要重写。

另一个解决方案是一个包装,允许您以中间格式指定摘要,以便它可以为您生成最终片段,在这种情况下,它将负担在当时必须手动更新所有片段的负担子刺激变化。

也就是说,不幸的是,我不知道有任何执行这些事情的包裹。

对于您的问题中概述的案例,如果将第一个摘要的结尾指定为${0}而不是${1} Sublime,则将其扩展并将光标放在{$0}点上,而无需提供任何扩展字段。这将使您触发它,然后立即触发第二个无需首先按标签触发。

但是,这只是保存关键按下。


尽管这不是一般解决方案,但这是使用Core 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的内容已插入 verbatim ;这意味着任何领先或尾随的新线都将进入,并且您不能使用该值中的任何变量替换,因为它们将被插入,而不会进一步扩展。

将您的第一个片段变成:

<snippet>
  <content><![CDATA[
${muletilla}
${0}
]]></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>

这适用于这样的案例,但在您希望常见文本包含某种位置的情况下掉落。这也可能是更多的痛苦,因为您必须记住如果要更改变量,而不是简单地引用另一个片段。


最新更新