【问题标题】:How to re-indent Python code after changing indent width in Emacs?如何在 Emacs 中更改缩进宽度后重新缩进 Python 代码?
【发布时间】:2013-01-10 21:18:29
【问题描述】:

我将 python-indent 从 3 更改为 4。然后我将 mark-whole-bufferindent-for-tab-command。它给了我垃圾。

【问题讨论】:

  • ...对我来说应该是git checkout -- file,但我很确定这不是您想要的...
  • 当你 mark-whole-buffer 然后在 python-indent 等于 3 设置时缩进它确实有效?
  • @Dualinity 是的,但可能是因为它已经完美地缩进了 3 个空格。
  • 你可以尝试添加一些额外的并删除一些空格,然后看看它是否仍然有效?

标签: python emacs


【解决方案1】:

indent-region 函数。所以我会尝试标记整个缓冲区,然后M-x 并输入indent-region。据我所知,它通常绑定到C-M-\

编辑

重新缩进不适用于tab-width 更改。正如我在 cmets 中所写,将空格更改为制表符,然后更改 tab-width 是一种解决方案:

“猜你是用空格而不是制表符缩进,你首先在缓冲区内容上执行tabify,将tab-width设置为3。然后将tab-width更改为4并运行untabify。”

【讨论】:

  • 嗯,又一次尝试。猜想你是用空格而不是制表符缩进,你首先在缓冲区内容上执行tab-width 设置为3。然后将tab-width 更改为4 并运行untabify,也许这可以解决问题。
  • 它有效:)。你应该把它写成答案,这样我才能接受。
  • 将答案更改为包含解决方案,您现在可以接受 ;-)
【解决方案2】:

这是一种 hack,但它不会给你 indent-region 给你的垃圾

1) 确保将制表符作为空格设置为 4 个空格。在暂存缓冲区类型中:

(setq tab-width 4)

然后通过标记它并使用M-x eval-region对其进行评估

2) 用制表符全局替换所有三个空格的集合

M-x replace-regexp [SPC][SPC][SPC][RET] C-q[TAB][RET]

3) 突出显示整个缓冲区并取消制表符

M-x mark-whole-buffer M-x untabify

这会将所有制表符转换为四个空格。

【讨论】:

  • 你确定应该有4次[SPC]吗?如果是这样,为什么?首先,将 4 个空格更改为 TAB,然后将所有制表符更改回 3 个空格。
  • Ack,我有这个倒退。我是从四到三,而不是三到四。接得好。现在修复它。
  • 如果它不起作用,OP 可能还必须评估 elisp 表达式 (setq default-tab-width 4)。不过我已经对此进行了测试,只要没有任何错误缩进的块开始,它就应该可以工作。
  • 一个普通的替换(而不是替换正则表达式)就足够了,因为搜索词和替换词都是普通的
【解决方案3】:

在缓冲区上尝试indent-region。最初绑定到C-M-\

【讨论】:

    【解决方案4】:

    这有点小技巧,但它对我来说是一种快速的解决方法:“M-X 替换字符串”、“”->“”。然后,如果您的 emacs 对文件进行自动 idnent-detection,则必须关闭并重新打开。然后,您必须检查并修复多行代码(带制表符)和包含大量空格的字符串。

    【讨论】:

      【解决方案5】:

      这也可能有帮助:

      http://www.emacswiki.org/emacs/IndentingPython

      特别是,PythonTidy 对于重组杂乱无章的代码非常有效(不幸的是,该工具不容易配置):

      http://www.emacswiki.org/emacs/PythonProgrammingInEmacs#toc17

      【讨论】:

        【解决方案6】:

        可能它不会有用或不是按主题,但我使用这样的脚本。 从命令行运行它。 (python reindent.py some.py)

        更改 string_equal 和 replace_to。

        import sys
        
        file_name = sys.argv[1]
        string_equal = "   "
        replace_to =  "    "
        
        with open(file_name) as f:
            data = f.readlines()
            f.close()
        
        def create_new_line(i):
            new_line = ""
            flag = True
            cur_s = ""
            for k in i:
                if flag and k == " ":
                    cur_s += k
                    if cur_s == string_equal:
                        new_line += replace_to
                        cur_s = ""
                else:
                    flag = False
                    new_line += k
            return new_line
        
        with open(file_name, "w") as f:
            for i in data:
                l = create_new_line(i)
                f.write(l)
            f.close()
        

        【讨论】:

          猜你喜欢
          • 2011-05-09
          • 2016-10-02
          • 1970-01-01
          • 2012-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多