vim 在“def”、“if”等后面自动插入冒号

qlvxas9a  于 2022-11-24  发布在  其他
关注(0)|答案(6)|浏览(472)

我最近在一个朋友的要求下切换到Vim后,崇高文本2决定它不相信一个模块被安装,即使它是...我离题了。
我已经设法设置了一些东西,使编辑Python(目前我唯一的语言)更容易。然而,有一个功能我从Sublime遗漏。它会自动添加一个冒号到需要它们的行的末尾(函数定义的开头,if语句等)。这防止了无数恼人的错误,我想念它:P
我想知道是否有某种命令可以放在.vimrc中来完成此操作。
例如:如果要输入def,我希望Vim自动插入一个冒号,使其成为def :,并将光标放在冒号前面,以便我输入函数名。
如果我有任何愚蠢的地方,请干杯并道歉。

o3imoua4

o3imoua41#

我强烈建议您使用iabbr来进行这些小的修复,而不是像@CG Mortion的回答所建议的那样使用imap
对于imap,您永远无法在插入模式下键入“define,”除非您在按“d”、“e”或“f”之间暂停,或者做了一些其他的黑客操作来阻止Map的发生。使用iabbr,缩写只有在按下非关键字字符时才会展开。iabbr def def:<left>的工作方式与您的预期完全一样,它没有不具有X1 M5 N1 X的缺点。
正如在其他答案中提到的,我也建议你在决定要更复杂的东西时,转向使用代码片段引擎。它们非常强大,可以保存大量的时间。

blpfk2vs

blpfk2vs2#

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

4si2a6ki

4si2a6ki3#

这个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
kyvafyod

kyvafyod4#

这是一个相当笨拙的答案,但您可以执行一个简单的Map,如:

inoremap def def :<Esc>i

它会执行您想要的操作。也就是说,当您键入“def”时,它会将其解释为“def:”,然后返回到正常模式(在这里您可以移动一点),然后返回到插入模式。
这同样适用:

inoremap def def :<Left>

当然,问题是每当def出现时,它就会替换它们,这是不理想的。

ht4b089n

ht4b089n5#

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

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

tf7tbtn26#

我使用LunarVim并在配置中添加以下行:

lvim.keys.insert_mode[":<Enter>"] = "<Esc>$a:<Enter>"

相关问题