在崇高的文字2中,当你:
BLOCK { <Return>
它生成(管道是光标的地方):
BLOCK {
|
}
如何让Vim以这种方式行事?
我已启用autoindent
,smartindent
已关闭,因为smartindent
会在返回时执行此操作:
BLOCK {
|}
更清楚的是,我特意寻找2个返回,向上移动一行,并在(2个软选项卡中具体)标签。我已经自动匹配了{
,(
,[
等字符。
答案 0 :(得分:3)
简单的映射可用于大多数目的:
imap {<cr> {<cr>}<c-o>O
根据插件的不同,某些用户可能需要inoremap
而不是imap
。
答案 1 :(得分:2)
在使用TextMate之前,现在是ST2。
你之前基本上有两条路径。
“哑”路径
可以想出这种方法的几十种变体:您只需创建一个映射来执行达到目标所需的一系列按键操作:
inoremap {<CR> {<cr><cr>}<C-o>k<tab>
我把它称为“愚蠢”,但这并不意味着你会愚蠢地使用它:它是低技术的,没有依赖性,易于定制,它可以映射到你喜欢的任何东西。
“智能”方法
此方法涉及使用插件。我使用DelimitMate,但有many others,选择你的毒药。
答案 2 :(得分:1)
我为vim插件做了一些快速挖掘(这通常是解决这类问题的方法)。我认为我没有找到你想要的东西:有a few addons that come close,但没有任何东西在结束括号之前插入额外的换行符。
你可以做类似
的事情imap { {<return><return>}<up><tab>
但如果您使用的语言在其他情况下使用大括号,则会变得很尴尬。您可以改为对换行做出反应:
inoremap <return> <return><return>}<up><tab>
当然,这将触发每个输入的换行符,而不仅仅是那些跟随开口括号的人。要让它检查大括号是当前行的最后一个字符,您可以:
有一个函数(在〜/ .vimrc或〜/ .vim / plugin中的某个地方)看起来像
function! CloseBraceIfOpened()
if getline(".")[-1:] == '{'
" insert a space and then delete it to preserve autoindent level
exec "normal o "
normal x
normal o}
normal k
else
normal o
endif
endfunction
也可以
inoremap <buffer> <enter> <esc>:call CloseBraceIfOpened()<enter>A
请注意,此imap
是特定于缓冲区的,因此映射仅适用于运行时所在的缓冲区。要将其应用于所有缓冲区,请删除<buffer>
。
如果你真的雄心勃勃/特殊,你可以在函数中进行测试,看看当前行中的代码是否真的打开了一个块。
要让缩进按照您希望的方式工作,请启用“自动加入”和'smartindent'设置。
: set autoindent smartindent
要默认启用它,请添加
set autoindent smartindent
到~/.vimrc
。
答案 3 :(得分:0)
我使用以下地图:
inoremap {{ {<CR><CR>}<ESC>kcc
所以不使用{<CR>
而是使用此映射。除此之外,我还使用romainl提到的插件,DelimitMate用于其他带括号的映射。
答案 4 :(得分:0)
我有同样的问题,delimitMate解决了它。安装后,您可以使用以下命令启用它:
let g:delimitMate_expand_cr = 1
有很多黑客可以提供SublimeText体验。因为我感到沮丧,我创建了一个项目,在单个vim发行版中包含所有这些功能(无需安装/编译外部插件/工具)。
您可以在此处查看:https://github.com/fatih/subvim