【问题标题】:vscode map user snippets to file extensionsvscode 将用户片段映射到文件扩展名
【发布时间】:2015-09-08 06:21:14
【问题描述】:

VSCode 具有按语言用户 sn-ps 的强大功能(例如在xml.json 中)。

有没有办法将这些 sn-ps 映射到文件扩展名

我的情况:我最近开发了很多xml。我们大约有三个 xsd 文件,并用文件扩展名命名它们的实例(因此foo.xsd 的实例被命名为my-instance.foo 而不是my-instance.xml)。我将最常见的部分构建为用户 sn-ps 以节省我的时间。然而,不同的 xsd 创建具有不同含义的相似元素(例如,一个创建 <foo bar="baz"/>,一个创建 <foo baz="bar"/>),因此为 xml 语言定义前缀为 "foo" 的用户 sn-p 将是模棱两可的。

我可以为前缀添加前缀(例如创建afoobfoo),但这感觉不自然。有没有更好的说法“虽然foos 都属于xml 语言,一个属于x 类型的文件,一个属于y”?

【问题讨论】:

    标签: visual-studio-code


    【解决方案1】:

    Visual Studio Code 目前不支持每个文件扩展名使用相同语言的不同 sn-ps。

    但是通过为xsd 定义单独的语言来解决它有一个hacky 的方法。自己决定是否要这样做。我在 Windows 上使用 0.8.0 版(内部预览版)对其进行了测试。

    1. 转到 VSCode 的插件文件夹:%CODE%\resources\app\plugins 并创建 vs.language.xml 的副本。将复制的文件夹命名为vs.language.xsd

    2. 在 VSCode 中打开 vs.language.xsd

    3. ticino.plugin.json的内容替换为

      {
          "pluginId": "vs.language.xsd",
          "activationEvents": ["textModel:xsd"],
          "mainModule": "./out/xmlMain",
          "contributes": {
              "language": [{
                  "id": "xsd",
                  "extensions": [ ".xsd", ".foo"],
                  "firstLine" : "(\\<\\?xml.*)|(\\<svg)|(\\<\\!doctype\\s+svg)",
                  "aliases": [ "XSD", "xsd" ],
                  "mimetypes": ["text/xml", "application/xml", "application/xaml+xml"]
              }]
          },
          "scripts": {
              "compile": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../gulpfile.plugins.js compile-plugin:vs.language.xsd"
          },
          "_bundling": [
              { "name": "./out/xmlMain" },
              { "name": "./out/xmlWorker" }
          ]
      }
      
    4. xmlDef.json开放。将displayName 的值从XML 更改为XSD。将name 的值从xml 更改为xsd

    5. List 将xmlMain.js的内容替换为

      'use strict';
      define(["require", "exports", './xmlDef', 'monaco'], function (require, exports, languageDef, monaco) {
          function activate() {
              monaco.Modes.registerMonarchDefinition('xsd', languageDef.language);
              var myWorker = monaco.Modes.loadInBackgroundWorker(require.toUrl('./xmlWorker.js'));
              function format(resource, range, options) {
                  return myWorker.then(function (w) {
                      var model = monaco.Services.ModelService.getModel(resource);
                      var value = range ? model.getValueInRange(range) : model.getValue();
                      if (value.length < 1024 * 1024) {
                          return w.beautify(value, {
                              indent_size: options.insertSpaces ? options.tabSize : 1,
                              indent_char: options.insertSpaces ? ' ' : '\t',
                              wrap_line_length: 256
                          });
                      }
                      else {
                          return null;
                      }
                  }).then(function (result) {
                      if (result) {
                          return [{
                                  range: range,
                                  text: result
                              }];
                      }
                      else {
                          return null;
                      }
                  });
              }
              monaco.Modes.FormattingSupport.register('xsd', {
                  formatDocument: function (resource, options) {
                      return format(resource, null, options);
                  },
                  formatRange: function (resource, range, options) {
                      return format(resource, range, options);
                  }
              });
          }
          exports.activate = activate;
      });
      
    6. 重启 VSCode。现在您可以转到File -&gt; Preferences - User Snippets 并选择语言XSD。您可以在此处定义所有.xsd.foo 相关的sn-ps。

    正如我之前提到的:这真的很hacky。应用此功能后,XSD 文件中的代码突出显示看起来略有不同。如果您不喜欢结果,则只需删除文件夹 vs.language.xsd,一切都会像以前一样运行。

    【讨论】:

    • 哇,感谢您对 vscode 的深入了解。不好的是它还不支持开箱即用。我会在找到时间后立即对其进行测试(然后接受,同时我刚刚对您的答案投了赞成票)。
    猜你喜欢
    • 2013-01-04
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2021-10-31
    相关资源
    最近更新 更多