ctrl+shift+p filters: :st2 :st3 :win :osx :linux
浏览

LSP-pyvoice

mpourmpoulis ST4

Sublime Text插件,用于pyvoice指令式Python代码的实验性语言服务器

详细信息

安装

  • 总数 12
  • Win 8
  • Mac 4
  • Linux 0
8月6日 8月5日 8月4日 8月3日 8月2日 8月1日 7月31日 7月30日 7月29日 7月28日 7月27日 7月26日 7月25日 7月24日 7月23日 7月22日 7月21日 7月20日 7月19日 7月18日 7月17日 7月16日 7月15日 7月14日 7月13日 7月12日 7月11日 7月10日 7月9日 7月8日 7月7日 7月6日 7月5日 7月4日 7月3日 7月2日 7月1日 6月30日 6月29日 6月28日 6月27日 6月26日 6月25日 6月24日 6月23日
Windows 0 2 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Mac 0 2 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Linux 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

自述文件

源代码
raw.​githubusercontent.​com

LSP-pyvoice

这是pyvoice的Sublime Text部分

特性

此插件作为LSP软件包实现,并提供以下功能

  • 它自动管理为您 own separate virtual environment 在Sublime Text存储路径中 installer and updating the pyvoice-language-server pypi package(参见 lsp_utils

  • 它监听用户事件,例如打开文件,聚焦选项卡,编辑其内容,并适当触发服务器生成将它们的发音映射到相关物品的提示,例如

    • 表达式(正确格式化的)
    • 可以导入的模块和符号

[!笔记] 目前,插件不会在更改当前选择时触发语音提示的重新生成。这将在未来被改变,但目前您可以通过命令框cmd 下面 或语音命令手动触发它

  • 它向Sublime LSP客户端提供自定义通知处理程序,用于接收那些语音提示

  • 它通过IPC机制管理与语音编程框架的通信,并将所有必要的信息从语言服务器转发到语音编码系统

安装

先决条件

  • 请确保您的系统已安装某种版本的 Python(https://www.pythonlang.cn/downloads/)>= 3.8,这是安装和运行 pyvoice 可执行文件所需的。

  • 请确保您在 Sublime Text 中安装了 Package Control。如果是第一次安装,可能需要重启 Sublime Text。

  • 此包实现为语言服务器,因此依赖于 LSP。通过 Package Control 安装它。

    • 打开命令面板 ctrl+shift+pcmd+shift+p
    • 运行 Package Control: Install Package
    • 搜索 LSP 并安装它。
    • 根据您安装的构建和 LSP 版本,可能需要重新启动 Sublime Text。

安装插件

通过 Package Control 安装此包 - 打开命令面板 ctrl+shift+pcmd+shift+p - 运行 Package Control: Install Package - 输入 LSP-pyvoice 并安装它。

导航到任何 Python 文件,您应该在状态中看到这些内容。

您可能需要重新启动 Sublime Text。

安装语法

  • 对于 talon,可以使用 https://github.com/PythonVoiceCodingPlugin/pyvoice_talon

  • 对于 caster,可以使用 https://github.com/PythonVoiceCodingPlugin/pyvoice_caster

设置

本项目基于标准的 LSP 客户端配置

默认设置

{
    // the command that actually launches the server process
    // leave this as is to use the automatically installed
    // pyvoice language server
    "command": [
        "$server_path"
    ],

    // the python interpreter to use for installing and running
    // the pyvoice language server. it should be 3.8 and above
    // pypy may also work. If null, the plug-in will try to
    // automatically pick a suitable interpreter
    "python_binary": null,

    // environment variables to set when running the language server
    "env": {},

    // set the log level for the CLIENT SIDE code of the plugin
    // for example these will produce logs concerning 
    // - the interprocess communication with the programming 
    //   by voice framework
    // - when the plug-in chooses to synchronize spoken hints
    //   by sending a request to the language server and 
    //   forrewarding them to the programming by voice system
    // etc..
    // it does not affect the level of the logs
    // that the language server produces itself like
    // - any errors detected during semantic analysis
    // - metadata about the hints that it generates
    // etc..
    "log_level":"warning",

    // selectors to match the files that the language server
    // is responsible for
    "selector": "source.python",



    // a set of settings/config that will be sent to the language server
    // via workspace/didChangeConfiguration notification
    // or retrieved by the workspace/configuration server side request.
    // these allow you to customize how pyvoice processes each of your projects

    "settings": {
        // Project settings used for configuring jedi Project

        // The base path where your python project is located.
        // Like all paths in this settings file it can be either
        // absolute or relative to the path of the sublime project.
        // By default, it resumed to be  the same folder that you have open
        // in the sublime window, but if your pipe and project is part
        // of a larger repository ,you should set this to the subdirectory 
        // containing your python code.for example:
        //      "project.path": "backend"
        "project.path": ".",

        // The path to the virtual environment for this project
        // again either absolute or relative to the sublime folder.
        // (NOT the project.path setting above)
        //
        // Furthermore, it could point either to the root of that environment,
        // or the python binary inside that environment 
        //      - "project.environmentPath": ".venv"
        //      - "project.environmentPath": ".venv/bin/python"
        //      - "project.environmentPath": ".venv\\Scripts\\python.exe"
        //
        //
        // WARNING
        //
        // while jedi will not execute python code from your code base
        // it WILL execute the python binary of the associated environment!
        // There are automated checks in place to guard against binaries 
        // that could for example have been injected by an attacker inside
        // vcs controlled files. You can find more about this mechanism in 
        //      https://jedi.readthedocs.io/en/latest/_modules/jedi/api/environment.html
        //      under the _is_safe function.
        //
        // However, it is still a good idea to only point this setting
        // to environments that you trust.
        "project.environmentPath": null,

        // A list of paths to override the sys path if needed.
        // Leave this null to generate sys.path from the environment.
        // WARNING: This will COMPLETELY override the sys.path 
        // generated from the environment.
        "project.sysPath": null,

        // Adds these paths at the end of the sys path.
        "project.addedSysPath": [],

        // If enabled (default), adds paths from local directories.
        // Otherwise, you will have to rely on your packages being properly configured on the sys.path.
        "project.smartSysPath": true,



        // Hints.Imports settings


        // Enable or disable the generation of stdlib imports.
        "hints.imports.stdlib.enabled": true,


        // Enable or disable the generation of third-party imports.
        // Pyvoice will try to automatically discover the  dependencies 
        // of your project  and  is going
        // to generate hints for their modules. In order to do so,pyvoice
        // will try:
        //
        // - pep621 dependencies in pyproject.toml
        // - poetry dependencies in pyproject.toml
        // - options.install_requires in setup.cfg
        // - traditional requirements.txt
        // 
        // NOTE: By default hints would be generated ONLY for your top level dependencies
        // aka distributions that you directly depend on, not transiet dependencies.
        "hints.imports.thirdParty.enabled": true,

        // A list of third-party distributions to include modules from.
        "hints.imports.thirdParty.includeDists": [],

        // A list of third-party distributions to exclude.
        "hints.imports.thirdParty.excludeDists": [],



        // Enable or disable the generation of project imports.
        // This generator is going to scan your project folders
        // recursively for pure python modules and generate hints for them.
        // This is performed in a manner somewhat similar to setuptools 
        //  - if the project follows a source layout, the src/ folder would be scanned
        //  - if the projects follow flat layout, hints would be generated
        //    for top level modules and recursively for top level packages
        //    that match the filters used by setuptools.discover
        //  - the explicit layout, where user maps in their pyproject.toml
        //    a set of packages/module names to folders containg their respective
        //    respective code is not supported to yet
        "hints.imports.project.enabled": true,

        // Enable or disable the generation of import hints for symbols
        // So far, all of the imports hints generators are targeting modules
        // However, there are cases where symbols like functions or classes
        // that are used so frequently in your project
        // that you want to be able to import them in a single step
        // and without having to speak the name of the containing module
        //
        // For example you might want to be able to speak
        //      `import optional`
        // in order to insert
        //      `from typing import Optional`
        //
        // The explicit symbols generator allows you to define a 
        // list of modules that you want to generate hints for their symbols
        "hints.imports.explicitSymbols.enabled": true,

        // A list of modules to generate hints hints for their defined symbols.
        "hints.imports.explicitSymbols.modules": ["typing"],



        // Hints.Expressions settings


        // Enable or disable the generation of hints hints for local scope.
        "hints.expressions.locals.enabled": true,
        // Hints from param names of the signatures of local scope variables. 
        "hints.expressions.locals.signature": true,


        // Enable or disable the generation of hints hints for non-local scope.
        "hints.expressions.nonlocals.enabled": true,
        // Hints from param names of the signatures of non-local scope variables. 
        "hints.expressions.nonlocals.signature": true,


        // Enable or disable the generation of hints hints for global scope.
        "hints.expressions.globals.enabled": true,
        // Hints from param names of the signatures of global scope variables. 
        "hints.expressions.globals.signature": true,


        // Enable or disable the generation of hints hints for built-in scope.
        "hints.expressions.builtins.enabled": true,
        // Hints from param names of the signatures of built-in scope variables. 
        "hints.expressions.builtins.signature": true,


        // An upper bound on the number of expressions to generate.
        "hints.expressions.limit": 2000,



        // Logging settings
        // Set the logging level for the pyvoice executable.
        "logging.level": "INFO"
    }
}

全局编辑设置

要编辑全局设置,请点击菜单中的以下项目

首选项 > 包设置 > LSP > 服务器 > LSP-pyvoice

或者从命令面板 ctrl+shift+pcmd+shift+p 运行 首选项: LSP-pyvoice 设置

按项目编辑设置

要编辑特定项目的设置,请点击菜单中的以下项

项目 > 编辑项目

并添加以下设置

{
    "settings":
    {
        "LSP":
        {
            "LSP-pyvoice":
            {
                // your customizations go in here
            },
        },

    },
}

例如,如果您想将 pyvoice 指向虚拟环境,您的 sublime-project 文件可能看起来像这样

{
    "settings":
    {
        "LSP":
        {
            "LSP-pyvoice":
            {
                "settings":
                {
                    "project.environmentPath": ".venv"
                }
            },
        },

    },
}

或者查看服务器的调试日志

{
    "settings":
    {
        "LSP":
        {
            "LSP-pyvoice":
            {
                "settings":
                {
                    "logging.level": "DEBUG"
                }
            },
        },

    },
}

进程间通信和安全考虑

接收语音编码框架的命令

在 Sublime Text 中执行的控制命令(如向文件添加导入语句)是通过 Sublime Text 命令行界面从语音编码框架发送的。

向语音编码框架发送命令

为了将语音提示传输到语音编程系统,采用了 AF_UNIX 套接字在 UNIX 系统上和 AF_PIPE 命名管道在 Windows 上的进程间通信机制,格式为 JSON-RPC 2.0。编程语音系统将那些套接字或管道绑定为一个监听器/服务器,Sublime Text 连接作为一个客户端。

[!NOTE] 为了保持实现尽可能简单和无状态,连接是有意地短期存在的,每个通知一个连接,并且一次只针对一个语音系统。

[!IMPORTANT] 在实现层面上,Sublime Text 客户端将利用 stdlib 的 multiprocessing.connection 机制,该机制还包含一个通过基于共享密钥的加密挑战来验证连接两端的机制。这很重要,因为存在一种竞争条件,其中具有较低权限运行的过程可能会在语音编码系统之前尝试在 Windows 上绑定命名管道,从而导致 Sublime Text 与它们交谈。共享密钥由语音系统生成,并存储在用户主目录下的 json 文件中,这应该对那些低权限用户进程不可用。话虽如此,由于单向 RPC 流的特性和无状态的设计,攻击面应该相当有限,即使在没有身份验证机制的情况下。

[!WARNING] 很遗憾,stdlib(3.8)使用的身份验证握手采用了 HMAC-MD5。只有 Python 3.12 才引入了对更强散列函数的支持,并且以向后兼容的方式扩展了握手协议。虽然这不是世界末日,但在某个时候,我必须通过 monkey patching 将改进版本回补。

服务器安全

请参阅 服务器安全注意事项

启用或禁用插件

默认情况下已启用插件。要禁用它,请打开命令面板,使用快捷键ctrl+shift+pcmd+shift+p,然后运行LSP: 全局禁用语言服务器。然后从语言服务器列表中选择LSP-pyvoice。要再次启用它,请运行LSP: 全局启用语言服务器

如果您想让它在特定项目中禁用,请打开命令面板,使用快捷键ctrl+shift+pcmd+shift+p,然后运行LSP: 在项目中禁用语言服务器。然后从语言服务器列表中选择LSP-pyvoice。要再次启用它,请运行LSP: 在项目中启用语言服务器

要重启语言服务器,请打开命令面板,使用快捷键ctrl+shift+pcmd+shift+p,然后运行LSP: 重启服务器。然后从语言服务器列表中选择LSP-pyvoice

所有的这些都可以通过菜单项工具 > LSP > 在项目中禁用语言服务器等完成。

命令

下列命令可在命令面板ctrl+shift+pcmd+shift+p中使用:

  • 首选项:LSP-pyvoice 设置
  • LSP-pyvoice: 获取语音允许您手动从服务器获取语音信息

查看日志

全LSP流量

要查看完整流量,从命令面板(ctrl+shift+pcmd+shift+p)运行LSP: 打开日志面板,或右键单击左下角的框。

您应该看到这样的面板:

许可和致谢

该项目采用GPLv3许可。我应指出,我在项目结构上基于LSP-pylsp进行模板设计,并直接借鉴了来自PackagedDev的一些日志相关代码,因此,这些代码遵循各自项目的许可证!

也值得注意,本项目灵感来源于SublimeTalon,尽管现在几乎没有共享代码。