当前位置: 首页 > article >正文

VSCode 插件开发实战(五):实现新语言支持和语法高亮

前言

通过自定义插件,开发者可以为 VS Code 添加特定编程语言的支持,包括语法高亮、代码片段、自动补全等功能。在这篇教程中,我们将深入探讨如何从零开始为 VS Code 创建一个自定义插件,以支持一种新的编程语言,并实现其语法高亮。这将为你提供一个全面的指导,使你能够更好地利用 VS Code 强大的扩展能力。

定义新语言

package.json 文件是插件的配置文件,我们需要在这里定义语言支持和语法高亮的相关信息。

以下是一个简单的 package.json 配置示例:

{
  "name": "my-language-support",
  "displayName": "My Language Support",
  "description": "Support for My Language",
  "version": "0.0.1",
  "engines": {
    "vscode": "^1.60.0"
  },
  "categories": [
    "Languages"
  ],
  "contributes": {
    "languages": [
      {
        "id": "myLanguage",
        "aliases": ["My Language", "mylang"],
        "extensions": [".mylang"],
        "configuration": "./language-configuration.json"
      }
    ],
    "grammars": [
      {
        "language": "myLanguage",
        "scopeName": "source.mylang",
        "path": "./syntaxes/myLanguage.tmLanguage.json"
      }
    ]
  }
}

定义语法高亮

为了实现语法高亮,我们需要创建一个 TextMate 语法文件。首先,创建一个 syntaxes 目录,并在其中创建 myLanguage.tmLanguage.json 文件。以下是一个简单的语法定义示例:

{
  "scopeName": "source.mylang",
  "patterns": [
    {
      "match": "\\b(keyword1|keyword2|keyword3)\\b",
      "name": "keyword.other.mylang"
    },
    {
      "match": "\\b[0-9]+\\b",
      "name": "constant.numeric.mylang"
    },
    {
      "match": "\".*?\"",
      "name": "string.quoted.double.mylang"
    }
  ],
  "repository": {}
}

这个文件定义了三种语法元素:

  • keyword1、keyword2 和 keyword3 作为关键词高亮显示。
  • 数字作为常量高亮显示。
  • 双引号包裹的内容作为字符串高亮显示。

配置语言特性

为了更好地支持你的新语言,可以配置一些语言特性。例如,创建一个 language-configuration.json 文件来配置注释、括号匹配等:

{
  "comments": {
    "lineComment": "//",
    "blockComment": ["/*", "*/"]
  },
  "brackets": [
    ["{", "}"],
    ["[", "]"],
    ["(", ")"]
  ],
  "autoClosingPairs": [
    { "open": "{", "close": "}" },
    { "open": "[", "close": "]" },
    { "open": "(", "close": ")" },
    { "open": "\"", "close": "\"" }
  ]
}

添加代码片段

代码片段(Snippets)是开发者常用的功能,可以通过简短的缩写快速插入常用的代码模板。我们可以在 package.json 中添加代码片段的配置。

首先,创建一个 snippets 文件夹,并在其中创建一个 myLanguage.code-snippets 文件。以下是一个代码片段的示例:

{
  "Print to console": {
    "prefix": "print",
    "body": [
      "print(\"$1\");"
    ],
    "description": "Print to the console"
  }
}

这个片段定义了一个缩写 print,当输入 print 并触发代码片段时,它会自动展开为 print(“”);,并将光标置于引号之间。

在 package.json 中添加以下配置,将此代码片段关联到插件:

{
  "contributes": {
    "snippets": [
      {
        "language": "myLanguage",
        "path": "./snippets/myLanguage.code-snippets"
      }
    ]
  }
}

添加自动补全(IntelliSense)

自动补全是现代编辑器的重要功能之一。VS Code 提供了丰富的 API 来支持这一特性。我们可以在 src/extension.ts 文件中添加自动补全的逻辑。

首先,创建一个 providers 文件夹,并在其中创建一个 completionProvider.ts 文件。以下是一个简单的自动补全提供者示例:

import * as vscode from 'vscode';

export class MyLanguageCompletionItemProvider implements vscode.CompletionItemProvider {
  public provideCompletionItems(
    document: vscode.TextDocument,
    position: vscode.Position,
    token: vscode.CancellationToken,
    context: vscode.CompletionContext
  ): vscode.CompletionItem[] {
    const completionItems: vscode.CompletionItem[] = [];

    const keywords = ['keyword1', 'keyword2', 'keyword3'];
    for (const keyword of keywords) {
      const item = new vscode.CompletionItem(keyword, vscode.CompletionItemKind.Keyword);
      completionItems.push(item);
    }

    return completionItems;
  }
}

