Vim Tips Wiki
Tip 957 Printable Monobook Previous Next

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

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

Use Vimer tool to ensure that whenever a new file is opened from terminal, it opens as a new buffer in an existing GVim/MacVim window (not a new instance of GVim/MacVim). This script is available for Windows, Linux and macOS. It works with both GVim and MacVim. You can download the script and just rename it to vi (on Linux or macOS) or vi.cmd (on Windows) and place the script in a directory that appears in the PATH environment variable. Then just run vi foo.txt on the terminal and Vimer will ensure that the new file is always opened in a buffer of an existing instance of GVim/MacVim (not a new one). If you would rather want to open the files as new tabs (not buffers) in existing instance of GVim/MacVim, then use the -t option with Vimer like this: vi -t foo.txt. Read Vimer's Getting Started Guide for more details.

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.