Tip 957 Printable Monobook Previous Next

created 2005 · complexity basic · author Jonathan Orlev · version 5.7

For me, the most irritating thing when using the wonderful Vim is starting a second copy of Vim while a first one was already running.

For example: opening a file already open in the first Vim instance within a second instance of Vim gives an error message, because the swap file is already in use (not to mention that this might cause a loss of data).

So I added this to my vimrc. I am using gvim on Windows, but this will probably also work with gvim in other systems.

" If the v:servername ends with a number, then this is for sure a second
" copy of Vim.
if v:servername =~? '^.*[0-9][0-9]*$'
  echo "MyWarning: Another copy of gvim or Vim is probably loaded!"


For users running gvim on Unixes, an alternative is to always use

/usr/local/bin/gvim --remote-silent FILENAME

If gvim is already running, the file is opened there. Otherwise, a new gvim instance is started.

For interactive shell sessions, it would help to define a shorter alias, such as:

alias gvimrem='/usr/local/bin/gvim --remote-silent' 

However, running gvimrem alone would lead to an error because the --remote-silent option must always be followed by one or more filenames.

There is a script called Vimer that takes care of these corner cases and opens files in existing instance of GVim or MacVim.

  1. vimer foo.txt bar.txt opens both files in the same instance of GVim or MacVim.
  2. vimer launches a new instance of GVim or MacVim.
  3. ls | vimer - shows the output of ls in an existing instance of GVim or MacVim if it exists.

For more convenience, consider renaming the script to a command you already use, e.g. vi, gvim, etc. On Windows, you have to rename it to vi.cmd, gvim.cmd, etc. This means that you don't have to retrain your muscle memory to use a new command and you can continue typing the command you are used to.

Here is a better version for the tip. This is more general, and therefore preferable:

" If the serverlist contains more than one item, than another instance of
" Vim is loaded.
if serverlist() =~? "\n."
  echo "MyWarning: Another copy of gvim or Vim is probably loaded !"

I agree, this serverlist() functions is working on Linux, where v:servername does not. Replace the original!

And you may also replace the operator '=~?' with '=~'

See the :RemoteOpen command from remoteopen.vim which is part of latex-suite plugin.

Community content is available under CC-BY-SA unless otherwise noted.