2016-05-17 59 views
4

我有以下文字:如何配置Vim在返回時不縮進當前行?

 "); 

當我打在插入模式回報,Vim會創建一個新的行(如預期),但也縮進上回報被擊中行:

  "); 

Vim只對一些行做這個,大概是當它認爲縮進是不正確的。

如何配置Vim不會縮進當前行返回?我希望Vim根本不要觸及這條線。我目前的設置如下:

set tabstop=4 
set shiftwidth=4 
set expandtab 
set softtabstop=4 
+0

一些插件設置/重置'smartindent'標誌;用'verbose set si?'來檢查它吧?' – sehe

+0

@sehe好像是這樣的:「Last from /.../php.vim」,然而這個腳本將它變成_off_:'nosmartindent' – rightfold

+0

注意它可能與'paste'這個選項混淆了一些選項,'smartindent'就是其中之一。 –

回答

3

文件類型插件可能設置'cinkeys''indentkeys'所以 ,當某些鍵是 按下自動縮進被觸發。要關閉此功能,同時使'indentexpr'完整 ,這樣你仍然可以縮進與==,您可以添加 以下自動命令你vimrc

" Allow filetype detection, plugins and indent files ... 
filetype plugin indent on 

" ... but keep certain preferred defaults. 
augroup overrideftplugins 
    au! 
    au FileType * set cinkeys= indentkeys= 
augroup END 

注意的是,自動命令需要來,輪流上線後,文件類型檢測等。這是因爲它們按照 註冊的順序被觸發,我們希望覆蓋的自動命令在爲ftplugins和indent腳本設置的自動命令之後觸發。

+1

在我的'vimrc'中已經存在了十多年。 :-) – 1983

3

我能夠用一個XML文檔重現您的問題,其中一個標記與其他標記不一致。我試過禁用autoindent,cindent和smartindent,但最終爲我解決的是清除indentexpr

:setlocal indentexpr= 

或者,你可以刪除的indentkeys列表回報,或者完全清除它們。

:setlocal indentkeys= 
0

我已經創建了一個可以滿足您的需求的功能。

function! Enter() 
     let pos=getpos('.') 
     let substr = strpart(getline(pos[1], pos[2]) 
     if strlen(substr)==0 
      exe("normal! o") 
      exe("normal x") 
      startinsert 
      return 1 
     else 
      exe("normal! li\<Enter>") 
      startinsert 
      return 0 
     endif 
    endfunction 

噹噹前光標在最後,並且按下回車鍵時,它會創建一個新行並移動到第一列。 (像往常一樣,下面的任何行都會向下移動) 當光標位於行的中間位置時,按下Enter鍵,會將行分割。

要使用該功能,你可以映射像

 :imap <Enter> :call Enter()<CR> 

這非常適用於C註釋,子程序/功能。

+0

如果任何邊緣情況被遺漏,請告訴我。我會盡力在這裏添加它們。 – SibiCoder