一千萬個為什麽

搜索

在為具有繼承的c ++類聲明構造函數時設置縮進

我已經使用vim兩年了,但有很多我不太了解的事情。 今天,我用c ++編寫代碼,發現我想要輸入這樣的片段:

Horse(COLOR color, HANDS height, int age):
Animal(age),
itsColor(color),
itsHeight(height) {
    cout << "Horse constructor...\n";
}   

相反,我發現:

Horse(COLOR color, HANDS height, int age):
Animal(age),
    itsColor(color),
    itsHeight(height) {
        cout << "Horse constructor...\n";
    } 

如何使閉合花括號與構造函數定義對齊?

我的vimrc設置是:

set secure
set showmode
set number
set relativenumber
set cursorline
set linebreak
set colorcolumn=81
set updatetime=1000
set conceallevel=0
set showbreak=↳
set wrap
set lcs=tab:>-,nbsp:%,trail:¬
set list
set cinoptions=g0,l1,i0
set smarttab
set tabstop=4
set softtabstop=4
set shiftwidth=4
set shiftround
set expandtab
autocmd FileType make setlocal noexpandtab
autocmd FileType markdown setlocal colorcolumn=0

最佳答案

縮進方法

Vim has several 縮進方法, including

  • <�代碼> '自動縮進'</代碼>
  • <�代碼> 'smartindent' 的</代碼>
  • <�代碼> 'cindent' 的</代碼>
  • <�代碼>而 'indentexpr'</代碼>

每一個都是獨特的,不同的強大。

cindent

根據:help cino-i ,你想使用'cindent'。這已經在 $ VIMRUNTIME/indent/cpp.vim 中的 cpp 文件中設置了,可以從:verbose set cindent?中找到< code> cpp 文件。

為這種情況定制cindent

要更改“C ++基類聲明和構造函數初始化”的縮進,您需要更改'cinoptions'以包含 i0

幫助文檔中的示例:

                                                *cino-i*
iN    Indent C++ base class declarations and constructor
      initializations, if they start in a new line (otherwise they
      are aligned at the right side of the ':').
      (default 'shiftwidth').

        cino=                     cino=i0 >
          class MyClass :           class MyClass :
              public BaseClass      public BaseClass
          {}                        {}
          MyClass::MyClass() :      MyClass::MyClass() :
              BaseClass(3)          BaseClass(3)
          {}                        {}

為了實現這一點,我會做以下事情:

  1. Set up a C++ filetype plugin by creating the the file ~/.vim/ftplugin/cpp.vim (or wherever your vim directory is)
  2. Add the following line to it:

    setlocal cinoptions=i0

這是因為'cinoptions'默認為空字符串,不會被filetype插件更改,並且未提供時使用的值包括(使用' shiftwidth')如幫助中所示:

cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,E0,ps,ts,is,+s,
        c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0

基於OP的vimrc的註意事項(AKA如何啟用文件類型設置)

OP的帖子已經有 cinoptions ,其中包含 i0 (盡管它在所有文件中全局設置)。但是,它似乎沒有起作用。

為了使這個解決方案(實際上 cinoptions / cindent )能夠工作,你需要啟用文件類型檢測,插件和縮進(至少)。為此,請將以下行添加到vimrc:

filetype plugin indent on

You can find some more similar information on this vi.stackexchange post and this one and this one.They're all mine, because they were easy to find and I have written extensively on the topic.


進一步說明

一些測試涉及不幸的經驗,即OP中的精確片段

Horse(Color color, HANDS height, int age):
Animal(age),
    itsColor(color),
    itsHeight(height) {
        cout << "text" ;
    }

這只是向OP要求的解決方案邁出的一小步。這可以通過不縮進延續行來解決('cinoptions'+0 )。但是,連續行不會縮進(請參閱:help cino - + )。我認為這些是技術上的延續(因此是逗號,因此是縮進)。

結果:

class MyClass :
itsColors(color),
Animal(age),
itsHeight(height) {
    cout << "text" ;
}

一個更好的解決方案仍然是編寫和使用 indentexpr (可能會回到 cindent(),除非在這種情況下)。我目前沒有完成任務。

轉載註明原文: 在為具有繼承的c ++類聲明構造函數時設置縮進