我喜欢Vim的智能缩进功能,它允许我创建缩进的代码块。 >
理想的是通过smart-indent系统对代码进行“重新处理”。

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

    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" ;
                }
        }


评论

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

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

#1 楼

我可以通过以下两种方式之一进行操作。 ]p的代码,它按原样粘贴代码,但缩进量发生了偏移,以使粘贴的第一行与我所在的行的深度相同。源已复制到缓冲区

while (1) {
    dostuff();
}


E.G.用p粘贴它的结果

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


vim将while的缩进级别与]p相同。这是快速的,但仅在复制的代码在其自身中适当缩进的情况下才有效。 。对于简短的粘贴片段,我将使用int i进入可视模式,选择我刚刚粘贴的行,然后按=重新格式化它们。

对于较大的粘贴,我利用了以下事实:光标移到第一条粘贴的行,并且vim表示类似“ 84条更多的行”。然后,我可以输入v来重排这84行(当然,用实际粘贴的行数替换84行)。 />
=涵盖84==:help ]p:help =,用于通过自定义或内置缩进规则进行过滤

评论


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

– Craigp
2015年2月4日在7:04



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

–phatskat
2015年2月4日13:31

是的.. textarea对反引号感到震惊,所以我无法将其放在代码块中:P

– Craigp
2015年2月4日14:41

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

–姓氏
17-6-25在14:37



我使用“进行粘贴,因此我不必离开插入模式。

–A --- B
17年7月12日在9:56

#2 楼

可以使用=命令重新缩进。

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

=也可以在可视模式下使用。 ] p,它以与当前行相同的缩进级别粘贴。这可以帮助粘贴适当的缩进文本,尽管缩进深度根据周围的文本有所不同。

#3 楼

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

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

#4 楼

要重新缩进缓冲区中已经存在的文件,请使用gg=G:有关重新缩进文件的一部分,请参见Fix Indentation

,可以对=过滤器应用各种范围(例如,==仅修复当前行) )。

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

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

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


然后您可以按<F2>切换粘贴模式。粘贴模式处于活动状态时,vim将在状态行中显示单词“ PASTE”。

评论


这个问题不是关于带有缩进的代码的粘贴,而是关于修复缩进较差的代码的问题。

–rolfl
2015年2月4日,下午3:46

我没有看到您发布的评论。但是,您仍然可以使用gg = G重新缩进整个文件。

– Bhargav Bhat
2015年2月4日,下午3:48

@rolfl在这种情况下,我通常从这里开始:gg = G,然后看一下vim出错的部分。

–muru
15年2月4日在4:08

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

– Bhargav Bhat
2015年2月4日在4:11



#5 楼

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

如果无法按预期工作,请手动减小缩进量(outdent),请尝试<%并重复执行。 (如有必要)。用>%表示相反。

所以:

else
       {
         // some code
       }


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



==重新缩进当前行

5 ==重新缩进5行

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



<<通过移位宽度空格缩进当前行

5 <<通过移位宽度空格缩进5行

>>通过shiftwidth空格缩进当前行

5 >>通过缩排空格缩进5行



还可以在可视模式(v)中进行缩进,方法是选择文本并按=(自动缩进),<(反缩进)或>(缩进)。 >
另一个技巧是通过gg = G来纠正整个文件的缩进。 :如何用空格替换制表符?)。


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




pythonTity重新格式化Python代码,例如:

else
{
  // some code
}




相关:




多行缩进在stackoverflow SE中快速在vi中实现

如何重新格式化源文件以将其从2个空格缩进到3个?在stackoverflow

缩进和对齐:在stackoverflow处合并空格和制表符


#6 楼

我最近安装了vim-pasta(https://github.com/sickill/vim-pasta),这似乎可以改善粘贴时代码的缩进性。 README还对各种代码粘贴策略进行了很好的讨论。

#7 楼

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

nnoremap <Leader>i  mzgg=G`z


我看到一些vimrc将此映射到===。 br />无论哪种方式,这都是一个很棒的映射,我几乎每次都使用它,尤其是粘贴从其他地方复制的代码时。

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