然后,在 src/extension.ts 文件中注册这个提供者:

import * as vscode from 'vscode';
import { MyLanguageCompletionItemProvider } from './providers/completionProvider';

export function activate(context: vscode.ExtensionContext) {
  console.log('Congratulations, your extension "my-language-support" is now active!');

  const provider = new MyLanguageCompletionItemProvider();
  const disposable = vscode.languages.registerCompletionItemProvider('myLanguage', provider);

  context.subscriptions.push(disposable);
}

export function deactivate() {}

添加代码格式化

代码格式化可以帮助开发者保持代码风格一致。我们同样可以在 src/extension.ts 中添加代码格式化的逻辑。

创建一个 formattingProvider.ts 文件:

import * as vscode from 'vscode';

export class MyLanguageDocumentFormattingEditProvider implements vscode.DocumentFormattingEditProvider {
  provideDocumentFormattingEdits(
    document: vscode.TextDocument,
    options: vscode.FormattingOptions,
    token: vscode.CancellationToken
  ): vscode.TextEdit[] {
    const textEdits: vscode.TextEdit[] = [];

    // 示例:将所有内容转换为大写
    const fullText = document.getText();
    const fullRange = new vscode.Range(
      document.positionAt(0),
      document.positionAt(fullText.length)
    );
    textEdits.push(vscode.TextEdit.replace(fullRange, fullText.toUpperCase()));

    return textEdits;
  }
}

在 src/extension.ts 文件中注册这个格式化提供者:

import * as vscode from 'vscode';
import { MyLanguageCompletionItemProvider } from './providers/completionProvider';
import { MyLanguageDocumentFormattingEditProvider } from './providers/formattingProvider';

export function activate(context: vscode.ExtensionContext) {
  console.log('Congratulations, your extension "my-language-support" is now active!');

  const completionProvider = new MyLanguageCompletionItemProvider();
  const formattingProvider = new MyLanguageDocumentFormattingEditProvider();

  const disposableCompletion = vscode.languages.registerCompletionItemProvider('myLanguage', completionProvider);
  const disposableFormatting = vscode.languages.registerDocumentFormattingEditProvider('myLanguage', formattingProvider);

  context.subscriptions.push(disposableCompletion, disposableFormatting);
}

export function deactivate() {}

总结

通过这篇教程,我们详细讲解了如何为 VS Code 创建一个自定义插件,以支持新的编程语言,涵盖了语法高亮、代码片段、自动补全和代码格式化等关键功能。这不仅为你的编程工作流提供了更高的效率,也展示了 VS Code 强大且灵活的扩展能力。


http://www.kler.cn/a/450046.html

相关文章:

  • 【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题
  • 一个比RTK或redux更轻量级更易使用的 React 第三方状态管理工具库的配置与使用
  • 什么是MVCC?
  • springboot472基于web网上村委会业务办理系统(论文+源码)_kaic
  • 【信号滤波 (上)】傅里叶变换和滤波算法去除ADC采样中的噪声(Matlab/C++)
  • DataX与DataX-Web安装与使用
  • JavaEE进阶--mybatis使用测试日志参数传递浏览器访问
  • WPF 最小化到系统托盘
  • Vue3入门(7)
  • SQL语句整理五-StarRocks
  • 后端项目java中字符串、集合、日期时间常用方法
  • Strip Map和Wafer Map的一些小科普
  • Android修行手册 - 移动端几种常用动画方案对比
  • LLMs之PDF:MinerU(将PDF文件转换成Markdown和JSON格式)的简介、安装和使用方法、案例应用之详细攻略
  • Mac iOS、Android、Flutter、React Native开发环境配置
  • 【专题】2024抖音电商母婴行业分析报告汇总PDF洞察(附原数据表)
  • 【ArcGIS Pro】实现一下完美的坐标点标注
  • “年轻科技旗舰”爱玛A7 Plus正式发布,全国售价4999元
  • 【人工智能】探索当下热门视频生成模型
  • Elasticsearch:确保业务规则与语义搜索无缝协作
  • 项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(二)
  • MySQL数据库——复制表数据与结构
  • Zookeeper基本命令解析
  • 设计模式-访问者设计模式
  • linux Sudo权限
  • 《探秘 Qt Creator Manual 4.11.1》