9

在 Sublime Text 2 决定它不相信模块已安装之后,我最近应朋友的要求切换到 Vim,即使它是......我离题了。

我已经设法设置了一些东西来使编辑 Python(目前我唯一的语言)更容易。但是,Sublime 缺少一个功能。它会自动在需要它们的行的末尾添加一个冒号(函数定义的开头,if 语句等)。这避免了无数恼人的错误,我想念它:P

我想知道是否可以在 .vimrc 中输入某种命令来执行此操作。

一个例子:如果要键入def,我希望 vim 自动插入一个冒号,def :并将光标放在冒号之前,以便我输入我的函数名。

如果我以任何方式愚蠢,请欢呼并道歉。

4

5 回答 5

8

与其像@CG Mortion 的回答所建议的那样使用imaps,我强烈建议您使用iabbrs 来进行这些小修复。

使用 an时,imap您将永远无法在插入模式下键入“define”,除非您在按“d”、“e”或“f”之间暂停,或者做了许多其他骇人听闻的事情之一来阻止映射的发生。仅在iabbr按下非关键字字符后才会扩展缩写。 iabbr def def:<left>完全按照您的预期工作,并且没有imaps 的缺点。


正如其他答案中提到的,一旦您决定想要更复杂的东西,我还建议您继续使用片段引擎。它们非常强大,可以为您节省大量时间。

于 2012-07-16T17:53:36.720 回答
6

看看旧的 snipmate新的 snipmateultisnips。这些插件提供了与 TextMate 系统大致相似的“片段扩展”机制。

于 2012-07-16T15:08:57.030 回答
1

代码段不能完全按照您的要求执行,但它可能仍然对您有用。

基本上,当您按 时,它会在行尾放置一个分号(如果该行以预定义的单词开头,并且冒号还没有)Enter

inoremap <cr> <c-r>=ColonCheck()<cr><cr>

fun! ColonCheck()
  if getline(".") =~ '^\s*\(if\|else\|elif\|while\|for\|try\|except\|finally\|class\|def\)\>.*[^:]\s*$'
    return ":"
  else
    return ""
  endif
endfun
于 2012-07-16T16:39:55.393 回答
0

这是一个相当老套的答案,但你可以做一个简单的映射,如:

inoremap def def :<Esc>i

这将完全符合您的要求。也就是说,当您键入“def”时,它会将其解释为“def :”,然后转义回正常模式(在这里您可以移动一点),然后返回插入。

这也有效:

inoremap def def :<Left>

当然,问题在于它会在 defs 出现时替换它们,这并不理想。

于 2012-07-16T16:58:45.250 回答
0

类似问题:https ://stackoverflow.com/a/6950427/875064

augroup PythonProgramming
   au BufNewFile,BufRead,BufEnter   *.py   iabbr def def:<left>
augroup END
于 2012-07-16T19:03:48.497 回答