16

This might be a dumb question, but bear with me.

I'm automating some of the usual stuff I do when setting up a new work environment, and would like to automate the Vim command :BundleInstall (for installing all my Vim plugins).

Is it possible to run this from the shell?

Alternatively, is it possible to have the script run Vim, execute :BundleInstall, wait until it finishes and quit?

Thanks.

imiric
  • 478
  • 2
  • 4
  • 14

4 Answers4

17

From the vim(1) man page:

+{command}

-c {command}

{command} will be executed after the first file has been read. {command} is interpreted as an Ex command. If the {command} contains spaces it must be enclosed in double quotes (this depends on the shell that is used). Example: Vim "+set si" main.c

Note: You can use up to 10 "+" or "-c" commands.

cYrus
  • 21,379
  • 8
  • 74
  • 79
Ignacio Vazquez-Abrams
  • 111,361
  • 10
  • 201
  • 247
  • 4
    Thanks! I knew I'd feel dumb... :-/ Serves me right for not reading the manpage thoroughly. I ended up using `vim +BundleInstall +qall!`. – imiric Jul 21 '12 at 23:18
5

You can execute your command like this:

vim -E -c BundleInstall -c q

which will avoid opening a Vim window in your terminal.

Note: My first answer included the -s option which I had needed for another application but was incorrect here because it prevented much of Vim's intialization including sourcing the plugin that defined the BundleInstall command.

garyjohn
  • 34,610
  • 8
  • 97
  • 89
  • 1
    Thanks, but for some reason it won't work for me. – imiric Jul 21 '12 at 23:19
  • 1
    Now I see why. I forgot that `-s` does more than inhibit certain messages--it also inhibits intializations--so the definition of BundleInstall wasn't being sourced. One way to fix that would be to add an option like this before the first `-c`: `--cmd 'runtime plugin/bundle.vim'`. Edit that file name to suit. See `:help -s-ex`. – garyjohn Jul 24 '12 at 00:49
3

While the vim specific recipe above is the right way to do it, you can always use a more general approach like autoexpect.

AnonymousLurker
  • 1,003
  • 1
  • 11
  • 18
0

For situations where you need for vim to have fully loaded up as if you started it manually, this works:

vim -c "autocmd! CursorHold * <commands to run>"

For example, I wanted to redirect the output of :map to a file from the shell, but I wanted to capture the mapping that vim-airline creates only after it's displayed its tabline (line at top showing all buffernames open.) Because it seems to do this asynchronously, simply running a -c redirect to a file wasn't giving it time to make the mappings. There could be a better way, but this works for me, especially since I already have updatetime set to 100 (0.1 seconds), which affects how long until the CursorHold event fires. By default, vim sets it to 4 seconds.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
user1902689
  • 192
  • 1
  • 10