vim 如何从多行字符串中删除空格将其传递给另一个程序,然后添加回空格?

cbeh67ev  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(107)

此问题在此处已有答案

Does Python have a built-in function for unindenting a multiline string?(4个答案)
23天前关闭

摘要

我需要检测传递给脚本的多行字符串中第一行的缩进级别。存储它。从其他行中删除此缩进级别。将删除缩进级别的多行字符串传递给另一个程序(我已经想到了如何做)将缩进添加回多行字符串中的所有行并将其打印到标准输出(我也知道如何做)。
具体来说,我对Vim和Python格式化程序YAPF有一个问题。yapf的工作方式是,如果python文件格式不正确,将导致错误。
想象一下

def f():
   # imagine some very very long lines here that we want to reformat

字符串
如果我在Vim中选择这个想象的行,然后按gq(我已经按了set formatprg=yapf),vim会用yapf的回溯替换这些行,当然这是不好的。但是如果我选择整个函数,它会完美地完成这项工作。
你可以用

echo '   fooo = 1' | yapf


这将导致IndentationError,而echo 'fooo = 1' | yapf将工作
所以我认为一个非常好的解决方法是删除缩进存储第一行的numberlevel,以某种方式将没有缩进的string传递给yapf,然后将numberlevel添加到结果中。这样做的问题是我希望这是一个或接近于一个行,这样它就可以直接存储在我的vimrc中。所以python不是一个很好的匹配,因为我至少需要导入re package等。
所以我想到了Perl。
唯一的问题是我不太了解Perl。
现在我的实验看起来是这样的

$a = "    foo = 1\n    bar = '1'";
my ($indent, $text) = $a =~ m/^(\s+)(.*)$/m;
$command = "echo " . $text;
$out = `$command`;
print "$out\n";
print "$text\n";


我会很高兴任何帮助。也许有更简单的方法来做到这一点,我不知道。

juud5qan

juud5qan1#

由于你似乎已经熟悉Python,我建议使用它的textwrap模块,它包含dedent和(在3.3版和更高版本中)indent函数,可以为你完成大部分工作:

import re
from textwrap import dedent, indent

whitespace = re.compile('\s+')

test_string = '''    while True:
        pass'''

leading_whitespace = whitespace.match(test_string)

dedented_text = dedent(test_string)

# Do whatever you want with dedented_text

indented_text = indent(dedented_text, leading_whitespace.group(0))

字符串

相关问题