在'def','if'等之后自动插入冒号

时间:2012-07-16 15:02:51

标签: python vim

我最近在朋友的要求下切换到Vim,因为Sublime Text 2认为它不相信已安装模块,即使它是......我离题了。

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

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

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

如果我在任何方面都是愚蠢的,那就欢呼和道歉。

5 个答案:

答案 0 :(得分:8)

而不是像@CG Mortion的答案那样使用imap,我强烈建议您使用iabbr来代替这些小修补。

使用imap你永远无法在插入模式下键入“define”,除非你在按下'd','e'或'f'之间暂停,或者做了其他一些hacky之一防止映射发生的事情。使用iabbr时,只有在按下非关键字字符时才会展开缩写。 iabbr def def:<left>完全符合您的预期,并且没有imap s的缺点。


正如其他答案中所提到的,我还建议您在确定需要更复杂的内容后继续使用代码段引擎。它们非常强大,可以节省您的时间。

答案 1 :(得分:6)

查看the old snipmatethe new snipmateultisnips。这些插件提供了大致相似的“片段扩展”机制,模仿TextMate的系统。

答案 2 :(得分:1)

snippet并不完全符合您的要求,但它可能对您有用。

基本上,当你按 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

答案 3 :(得分:0)

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

inoremap def def :<Esc>i

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

这也有效:

inoremap def def :<Left>

问题当然是它会在出现时替换defs,这是不理想的。

答案 4 :(得分:0)

Simlar问题:https://stackoverflow.com/a/6950427/875064

augroup PythonProgramming
   au BufNewFile,BufRead,BufEnter   *.py   iabbr def def:<left>
augroup END