如何将大括号置于上一行的末尾

rns*_*nso 1 vim

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

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]));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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]));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

因此,起始大括号被带到上一行的末尾。如何在 Vim 中以编程方式完成此操作?它尝试过,但虽然我可以拿起起始花括号,但无法设法将其带到上一行的末尾。

注意:上面的代码来自这里

rom*_*inl 5

将下一行连接到当前行是:help J在正常模式或:help :join命令行模式下完成的。

将当前行连接到上一行是在正常模式下通过将光标移动到上一行-然后使用 进行连接来完成的J。在命令行模式下,您可以使用(“当前行号减一”)的-缩写,就像:一样,它很好地反映了正常模式方法。.-1:h address:join:-j

要在整个缓冲区上执行此操作,您需要一种方法来在每个独立的左大括号上执行给定的命令。这是通过以下方式完成的:help :g

:g/^\s*{\s*$/-j
Run Code Online (Sandbox Code Playgroud)

分解:

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

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

gg=G
Run Code Online (Sandbox Code Playgroud)

分解:

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

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