vim 如何将大括号移到上一行的末尾

egdjgwm8  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(214)

我在网上看到很多类似以下的代码:

public static void read()
    {
        using (StreamReader m_StreamReader = new StreamReader("C:\\myCsv.Csv")) 
        {
            while (m_StreamReader.Peek >= 0) 
            {
                string m_Str = m_StreamReader.ReadLine;
                string[] m_Splitted = m_Str.Split(new char[] { "," });
                Console.WriteLine(string.Format("{0}={1}", m_Splitted[0], m_Splitted[1]));
            }
        }
    }

但是,我想将上述内容转换为以下内容:

public static void read() {
        using (StreamReader m_StreamReader = new StreamReader("C:\\myCsv.Csv")) {
            while (m_StreamReader.Peek >= 0) {
                string m_Str = m_StreamReader.ReadLine;
                string[] m_Splitted = m_Str.Split(new char[] { "," });
                Console.WriteLine(string.Format("{0}={1}", m_Splitted[0], m_Splitted[1]));
            }
        }
    }

因此,起始花括号被带到上一行的末尾。如何在Vim中通过编程实现这一点?它尝试了,但尽管我可以拿起起始花括号,但无法设法将其带到上一行的末尾。
注:以上代码来自here

vptzau2j

vptzau2j1#

将下一行加入到当前行是在正常模式下使用:help J或在命令行模式下使用:help :join完成的。
将当前行与上一行合并是在普通模式下通过将光标移动到带有-的上一行,然后使用J合并来完成的。在命令行模式下,您可以使用-.-1的缩写,“当前行号减一”)作为:h address来表示:join:-j,其非常好地反映了简正模式方法。
要在整个缓冲区上执行此操作,需要一种方法来在每个隔离的左大括号上执行给定的命令。

:g/^\s*{\s*$/-j

明细:

  • :g/<pattern>/<command>在与<pattern>匹配的每一行上执行<command>
  • ^\s*{\s*$匹配具有单个左大括号和可选前导空格和尾随空格的行,
  • -j将当前行与上面的行连接起来。

但是结果不再正确缩进,因此您需要类似以下命令的命令来修复混乱:

gg=G

明细:

  • gg将光标移动到第1行,
  • =G重新缩进从光标到最后一行的每一行,请参见:help =

也就是说,从一种编码风格切换到另一种风格似乎应该使用专用工具来完成,而不是使用一般的文本编辑。

bnl4lu3b

bnl4lu3b2#

所需的输出看起来与ratliff样式惊人地相似。如果这是正确的,astyle是一个支持这种特定样式的格式化程序,这种解决方案将比手动更改更健壮。
您可以将其包含在您自己的命令中,如下所示:

command! -buffer Fmt let winsaved = winsaveview() | execute '%! astyle --style=ratliff' | if v:shell_error > 0 | silent undo | endif | call winrestview(winsaved)

相关问题