Python-mode 缩进不能继续向前进格

问题

这里就不能继续缩进了呢?在什么地方可以改这个?

下面是我想要的效果,

def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):
    """Fetches rows from a Bigtable.

    Retrieves rows pertaining to the given keys from the Table instance
    represented by big_table.  Silly things may happen if
    other_silly_variable is not None.

    Args:
        big_table: An open Bigtable Table instance.
        keys: A sequence of strings representing the key of each table row
            to fetch.
        other_silly_variable: Another optional variable, that has a much
            longer name than the other args, and which does nothing.

    Returns:
        A dict mapping keys to the corresponding table row data
        fetched. Each row is represented as a tuple of strings. For
        example:

        {'Serak': ('Rigel VII', 'Preparer'),
         'Zim': ('Irk', 'Invader'),
         'Lrrr': ('Omicron Persei 8', 'Emperor')}

        If a key from the keys argument is missing from the dictionary,
        then that row was not found in the table.

    Raises:
        IOError: An error occurred accessing the bigtable.Table object.
    """
    pass

解决方案

1 个赞

tab 应该是绑定了 indent-for-tab-command,它的行为是由 tab-always-indent 变量控制。你这个情况因为你的缩进不符合当前 major-mode 定义的缩进规则,所以不要用 tab,用空格代替即可。

如果你需要 tab 键可以在缩进后继续插入 \t 的话,将 tab-always-indent 设为 nil。详见 tab-always-indent 的文档:

Controls the operation of the TAB key.

If t, hitting TAB always just indents the current line.

If nil, hitting TAB indents the current line if point is at the left margin or in the line’s indentation, otherwise it inserts a “real” TAB character.

If `complete’, TAB first tries to indent the current line, and if the line was already indented, then try to complete the thing at point.

Some programming language modes have their own variable to control this, e.g., `c-tab-always-indent’, and do not respect this variable.

1 个赞

可不可以定义 major-mode 定缩进规则符号一些 Programming Style Guide 呢?

从 lisp 这边做的话,并不容易。一般 major-mode 的缩进由 indent-line-functionindent-region-function控制。你如果有特殊的缩进要求并且你觉得你的缩进很容易用 lisp 写出来的话,可以考虑在原有的这两个函数基础上修改。

对于你这个例子,你要让 Emacs 猜测你的注释(或者字符串)中的缩进,很难做到,因为这并不是代码,而且理论上可以有任意的缩进。所以最好用空格自己手动控制。

最普遍的情况是:如果你的格式要求有外部工具实现了,一般这种情况下就是在保存的时候调用外部程序格式即可。

1 个赞

emacs的缩进只能参考。细节的格式还得靠自己手动。

1 个赞

诶,手动。。。。。不要手动诶。空格一直啪啪啪的按,好烦的说。

单行的 c-a c-u space

多行的先选中 c-x TAB

1 个赞

我试试看哈,等我下。并没有效果呀, 我用的 Spacemacs。

第一个就是普通的带参数,默认是4,然后会输入四个空格。第二个是 indent-rigidly 命令 ,可以对一个选取作整体的移动。

1 个赞

我再研究研究,还在读 Emacs 文档。这个小事儿我先忍了。 :grimacing: 谢谢啦!

输入 C-q <TAB> 就可以强行 indent 了,我现在算是搞明白 python-mode 的 indent 了,当 indent 不对的时候,你可以不停地按 <TAB> 来 cycle indent 。但是在 cycle 的过程中是有语义的,如果想强制 indent,就在按之前再按 C-q 就可以了。

3 个赞

@XCREATES 哈哈,你的问题解决了。

1 个赞

请问python-mode的indent是根据什么来决定的呢? 我看cc-mode文档上有写先是猜测一行的类型,然后根据类型来决定增加还是减少缩进。 但是python-mode我找不到相关的文档。

python 使用 python-indent-offset 这个变量才决定要缩进多少,至于它是靠什么来缩进,只有去阅读 python mode 的源码了。

明白了,谢谢!

vim模式下不是有(normal) S-. 和 S-,么…虽然编辑模式没有tab方便,不过可以应对多行缩进,编辑模式除了自动缩进,偶尔用spac代替吧,虽然有点麻烦,但是不至于不停的spac。

其实可以交换一下tab, S-tab和C-n, C-p , 用C-n调用func提示, 用tab来缩进,不过好像和emacs的少量功能有冲突。