如何在 textmate 包中创建片段子文件夹

How to create snippet subfolders in textmate bundle

我刚刚发现了 textmate,我很喜欢它。我很想用它来存储我自己的片段。我知道如何在 textmate 中执行此操作,但因为我想添加大量片段,所以我不希望它们变得杂乱无章。我想将它们添加到相关包下的有组织的子文件夹中。例如,在 shell 脚本包下,我想添加一个文件夹,将我所有的网络片段保存在一起。我无法在任何地方找到如何做到这一点,但我知道它可以完成,因为一些捆绑包是这样组织的......帮助

我通过大量的试验和错误设法解决了这个问题,并从这个超级用户开始 answer

在 TextMate 2.0 中执行此操作的唯一方法是手动编辑捆绑包的 info.plist 文件。我建议在捆绑包的导出副本上执行此操作并将其重新加载到 textmate 中。要导出包,请在包编辑器中右键单击包,然后单击 Export Bundle...

首先在 plist 文件的顶层添加一个 mainMenu 部分:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    ...
    <key>mainMenu</key>
    <dict>
    </dict>
  </dict>
</plist>

据我所知,mainMenu 字典支持 3 个键:excludedItemsitemssubmenusexcludedItemsitems 是包含捆绑项(片段、命令等)或子菜单的 UUID 列表的数组。您可以通过在 textmate 中打开并找到 uuid 键来获取命令或片段的 UUID;它看起来像:

<key>uuid</key>
<string>0A2DB1AC-3049-4BD5-8931-641E716990F9</string>

获得项目的 UUID 后,您可以将它们列在 items 中,以按照您希望的顺序填充捆绑菜单,例如:

<key>items</key>
<array>
  <string>409b0e74-9ab5-4d35-b957-9ddf23a71c0c</string>
  <string>------------------------------------</string>
  <string>d2c991dc-a00e-4247-8479-f2d29f387319</string>
</array>

如果您使用一系列 - 字符代替 UUID,它将在菜单中创建一个分隔符。同样,如果您不想在捆绑菜单中显示某些片段,您可以将它们添加到 excludedItems.

要创建子菜单,您必须在 submenus 中定义它们,如下所示:

<key>submenus</key>
<dict>
    <key>71BE58B2-E486-4B21-93F1-C208D4914099</key>
    <dict>
        <key>items</key>
        <array>
            <string>6D0B2B9D-62C7-4842-BA28-F3379E887D93</string>
            <string>CADC55BD-0D0A-48C8-B296-35FA7AAE09CA</string>
        </array>
        <key>name</key>
        <string>C++ Snippets</string>
    </dict>
</dict>

每个子菜单都需要在 <key>...</key> 内有一个关联的 UUID。我从在线 UUID generator 创建了一个。然后,您可以将子菜单的 UUID 添加到顶级 items 数组,以将子菜单添加到您的捆绑包的菜单中。

最后,当您将捆绑包加载到 textmate 时,您必须首先从以下位置删除捆绑包的所有缓存实例:

~/Library/Application Support/Avian/Bundles
~/Library/Application Support/Avian/Pristine Copy/Bundles

如果不这样做,textmate 有时会忽略新加载的包。不确定是否有更简洁的方法来重新加载捆绑包,但删除它对我有用。

有关完整示例,请参阅我 Github 上的 ROS 包中的 this commit

关于上述出色答案的一些额外信息

从 TM2 rc23 开始,您可以通过在捆绑编辑器中右键单击现有项目来访问它的 UUID window(使用 cntrl-option-command-B 访问)

您可以在 terminal.app 中使用命令 uuidgen 创建一个 UUID(如果您经常使用此命令,也可以将其设为命令)

TM2 不需要清除缓存 - 它会监视 plist 中的更改。

@user96157 对此很清楚,但请注意,您还必须将新的子菜单添加到主菜单。所以:

<key>mainMenu</key>
<dict>
    <key>items</key>
    <array>
    <string>COPY-UUID-FOR-YOUR-NEW-SUB-MENU-HERE!</string>