自动运行多个vim命令和按键操作

3
我希望能够自动化在 vim 中运行多个命令,例如通过输入 :repl 实现。这些命令包括:
:ConqueTerm lein repl
<Esc>
:set syntax=clojure
<i>

如何定义一个自定义的vim函数(命令),以执行上述操作?
关于上述内容:
- `clojure` - Clojure编程语言(语法由vim-clojure-static提供) - ConqueTerm - 一个在vim缓冲区中交互式运行shell的vim插件 - `lein` - Leiningen,一个Clojure构建工具
2个回答

2

你可以创建一个函数,把需要执行的命令放在这个函数里:

fun! LeinCMD()
    execute 'ConqueTerm lein repl'
    execute 'set syntax=clojure'
    execute 'normal! i'
endf
command! Repl call LeinCMD()

您可以获取以上代码,并输入:ReplEnter测试它是否适用于您。

编辑

@Zyx的评论非常好。我将它们放在答案中,以便读者不会在将来错过有价值的信息。

  1. 这里不需要:execute调用。
  2. :normal! i无用,从函数中开始插入模式有:startinsert和:call feedkeys(),前者应该优先考虑。//注意::normal! i“在这里运行”是因为::ConqueTerm已经运行了:startinsert。也就是说,由于Conque是这样编写的,您根本不需要:startinsert,但如果没有它,:normal! i将继续不起任何有用的作用。

只需提到:使用command -bar会更好:这样,您就不需要使用:execute来将您的命令与管道符号链接(尝试Repl | echo "Here",并带或不带-bar作为:command的第二个参数)。我认为它应该是默认选项,不知道Bram为什么喜欢在许多地方使用坏默认值。


谢谢!为了后人,这里有一个关于如何“源”代码的答案:https://dev59.com/YG435IYBdhLWcg3wlRMf - noahlz
1
  1. 这里不需要任何 :execute 调用。
  2. :normal! i 是无用的,如果要从函数中开始插入模式,应该使用 :startinsert:call feedkeys(),前者应该优先考虑。// 注意::normal! i 在这里“工作”,是因为 :ConqueTerm 运行了 :startinsert。即由于 Conque 的编写方式,您根本不需要 :startinsert,但是如果它不存在,:normal! i 将继续没有用处。
- ZyX
@ZyX,非常感谢您的精彩评论和解释!我从您的评论中学到了很多。非常感谢! - Kent
1
刚才提到过:使用 command -bar 会更好,这样您就不需要使用 :execute 命令来将管道符与您的命令链接起来(尝试在 :command 的第二个参数中使用 -bar 和不使用 -bar 来运行 Repl | echo "Here")。我认为这应该是默认选项,不知道为什么 Bram 在很多地方都喜欢设置糟糕的默认值。 - ZyX
@Zyx非常感谢。虽然我曾经读过“-bar”,但我认为命令(无论是内置的还是自定义的命令)可以通过“|”连接成一个链是一种“默认”的方式...再次从您这里学到了东西。顺便说一下,我更新了答案并添加了您的评论,希望您不介意。 - Kent

0

你试过了吗?

function custom_function ()
  execute 'ConqueTerm lein repl'
  execute 'set syntax=clojure'
  return custom_function
endfunction

我不知道这段代码是否有效,因为我还没有测试过它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接