在崇高的文本 2 中,当您:
BLOCK { <Return>
它生成(管道是光标):
BLOCK {
|
}
我怎样才能让 Vim 表现得这样?
我有autoindent
开和smartindent
关,因为smartindent
它在返回时这样做:
BLOCK {
|}
更清楚地说,我特别在寻找 2 个返回,向上移动一行,并在(具体为 2 个软标签)中添加标签。我已经让它自动匹配字符,如,{
等。(
[
在崇高的文本 2 中,当您:
BLOCK { <Return>
它生成(管道是光标):
BLOCK {
|
}
我怎样才能让 Vim 表现得这样?
我有autoindent
开和smartindent
关,因为smartindent
它在返回时这样做:
BLOCK {
|}
更清楚地说,我特别在寻找 2 个返回,向上移动一行,并在(具体为 2 个软标签)中添加标签。我已经让它自动匹配字符,如,{
等。(
[
一个简单的映射将适用于大多数目的:
imap {<cr> {<cr>}<c-o>O
根据插件的不同,一些用户可能需要inoremap
而不是imap
.
之前是 TextMate,现在是 ST2。
你面前基本上有两条路。
“愚蠢”的道路
可以想出这种方法的几十种变体:您只需创建一个映射来执行实现目标所需的一系列按键:
inoremap {<CR> {<cr><cr>}<C-o>k<tab>
我称它为“愚蠢”,但这并不意味着你会愚蠢地使用它:它技术含量低,没有依赖关系,易于定制,并且可以映射到任何你喜欢的东西。
“聪明”的方法
此方法涉及使用插件。我使用DelimitMate,但还有很多其他的,选择你的毒药。
我对 vim 插件做了一些快速挖掘(这通常是这类问题的解决方案)。我认为我没有找到您想要的:有一些接近的插件,但没有在右大括号之前插入额外的换行符。
你可以做类似的事情
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>
.
如果你真的有野心/特别,你可以在函数中做测试,看看当前行中的代码是否真的打开了一个块。
要使缩进按您想要的方式工作,请打开“自动缩进”和“智能缩进”设置。
: set autoindent smartindent
要默认启用它,请添加
set autoindent smartindent
到~/.vimrc
.
我使用以下地图:
inoremap {{ {<CR><CR>}<ESC>kcc
所以{<CR>
我没有使用这个映射。除此之外,我还使用 romainl 提到的插件,DelimitMate 用于其他带大括号的映射。
我有同样的问题,delimitMate 解决了它。安装后,您可以通过以下方式启用它:
let g:delimitMate_expand_cr = 1
有很多技巧可以提供 SublimeText 体验。因为我感到沮丧,所以我创建了一个项目,该项目在单个 vim 发行版中包含所有这些功能(无需安装/编译外部插件/工具)。
您可以从这里查看:https ://github.com/fatih/subvim