使用Vim Retab解决TabError:缩进中标签和空格的使用不一致?

时间:2018-02-11 19:41:38

标签: python vim

为新手问题道歉,但我已经阅读了手册this问题,并尝试了几次没有我预期的结果。

所以我使用vim编辑文件(附件)。但是在运行时,我得到了TabError:在缩进错误中不一致地使用制表符和空格。

以下是我的尝试:

  • 使用Vim打开文件。输入:retab:x。再次运行该文件。仍然有TabError消息。
  • 再次打开文件,然后输入:retab!:x。再次运行该文件。仍然有TabError消息。
  • 再次打开文件,然后输入:retab! 4:x。再次运行该文件。这次它有效,但我不明白为什么?另外,在文件中缩进似乎过长。 (我读here编辑器可能会为选项卡显示8个空格)

我的问题是:

  • :retab:retab!:retab! 4是什么意思?

  • 为什么:retab不能处理我的文件?

    #!/usr/bin/env python
    #Reduce function for computing matrix multiply A*B    
    #Input arguments:
    #variable n should be set to the inner dimension of the matrix product (i.e., the number of columns of A/rows of B) 
    import sys
    import string
    import numpy
    
    #number of columns of A/rows of B
    n = int(sys.argv[1]) 
    
    #Create data structures to hold the current row/column values (if needed; your code goes here)
    
    currentkey = None
    alist = [] # list for elelents in  A
    blist = [] # list for elements in B
    # input comes from STDIN (stream data that goes to the program)
    for line in sys.stdin:
        #Remove leading and trailing whitespace
        line = line.strip()
        #Get key/value 
        key, value = line.split('\t',1)
        print(key, value)
        #Parse key/value input (your code goes here)
        key = (key.split(',', 1)[0], key.split(',',1)[1])   
        value = (value.split(',', 1)[0], value.split(',',1)[1], value.split(',',1)[2])  
        #If we are still on the same key...
        if key==currentkey:
            #Process key/value pair (your code goes here)
            # store all values in a lisl
            if value[0]=='A':
            alist.append([value[1], value[2]])
            else:
            blist.append([value[1], value[2]])
            #Otherwise, if this is a new key...
        else:
        #If this is a new key and not the first key we've seen, i.e. currentkey!=None
            if currentkey:
        #compute/output result to STDOUT (your code goes here)
            alist = sorted(alist)
            blist = sorted(blist)
            newlist = [a[1]*b[1] for a,b in zip(alist, blist)]
            res = newlist.sum() 
            print(currentkey, res)
            currentkey = key
            #Process input for new key (your code goes here)
    

3 个答案:

答案 0 :(得分:4)

只需在Vim中输入:help retab即可阅读。我想我无法解释它比帮助更好。也许你错过了可选范围部分;使用%前缀应用于整个文件。同样有用的是:set list向你展示每个字符;这将显示标签和行结尾(已:set nolist}和:set <name>禁用,没有值可查看当前值,前: set tabstop或后跟一些要设置的值。

通过显示所有字符,启用和禁用标签扩展到:set expandtab:set noexpandtab的空格,设置tabstop并使用for ex。 :retab! 4您可以自由选择并仅切换标签和空格,并更改标签列宽度。

此链接vim settings for python也可能有用

答案 1 :(得分:2)

Esc

:%s/\t/    /g

意思是用4个空格替换tab。按回车键 退出

:wq

答案 2 :(得分:1)

如果您复制粘贴的代码并开始编辑它,那么仅尝试运行 :retab 可能不起作用。

您可以先尝试设置 vim/vi 设置:

  1. 检查你是否有 ~/.vim/vimrc 文件,否则运行 sudo mkdir ~/.vim && sudo touch ~/.vim/vimrc 来创建设置文件
  2. 创建后编辑 vimrc 以添加以下代码段
    set softtabstop=4
    set tabstop=4
    set shiftwidth=4
    set expandtab
  1. 使用 vim/vi 打开文件并运行 :retab