重新缩进严重缩进的代码


39

我喜欢Vim的智能缩进功能,它使我可以创建缩进的代码块。

我定期将代码复制/粘贴到缓冲区中,但是该代码通常格式不正确。

理想的是通过智能缩进系统对代码进行“重新处理”。

这样的事情可能吗?

例如,您将如何“修复”以下代码(从一个较大的块中提取的内容-我不想手动修复每一行...):

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }

1
您是在谈论最初缩进的代码还是缩进正确的代码,将它们粘贴到Vim时会发生变化?
jamessan 2015年

粘贴的代码最初很难缩进。让我有一个例子....
rolfl

Answers:


48

我通过以下两种方式之一进行操作。

缩进调整后的粘贴

首先,如果缓冲区中的代码已格式化,但缩进级别不同,则我使用]p代替p,它按原样粘贴代码,但缩进移位了,使得粘贴的第一行与我的行的深度相同继续。

EG源已复制到缓冲区

while (1) {
    dostuff();
}

EG将其粘贴到的结果 ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

vim将while缩进级别与int i。这是快速的,但仅在复制的代码在其内部正确缩进时才有效。

粘贴后重新格式化

=vim中的操作员将根据配置的格式规则重新格式化代码。对于简短的粘贴片段,我将使用进入可视模式v,选择我刚刚粘贴的线条,然后按=来重新格式化它们。

对于较大的粘贴,我利用了光标移至第一行粘贴的事实,并且vim会显示类似“ 84条更多的行”的信息。然后,我可以输入84==以重排这84行(当然,用实际粘贴的行数替换84)。

参考文献

:help ]p 用于调整的缩进粘贴

:help =cover ={motion}[count]=={Visual}=用于通过自定义或内置缩进规则进行过滤


6
您可以使用[[v]]很好地选择在可视模式下粘贴的代码
craigp 2015年

1
@Badger只是要澄清一下,是backtick-bracket-v-backtick-bracket吗?
phatskat 2015年

1
是的.. textarea对反引号感到
恐惧

vim中的=运算符将根据配置的格式化规则重新格式化代码, 如果可以的话,我会给+100。我本可以节省几天。
Wossname

1
我使用<control + R>“进行粘贴,因此我不必离开插入模式。
A --- B

15

=命令可用于重新缩进。

像大多数普通模式命令一样,它可以应用于运动,因此您可以使用来重新标记刚刚粘贴的代码=']。从当前光标位置到']标记的最后一行缩进。

= 也可以从可视模式使用。

另一个有用的命令是]p,它粘贴与当前行相同的缩进级别。这可以帮助粘贴适当的缩进文本,尽管缩进深度根据周围的文本有所不同。


7

使用=ap (助记符是“设置段落格式”)会尝试自动格式化当前段落。

如果您要仔细注意可能要重新格式化的内容,则可能会发现它更vap直观,更快捷地用于直观地选择当前段落(使您直观地看到正在重新格式化的内容),然后是=。我发现这在文件中很有用,因为我知道vim会错误地重新格式化,并且我不想错误地错误格式化其他行。


4

要重新缩进缓冲区中已经存在的文件,请使用gg=G:请参阅修复缩进

为了重新缩进文件的一部分,可以将各种范围应用于=过滤器(例如,==仅修复当前行)。

要在粘贴文本时保持缩进不变,可以:set paste先将文本粘贴到缓冲区中,这样可以防止vim自动缩进刚刚粘贴的文本。粘贴内容后,您可以set :nopaste在完成后返回使用。在这里查看vimdoc 。

如果您发现自己经常粘贴东西,最好在VimWiki上使用技巧,并通过将以下几行添加到“粘贴模式”切换中来设置一个键.vimrc

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

然后,您可以点击<F2>切换粘贴模式。粘贴模式激活时,vim会在状态行中显示“ PASTE”字样。


2
这个问题不是关于使用缩进粘贴代码,而是关于修复缩进较差的代码。
rolfl 2015年

4
我没有看到您发布的评论。但是,您仍然gg=G可以使整个文件缩进。
Bhargav Bhat 2015年

@rolfl在这种情况下,我通常就是从这里开始的:gg=G,然后查看vim出现问题的部分。
muru

如果您想要更多的控制(或减少重复的麻烦),请考虑添加自动命令来调用代码格式化工具,例如astyle在保存缓冲区时。有关详细信息,请参见此问题。
Bhargav Bhat 2015年

2

要自动重新缩进括号或带括号的块的整个块,请将光标放在带括号的同一行上,然后尝试=%。要更改班次宽度,请使用:set sw=2

如果无法正常工作,请手动减少缩进量(outdent),然后尝试<%重复执行.(如有必要)。使用>%的对面。

所以:

else
       {
         // some code
       }

变成:

else
{
  // some code
}

对于特定的代码,要自动缩进一行或几行,请尝试:

  • == 重新缩进当前行
  • 5== 重新缩进5行

要手动增加/减少一行或几行的缩进,请尝试:

  • << 通过shiftwidth空格使当前行缩进
  • 5<< 通过shiftwidth空格缩进5行
  • >> 通过shiftwidth空格缩进当前行
  • 5>> 通过shiftwidth空格缩进5行
  • . 必要时重复

您也可以v通过选择文本并按=(自动缩进),<(缩进)或>(缩进)在可视模式()中进行缩进。

另一个技巧是由整个文件的正确缩进:gg=G

如果使用制表符代替空格,请使用::retab将所有制表符替换为空格(请参阅:如何用空格替换制表符?)。


对于外部方法,您可以尝试:

  • pythonTidy用于重新格式化Python代码,例如:

    :%!pythonTidy
    

有关:



1

现有答案中已经包含很多内容。我只想添加一个我经常用于缩进的映射。

nnoremap <Leader>i  mzgg=G`z

我已经看到一些vimrc与此映射到===

无论哪种方式,这都是一个不错的映射,我几乎每次都使用此映射,尤其是在粘贴从其他位置复制的代码时。

甚至最好将其放在一个中,autocmd以便Vim在将更改写入磁盘之前将其缩进。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.