我花的方式太多时间摸索周围因为Vim不处理花括号最喜欢的IDE做。这是我想发生的事情:
输入:
if( whatever )
{ <CR>
并得到这个:
if( whatever )
{
|
}
其中,<CR>
平均值表示ENTER按键,|
是光标的位置。这就是Eclipse所做的。这就是Visual Studio所做的。这就是我想要Vim要做的。
我见过一些插件,尝试了一些,但似乎没有一个给我这种行为。当然,我不能成为第一个想要这个的程序员。
我花的方式太多时间摸索周围因为Vim不处理花括号最喜欢的IDE做。这是我想发生的事情:
输入:
if( whatever )
{ <CR>
并得到这个:
if( whatever )
{
|
}
其中,<CR>
平均值表示ENTER按键,|
是光标的位置。这就是Eclipse所做的。这就是Visual Studio所做的。这就是我想要Vim要做的。
我见过一些插件,尝试了一些,但似乎没有一个给我这种行为。当然,我不能成为第一个想要这个的程序员。
Answers:
在VimL中,您可以{
完全按照自己的意愿映射操作:
inoremap { {<CR>}<Esc>ko
根据您的自动缩进设置,您可能需要添加一个<BS>
after <CR>
。
有关更完整的解决方案,建议您看看Luc Hermitte的vim插件。。到目前为止,他们从未让我失望。
{<CR>
也是可能的吗?我的意思是,如果我仅{"something":"like this"}
在python,js或ruby中输入哈希,该怎么办?
{<CR>
有可能。这就是我的.vimrc文件中的内容{<CR> {<CR>}<Esc>ko
{
,但是当我粘贴包含的代码块时出现问题{
,它将}
在末尾添加一个。
这是我的vimrc中的内容:
let s:pairs={
\'<': '>',
\'{': '}',
\'[': ']',
\'(': ')',
\'«': '»',
\'„': '“',
\'“': '”',
\'‘': '’',
\}
call map(copy(s:pairs), 'extend(s:pairs, {v:val : v:key}, "keep")')
function! InsertPair(left, ...)
let rlist=reverse(map(split(a:left, '\zs'), 'get(s:pairs, v:val, v:val)'))
let opts=get(a:000, 0, {})
let start = get(opts, 'start', '')
let lmiddle = get(opts, 'lmiddle', '')
let rmiddle = get(opts, 'rmiddle', '')
let end = get(opts, 'end', '')
let prefix = get(opts, 'prefix', '')
let start.=prefix
let rmiddle.=prefix
let left=start.a:left.lmiddle
let right=rmiddle.join(rlist, '').end
let moves=repeat("\<Left>", len(split(right, '\zs')))
return left.right.moves
endfunction
noremap! <expr> ,f InsertPair('{')
noremap! <expr> ,h InsertPair('[')
noremap! <expr> ,s InsertPair('(')
noremap! <expr> ,u InsertPair('<')
并且,对于某些文件类型:
inoremap {<CR> {<C-o>o}<C-o>O
//我知道InsertPair函数很简单,但是它节省了时间,因为有了它,我可以用一个命令定义命令映射和普通模式映射,而不必写很多<Left>
s。
我一直喜欢类似sublime文本的操作,在该文本中将右花括号附加为下一个字符,因此我在.vimrc中添加了以下内容:
inoremap ( ()<ESC>hli
将光标移动到两个大括号之间。
(
为()hli
。在Mac上为Vim8。
对于像我一样遇到这种情况并且正在寻找比AutoClose更新的东西的任何人:delimitMate我发现,这不仅是对AutoClose的首选解决方案,在行为上也很明智,而且在主动开发中。根据vim.org的资料,自2009年以来未更新AutoClose。
delmitMateExpand
默认情况下该选项处于关闭状态。您需要添加let delimitMate_expand_cr = 1
到中.vimrc
。
我尝试了不同的插件,但发现最准确,最容易使用的自动配对。它非常直观,安装后即可立即获得期望的结果。
delimitMate为此进行设置。
delimitMate_expand_cr
,尽管它似乎并没有完全按照要求进行。似乎正确插入了换行符,但可能没有添加结尾括号。帮助文件在这里:github.com/Raimondi/delimitMate/blob/master/doc/delimitMate.txt就我个人而言,这几天我只使用endwise(github.com/tpope/vim-endwise),否则使用我自己的括号,因为没有自动化完全正确。
Vim补丁7.4.849添加了绑定,以允许光标移动而无需重新启动撤消序列。一旦更新为> = 7.4.849,则类似的效果很好。
inoremap ( ()<C-G>U<Left>
请注意,我直接从补丁中包含的文档中获取了该信息。此功能的最佳简单解决方案。
最终我发现不需要插件,但是对我来说这很完美:
inoremap { {}<Esc>ha
inoremap ( ()<Esc>ha
inoremap [ []<Esc>ha
inoremap " ""<Esc>ha
inoremap ' ''<Esc>ha
inoremap ` ``<Esc>ha
只是对@Bob的注释。
卡尔·古尔汀(Karl Guertin)的自动关闭(AutoClose)具有一个名为``双括号''的功能,即您可以键入两次大括号,如下所示。
int func_name(void) {{ ==> Type `{' twice here.
会导致:
int func_name(void) {
| ==> Cursor here.
}
然后,您可以键入一个单选项卡,即可根据您的'shiftwidth”的设置缩进,然后键入。
您不需要特殊的插件即可执行此操作-但这是一个两步过程。
首先,将以下内容添加到您.vimrc
的触发角色中:
" eat characters after abbreviation
function! Eatchar(pat)
let c = nr2char(getchar(0))
return (c =~ a:pat) ? '' : c
endfunction
然后将此缩写添加到您的.vimrc
:
inoreabbr <silent> { {
\<cr><space><space>
\<cr><esc>0i}<esc>k$i<c-r>=Eatchar('\m\s\<bar>\r')<cr>
将\
在线路二和三的开始仅仅是一个续行符。您可以在一行上完成所有操作,但是我添加了它,以便我可以以反映您要查找的输出的方式来分发缩写-只是使事情变得更加直观。
我的解决方案:
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
说明:
上面的代码首先检查您是否正在使用Enter
来确认代码完成,否则,将{|}
在您键入时缩进Enter
。此外,它还提供html标签自动缩进。
例子:
if( whatever ){|}
按Enter
,你会得到
if( whatever )
{
|
}
这也适用于html文件。请参阅以下示例
<html>|<html>
按Enter
,你会得到
<html>
|
</html>