macvim-dev / macvim-dev/macvim

Feature Request: detect and reuse MacVim instance to open file by mvim:// url

Open
#1,402 7 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Vim Script
Stars
7.9k
Forks
691
PR merge metrics
No merged PRs in 30d

Description

Greeting!

I configure mvim:// in React Developer Tools to open file in MacVim from the browser extension.

mvim://open?url=file://{path}&line={line}
image

It works good, but there's a small issue. The issue is that MacVim doesn't reuse the instance that I opened if the target file hasn't been opened. For example, I launch MacVim from /path/to/my-project, and I open files /path/to/my-project/{a,b,c}.js from React Developer Tools. They have different results:

file is editing or has been opened result
a.js editing 😃 get opened in the right instance
b.js has been opened 😃 ditto
c.js neither 💔 get opened in a new instance

I hope the c.js can be opened like a.js and b.js.

I have a workaround in favor of Raycast Script Command deeplinks. My script launch MacVim with specified servername, the launched instance will be reuse if I execute the script again. Here it is (I have multiple ones generated by another script):

#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Vim Launch
# @raycast.mode silent
# Optional parameters:
# @raycast.icon ✅
# @raycast.packageName vim-launch
# @raycast.argument1 { "type": "text", "placeholder": "file path", "optional": true }
# @raycast.argument2 { "type": "text", "placeholder": "line number", "optional": true }

# Documentation:
# @raycast.description Open vim startify session

export PATH=/Applications/MacVim.app/Contents/bin:$PATH

open_file()
{
    if [[ -n $1 ]]; then
      mvim --servername THE_SERVER_NAME --remote-send "<c-w>:tabedit $1<CR>"
    fi
    if [[ -n $2 ]]; then
      mvim --servername THE_SERVER_NAME --remote-send "$2G"
    fi
}

SERVERS=`mvim --serverlist | grep -i THE_SERVER_NAME | awk '{print tolower($0)}'`
for server in $SERVERS; do
  if [[ $server == "THE_SERVER_NAME" ]];
  then
    osascript >/dev/null <<END
      tell application "System Events" to tell process "MacVim"
        set frontmost to true
        windows where title ends with "THE_SERVER_NAME"
        if result is not {} then perform action "AXRaise" of item 1 of result
      end tell
END
    open_file $1 $2
    exit 0
  fi
done

LANG=en_US.UTF-8 mvim --servername THE_SERVER_NAME +SLoad\ THE_SERVER_NAME >/dev/null 2>&1
# wait for server registration
sleep 1
open_file $1 $2

With this script, I replace mvim:// url with Raycast's deeplink:

raycast://script-commands/vim-launch?arguments={path}&arguments={line}

It's fixed! However it would be better to have native support in MacVim.

I would suggestion to add feature to detect the instance I want to open file with (like if the opening file path is in the working directory of an instance, the closest one), or add another parameter to specified the instance.

Thanks!

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

The issue names MacVim's mvim:// URL handling and instance/server selection, but no source files or tests. Start by locating the URL entry point and the logic that chooses an existing MacVim instance. Done means an unopened file can reuse the appropriate existing instance, with coverage for the reported a.js, b.js, and c.js cases.

Written by the indexing model from the issue text.

Assessment

Tech stack
bash, macos, vim
Domain
desktop
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.