Vim Auto Indent with newline

杀马特。学长 韩版系。学妹 提交于 2019-12-03 05:26:20

问题


How do I get vim to place the cursor within the braces starting on a new line, ie with | denoting the cursor position :

class {
  |
}

right now with my settings it only does this

class {
|}

I got this in my .vimrc file set autoindent shiftwidth=2 tabstop=2 noexpandtab

Basically I just want how a normal IDE would indent it.

update:

I found how to do this with inoremap { {<CR>}<Esc>O


回答1:


Put this in your .vimrc :

imap <C-Return> <CR><CR><C-o>k<Tab>

Assuming autoindent and smartindent are set correctly, typing Ctrl + Return between braces will put your cursor where you want it to be.




回答2:


I found that delimitMate does exactly what you describe and more (that is, automatically inserting the ending }). Note you have to tell delimitMate to expand carriage returns by adding let delimitMate_expand_cr=1 to your config.

From my observation, this is exactly the behaviour found in TextMate and SublimeText.




回答3:


I have Ubuntu 12.04 and I found no vimrc file in home directory. Global vimrc file was in /etc/vim/vimrc.
There was almost nothing in this file. So for me it worked to add this 3 lines to the end of /etc/vim/vimrc

set autoindent
set cindent
inoremap { {<CR>}<up><end><CR>

When you will type { next time it will be changed by combination {, Enter, }, up, end, Enter. cindent and autoindent will add required amount of Tab's.
P.S. I'm not good in tuning up vim so some explanations may be not so accurate. It's how I think it works.




回答4:


autoindent refers to it carrying over the current indentation level onto subsequent lines. To get it to indent according to syntax, you need to specify a flag like smartindent or cindent as well.




回答5:


At bottom of the file, I'm using:

# vim: ts=2 sw=2 sts=2 sr noet st ai si

For example Dockerfile:

FROM centos-7
RUN ...
CMD ...

# vim: ts=2 sw=2 sts=2 sr noet st ai si

If you want keep the indentation only, use # vim: st ai si




回答6:


I wrote this in my .vimrc

inoremap <expr> <CR> InsertMapForEnter()
function! InsertMapForEnter()
    if pumvisible()
        return "\<C-y>"
    elseif strcharpart(getline('.'),getpos('.')[2]-1,1) == '}'
        return "\<CR>\<Esc>O"
    elseif strcharpart(getline('.'),getpos('.')[2]-1,2) == '</'
        return "\<CR>\<Esc>O"
    else
        return "\<CR>"
    endif
endfunction

The code above first check if you are using Enter to do confirm a code completion, if not it will indent the {|} when you type Enter. Also, it provides html tags auto indent.

For your problem:

class {|}

press Enter and you will get

class {
    |
}
<html>|<html>

press Enter and you will get

<html>
    |
</html>


来源:https://stackoverflow.com/questions/4477031/vim-auto-indent-with-newline

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!