用 VSCode 用的越多,越觉得这软件很可惜……

VSCode 做对了很多事情,但是有一点十分可惜:只能用 JSON 写配置,而不能用脚本语言(比如 JS/TS)来写(作为可选项,默认 JSON,但可以改成使用脚本语言)。

这一点缺失有的不便之处包括:想要针对不同系统做不同的设置(如设置某个无法添加到 PATH 中的外部程序的路径)很麻烦,VSCode 的 JSON 只能对不同的语言指定不同设置("[c]" 等),而无法通过 JSON 在不同的系统间设置,需维护多套配置,而这么做存在面临着要同步共通的设置的困难。

1 个赞

VS Code 作为一个 Web 出身的编辑器,易用、可扩展(而非高扩展)、使用方便即可,它的用户可能都并不愿意花时间专门学一门“配置语言”。JSON 作配置语言简洁明了,几乎没有学习负担,虽然作为标记语言,并没有其他脚本语言那么灵活,但是已经完全足够了。

一般来说,用项目文件夹下的 .vscode 覆盖就足矣。

有一些配置显然是支持的,我记得有个 default shell 什么之类的配置好像就可以指定平台。其他情况其实都没有那么必要,况且之前不是还推出了 profile 功能。

总之你可不能用 Emacs 的特性来要求其他软件。每个软件都有自己的使命,不一定要满足所有的 Use Case,例如支持脚本语言进行配置很可能引入一些会被恶意代码利用的漏洞,反而得不偿失。

1 个赞

我在一层已经说了


还得考虑如何在不同 profile 之间同步共通的设置,不方便。

如果用了脚本语言,我就可以用类似下面的方法(下面是伪代码)表达、而无需维护多个 profile 了:

if (core.system == system.windows) {
  prop.xxx.xxxPath = "......";
} else {
  prop.xxx.xxxPath = "......";
}

或者:

prop.xxx.xxxPath = (core.system == system.windows) ? "..." : "...";

很多插件并不会使用这个 default shell,而是会使用系统的 shell,例如 CMake Tools 生成 build 文件夹/构建/调试的时候就不会去用这个 default shell。

我知道你说了可选。而我也说了,即使真的有,安全性、维护性都是问题,也很可能会让这个软件的插件生态变得混乱。就像我个人并不喜欢 neovim 既支持 vimscript 又支持 lua,尽管前者是向前兼容的无奈之举,因为我光为了一个编辑器就要学习两种配置语言,无疑增加了复杂性。

现在有基本的覆盖机制,default 配置覆盖别的。你说的同步互通是啥意思呀?如果只是云同步的话,至少我现在用起来没什么问题。

neovim 社区是以 Lua 为主流的,这倒不用担心,要不然他们也不会添加 Lua Support 了;而且 vimscript 可编程性也比 JSON 强太多了。

1 个赞

这个怎么设置?没怎么听说过。 :thinking:

具体可以看更新公告:

对应的配置项是 workbench.profiles.applicationSettings,可以看 Profiles feature request: Ability to apply user settings across all profiles · Issue #176813 · microsoft/vscode · GitHub 这里的讨论。

夹带私货安利一下我自己之前讲 profile 配置的一个视频:【VSCode 更新】v1.81 更新了什么?Profile 功能推荐_哔哩哔哩_bilibili 可以 2:53 开始看。

這個應該算是題外話, 回應標題; 所以我花了很多時間把 Visual StudioVSCode 的功能抄過來 :smirk: Emacs VS(Code) · GitHub.

4 个赞

最近一直在用vscode,总结了以下几优点:

  1. 界面重绘(redisplay)比emacs强很多倍
  2. 小组件(widget)显示精确程序比emacs强(这一点似乎是因为vscode在代码编辑界面字体大小是相同的,行高等等也相同,比较好定位)
  3. 与各种语言、工程相关的补全、提示、跳转,比emacs下的所有lsp要好配置很多

缺点/扩展能力不足的地方:相比于emacs,编辑器本身扩展性很差。我偿试写一个插件,想把编辑快捷键改成emacs下的c-n,c-p等。看了下现在市面上的所有插件,基本都是写个类似的命令,然后在packge.json中定义一个快捷键:

  {
    "key": "cmd+n",
    "command": "cursorDown",
    "when": "isMac && textInputFocus"
  }

注意那个when,当when的条件为真时,才按cmd+n才执行command。问题是,这个when只能在package.json中声名,在插件API中没有提供when相关的API,以至于要写个普适的按键逻辑,比如在任意情况下都是按ctrl-n向下,是很麻烦的,必须在package.json中定义许多相同的逻辑。

总之就是目前vscode的API还是过于封闭,插件开发者在许多情况,没有API可拱调用,要么功能实现不了,要么就是在package.json中定义一坨东西。

3 个赞

简单的配置用 JSON,想要复杂一点的配置自己写 extension,这样小白用户不需要什么门槛就能上手,而 extension 也可以实现你想要的各种功能。这是其实做了两层,要把 JSON 这一层改成脚本语言就失去了做两层的意义。

extension 能做到我在第一层说的需求么?建议再认真读一下。 :melting_face:

1 个赞

用json写配置也太憋屈了,vscode的settings就不是手写能写出来的

1 个赞

JSON只是个储存格式把,普通用户正常应该不太需要手动维护json配置的,除非是做一些简单的debug进程启动参数配置

有一说一,想起当年刚接触编程,带我那个人用的是Sublime,那时还没有vscode,第一次看到修改设置是用json,那时觉得多么新奇。

是的,为了把一些按键改成我想要的emacs方式,同时在linux和mac下有相同的按键布局,我的按键配置已经有2300多行了,但还是不完善