【问题标题】:Configure Brackets Beautify extension to add new line before curly braces配置括号美化扩展以在花括号前添加新行
【发布时间】:2023-06-11 10:43:01
【问题描述】:

我正在使用Brackets Beautify 扩展,在美化我的代码时遇到了问题。

假设我有这个代码:

function test(arg1, arg2)
{
    var a = arg1 + arg2;
    return a;
}

var object = 
{
    "some" : 123,
    "some2" : 13123
}

当我点击 Ctrl + Alt + B 以美化我的代码时,上面的函数将如下所示:

function test(arg1, arg2) {
    var a = arg1 + arg2;
    return a;
}

var object = {
    "some": 123,
    "some2": 13123
}

但我希望它看起来像第一个(花括号在新行中),因为它对我来说更具可读性。

我尝试寻找解决方案,但没有成功。

顺便说一句,我说的是 JavaScript。 PHP代码没问题。

有什么想法吗?


抱歉有任何英语错误,我不是母语人士。

编辑:找到了部分解决方案。我在“default.jsbeautifyrc”文件中将“brace_style”更改为“expand”(在“ .jsbeautifyrc”文件)。

无论如何,它仍然不适用于数组和对象。

编辑 2:刚刚注意到它也发生在 CSS 代码中。

【问题讨论】:

    标签: code-formatting adobe-brackets curly-braces


    【解决方案1】:

    我也遇到过同样的情况。

    我在本地调整了我的 css 美化器代码以绕过它。

    它是 beautify-css.js 文件,位于您的扩展安装目录的 Third Party 文件夹中。

    在我的 Elementary OS 上它就在这里:

    ~/.config/Brackets/extensions/user/brackets-beautify-2.4.0/thirdparty/beautify-css.js
    

    更改代码行,重新加载括号,就完成了。

    这是我的调整(基于括号-beautify-2.4.0):

    前两个在 print["{"] 方法中。这个函数变成:

     print["{"] = function(ch) {
            print.newLine(); //instead of print.singleSpace(); 
            indent();//since indent removed at 383
            output.push(ch);
            print.newLine();
        };
    

    此更改包括:

    • l 255 print.singleSpace(); 变为 print.newLine();

    • l 256 成为一个新行并包含indent();

    然后转到第 383 行并对其进行注释。

    • l 383 indent(); 被移除

    为 CSS 添加一个真正的 brace-style 选项将是一个更优雅的解决方案。

    这旨在帮助任何寻求快速修复以使其在本地工作的人。

    【讨论】:

    • 我在 Windows 上,代码完全不同,我什至在我的文件中都找不到此代码。
    【解决方案2】:

    使用带有以下内容的.jsbeautifyrc 可以实现JS 所需的大括号位置:

    {
        "js": {
            "brace_style": "expand"
        }
    }
    

    对于 CSS,底层库(尚)不支持此选项。

    配置文件应位于项目的根文件夹中(您在括号中打开的文件夹)。这样您就可以将其签入版本控制,以便每个贡献者都有相同的格式设置。

    如果您想要全局相同的设置,您可以更改扩展文件夹中的default.jsbeautifyrc 文件,但它会在更新时恢复。

    【讨论】:

    • 我应该在 Windows 的哪里创建这个文件?我试过:c:/users/userName, C:\Users\userName\AppData\Roaming\Brackets\extensions\user\brackets-beautify, C:\Users\Evyatar\AppData\Roaming\Brackets\ 没有任何效果:(跨度>
    • 在您在括号中打开的项目的根目录中。这样您就可以为每个项目设置不同的配置。
    • 但我想为我的所有项目使用相同的配置。
    • 您可以更改全局默认值,但它会在扩展更新时恢复(请参阅更新的答案)。
    • 我正在使用 CodeMix for Eclipse 并尝试这样做不起作用。 ?‍♂️
    【解决方案3】:

    看了@redpanda的回答后,我尝试自己改代码。

    我更改了beautify-css.js 文件中的一些行,该文件位于C:\Users\userName\AppData\Roaming\Brackets\extensions\user\brackets-beautify\thirdparty 目录内的windows 中。

    这是我的解决方案:

    转到beautify-css.js 文件中的463 行,然后将其更改为:

     indent();
     output.space_before_token = true;
     print_string(ch);
    
     if (!eatWhitespace(true)) {
          output.add_new_line();
     }
    

    到这里:

      //indent(); // removed, we will indent later
      output.space_before_token = true;
      output.add_new_line(); // added, in order to add new line before '{'
      print_string(ch);
    
      if (!eatWhitespace(true)) 
      {
          output.add_new_line();
      }
      indent(); //added, in order to indent, since we removed it before
    

    当然这是一个临时解决方案,我希望添加真正的大括号样式选项。

    【讨论】:

    • 您应该考虑提出一个拉取请求here 以添加该功能。
    【解决方案4】:

    找到了css的解决方案(美化2.10.0版)

    文件beautify-css.js(路径:~\AppData\Roaming\Brackets\extensions\user\brackets-beautify\thirdparty)

    ~1411 行

    查找“else if (this._ch === '#' && this._input.peek() === '{')”

    示例代码

    } else if (this._ch === '#' && this._input.peek() === '{') {
      this.preserveSingleSpace(isAfterSpace);
      this.print_string(this._ch + this.eatString('}'));
    } else if (this._ch === '{') {
      if (insidePropertyValue) {
    //this._output.add_new_line();
        insidePropertyValue = false;
        this.outdent();
      }
      this.indent();
      this.__add_space_before_token();
      //this._output.space_before_token = true;
      this.print_string(this._ch);
    

    改成

    } else if (this._ch === '#' && this._input.peek() === '{') {
      this.preserveSingleSpace(isAfterSpace);
      this.print_string(this._ch + this.eatString('}'));
    } else if (this._ch === '{') {
      if (insidePropertyValue) {
        insidePropertyValue = false;
        this.outdent();
      }
      this.print_string('\n');  // this line has been changed
      this.outdent();           // this line has been changed
      this.print_string(this._ch);
      this.indent();            // this line has been changed
    

    【讨论】: