MacVim: create new file from command line by using `alias mvim="open -a macvim"`
Asked Answered
D

2

6

When I use vim newfilename to open a file and this file does not exit, vim will create a new file with the name newfilename.

However, MacVim does not work in this way --- i.e. mvim newfilename (alias mvim="open -a macvim") will lead to an error: newfilename does not exist

Is there a way to configure MacVim such that mvim newfilename (alias mvim="open -a macvim") will create a new file and open it?

Donaugh answered 18/9, 2011 at 0:31 Comment(5)
I'm running mvim version 7.3.237 and it creates new files just fine. What version are you running?Bart
@peter-lyons: that's weird, I have the same version. I download the macvim binary from the official website, rather than compiling the source code. Is that the problem?Donaugh
I got snapshot 58 from here (I'm running Janus). Maybe try that? github.com/b4winckler/macvim/downloads Otherwise, it's easy to alias mvim in your shell to a little shell function that uses touch to make a file if it doesn't already exist and then launch mvim on it.Bart
@peter-lyons: Thanks a lot for the information. I just realised that I am using alias mvim="open -a macvim" rather the official mvim script. The official mvim script works quite well to create new files, but has problems to open a file in an existing MacVim window. See: #3479255Donaugh
Glad you figured it out. Thanks for the link to that question, which links to a mailing list discussion with a good solution to the new window problem!Bart
M
7

I'm guessing the error message comes from open, not from vim. You can replace your alias with a function;

mvim () {
    local f
    for f; do
        test -e "$f" || touch "$f"
    done
    open -a macvim "$@"
}

This will create empty files if necessary before opening them.

edit Didn't see @Peter Lyons' comment about this; credit should go to him for first suggesting this solution. I'll be happy to remove this answer if Peter wants to submit his.

Mirnamirror answered 18/9, 2011 at 9:0 Comment(1)
It works very well, thank you very much!!! @Peter Lyons: thank you very much too!Donaugh
C
3

You don't need the mvim alias to the open command, you can instead use the mvim launcher script that comes bundled with most MacVim Snaphots. After adding that mvim to your path, then runing mvim newfile, will now open a newfile buffer in an new MacVim window just like gvim would.

The MacVim mvim script as linked to above:

#!/bin/sh
#
# This shell script passes all its arguments to the binary inside the
# MacVim.app application bundle.  If you make links to this script as view,
# gvim, etc., then it will peek at the name used to call it and set options
# appropriately.
#
# Based on a script by Wout Mertens and suggestions from Laurent Bihanic.  This
# version is the fault of Benji Fisher, 16 May 2005 (with modifications by Nico
# Weber and Bjorn Winckler, Aug 13 2007).
# First, check "All the Usual Suspects" for the location of the Vim.app bundle.
# You can short-circuit this by setting the VIM_APP_DIR environment variable
# or by un-commenting and editing the following line:
# VIM_APP_DIR=/Applications

if [ -z "$VIM_APP_DIR" ]
then
    myDir="`dirname "$0"`"
    myAppDir="$myDir/../Applications"
    for i in ~/Applications ~/Applications/vim $myDir $myDir/vim $myAppDir $myAppDir/vim /Applications /Applications/vim /Applications/Utilities /Applications/Utilities/vim; do
        if [ -x "$i/MacVim.app" ]; then
            VIM_APP_DIR="$i"
            break
        fi
    done
fi
if [ -z "$VIM_APP_DIR" ]
then
    echo "Sorry, cannot find MacVim.app.  Try setting the VIM_APP_DIR environment variable to the directory containing MacVim.app."
    exit 1
fi
binary="$VIM_APP_DIR/MacVim.app/Contents/MacOS/Vim"

# Next, peek at the name used to invoke this script, and set options
# accordingly.

name="`basename "$0"`"
gui=
opts=

# GUI mode, implies forking
case "$name" in m*|g*|rm*|rg*) gui=true ;; esac

# Restricted mode
case "$name" in r*) opts="$opts -Z";; esac

# vimdiff, view, and ex mode
case "$name" in
    *vimdiff)
        opts="$opts -dO"
        ;;
    *view)
        opts="$opts -R"
        ;;
    *ex)
        opts="$opts -e"
        ;;
esac

# Last step:  fire up vim.
# The program should fork by default when started in GUI mode, but it does
# not; we work around this when this script is invoked as "gvim" or "rgview"
# etc., but not when it is invoked as "vim -g".
if [ "$gui" ]; then
    # Note: this isn't perfect, because any error output goes to the
    # terminal instead of the console log.
    # But if you use open instead, you will need to fully qualify the
    # path names for any filenames you specify, which is hard.
    exec "$binary" -g $opts ${1:+"$@"}
else
    exec "$binary" $opts ${1:+"$@"}
fi
Contemptible answered 26/4, 2012 at 15:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.