是否可以在 vscode 中定义自定义/本地 linter?

Hub*_*bro 8 static-analysis visual-studio-code

我有一个简单的自制 linter 用于工作,它的调用方式如下:python3 scripts/lint.py FILENAME

输出是完全标准的 linter 样式输出,例如:

path/to/file.yang:5:19:此处的 Linter 警告
path/to/file.yang:6:83:这里还有另一个警告
...

我觉得将这个 linter 集成到 vscode 中应该很容易,这样我在编写代码时就可以自动进行 linting,就像 linter 扩展的工作原理一样。然而,谷歌搜索“vscode custom linter”绝对没有产生任何价值。

是否可以在不经历编写自定义扩展的麻烦的情况下做到这一点?

rio*_*oV8 2

这是可以完成的,但涉及一些设置编辑。

删除默认的按键绑定Ctrl+S并设置 2 个新的按键绑定

keybindings.json

  {
    "key": "ctrl+s",
    "command": "-workbench.action.files.save"
  },
  {
    "key": "ctrl+s",
    "command": "multiCommand.lintingYang",
    "when": "editorLangId == yang"
  },
  {
    "key": "ctrl+s",
    "command": "workbench.action.files.save",
    "when": "editorLangId != yang"
  }
Run Code Online (Sandbox Code Playgroud)

使用 ryuta46 的扩展multi-command创建一个保存文件并调用自定义 linter 的命令:(添加一点等待以确保文件已保存)

.vscode/settings.json

  "multiCommand.commands": [
    {
      "command": "multiCommand.lintingYang",
      "interval": 500,
      "sequence": [
        "workbench.action.files.save",
        { "command": "workbench.action.tasks.runTask",
          "args": "Lint Yang"
        }
      ]
    }
  ]
Run Code Online (Sandbox Code Playgroud)

linter 调用是一个具有自定义问题匹配器的任务

.vscode/tasks.json

    {
      "label": "Lint Yang",
      "type": "shell",
      "command": "python3",
      "args": [ "${workspaceFolder}/scripts/lint.py", "${file}"],
      "options": { "cwd": "${fileDirname}" },
      "presentation": { "clear": true },
      "problemMatcher": {
        "owner": "yang",
        "fileLocation": ["relative", "${workspaceFolder}"],
        "pattern": [
          "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
          "file": 1,
          "line": 2,
          "column": 3,
          "severity": 4,
          "message": 5
        ]
      }
    }
Run Code Online (Sandbox Code Playgroud)

编辑

定义一个捕获异常情况的键绑定应该足够了,否则它将使用默认的键绑定。

keybindings.json

  {
    "key": "ctrl+s",
    "command": "multiCommand.lintingYang",
    "when": "editorLangId == yang"
  }
Run Code Online (Sandbox Code Playgroud)