PeepOpen-Issues icon indicating copy to clipboard operation
PeepOpen-Issues copied to clipboard

[PATCH] MacVim Tab support

Open borgand opened this issue 13 years ago • 1 comments

Enable PeepOpen to use MacVim tabs even if MacVim is configured to open files from other apps in new windows. It first detects if the editor is MacVim and then executes the MacVim with --remote-tab-silent argument.

diff --git a/Classes/Controllers/FuzzyTableViewController.rb b/Classes/Controllers/FuzzyTableViewController.rb
index a8c015b..8b407f2 100755
--- a/Classes/Controllers/FuzzyTableViewController.rb
+++ b/Classes/Controllers/FuzzyTableViewController.rb
@@ -152,8 +152,15 @@ class FuzzyTableViewController
         return false
       end

-      NSWorkspace.sharedWorkspace.openFile(record.absFilePath,
+      workspace = NSWorkspace.sharedWorkspace
+      if editorApplicationName == "MacVim"
+        vim = File.join(workspace.fullPathForApplication("MacVim"), "Contents/MacOS/Vim")
+        system vim, "--remote-tab-silent", record.absFilePath
+      else
+        workspace.openFile(record.absFilePath,
                                            withApplication:editorApplicationName)
+      end
+      

       # Reset for next search
       searchForString("")

borgand avatar Sep 21 '11 14:09 borgand

Unfortunately the above patch mixes up Vim windows (as it has no clue where PeepOpen was launched from). Fortunately Vim has a feature to overcome this using servernames. Each Vim process can be named (and is automatically) named uniquely and from cmd line the --servername <name> swhich can be used to select between these.

So the below patch now makes the following changes:

  • enable additional editorParams to be specified in the URL and store those too in sessionConfig. I think other editors might want to take advantage of this too, perhaps.
  • for MacVim editor, map all those params to cmd-line switches
  • make use of above modifications and enable peepopen.vim to specify current servername in the URL.

Altogether PeepOpen now is aware of current Vim window/server name and opens all files in the same window as new tabs.

The patch:

diff --git a/Classes/Controllers/AppDelegate.rb b/Classes/Controllers/AppDelegate.rb
index 014cc83..44218f4 100755
--- a/Classes/Controllers/AppDelegate.rb
+++ b/Classes/Controllers/AppDelegate.rb
@@ -34,11 +34,17 @@ class AppDelegate

       if customUrl.query
         # Don't try to gsub unless there is a query to work with.
-        editorName = customUrl.query.gsub('editor=', '')
+        
+        # Parse query for all params
+        queryParams = {}
+        customUrl.query.split(/&/).map{|p| k,v=p.split(/=/); queryParams[k] = v}
+        
+        editorName = queryParams.delete('editor')

         # Save the editor name to a SessionConfig object so we can pluck it out of the air later
         # (see FuzzyTableViewController.handleRowClick)
         @sessionConfig.editorName = editorName
+        @sessionConfig.editorParams = queryParams
       end

       application(nil, openFile:customUrl.path)
diff --git a/Classes/Controllers/FuzzyTableViewController.rb b/Classes/Controllers/FuzzyTableViewController.rb
index a8c015b..5685e60 100755
--- a/Classes/Controllers/FuzzyTableViewController.rb
+++ b/Classes/Controllers/FuzzyTableViewController.rb
@@ -142,6 +142,7 @@ class FuzzyTableViewController
       FuzzyRecord.storeRecentlyOpenedRecord(record)

       editorApplicationName = NSApp.delegate.sessionConfig.editorName
+      editorParams = NSApp.delegate.sessionConfig.editorParams
       if editorApplicationName.empty?
         editorApplicationName =
           NSUserDefaults.standardUserDefaults.stringForKey('editorApplicationName')
@@ -152,8 +153,28 @@ class FuzzyTableViewController
         return false
       end

-      NSWorkspace.sharedWorkspace.openFile(record.absFilePath,
+      workspace = NSWorkspace.sharedWorkspace
+      if editorApplicationName == "MacVim"
+        # Get the location of MacVim executable
+        vim_cmd = [ File.join(workspace.fullPathForApplication("MacVim"), "Contents/MacOS/Vim") ]
+        
+        # If given additional arguments, add them too
+        if editorParams
+          editorParams.each do |name,value|
+            vim_cmd << "--#{name}" << value
+          end
+        end
+        
+        # Add default arguments and remote-tab switch
+        vim_cmd << "-g" << "--remote-tab-silent" << record.absFilePath
+        
+        # Execute the command
+        system *vim_cmd
+      else
+        workspace.openFile(record.absFilePath,
                                            withApplication:editorApplicationName)
+      end
+      

       # Reset for next search
       searchForString("")
diff --git a/Classes/Helpers/SessionConfig.rb b/Classes/Helpers/SessionConfig.rb
index b3282ef..78583c0 100644
--- a/Classes/Helpers/SessionConfig.rb
+++ b/Classes/Helpers/SessionConfig.rb
@@ -8,6 +8,7 @@
 class SessionConfig

   attr_accessor :editorName
+  attr_accessor :editorParams

  def initialize(editorName)
     @editorName = editorName
diff --git a/Support/vim-peepopen/plugin/peepopen.vim b/Support/vim-peepopen/plugin/peepopen.vim
index 6ceab7c..d24fedc 100644
--- a/Support/vim-peepopen/plugin/peepopen.vim
+++ b/Support/vim-peepopen/plugin/peepopen.vim
@@ -26,7 +26,7 @@ set cpo&vim

 function s:LaunchPeepOpenViaVim()
   let cwd = getcwd()
-  silent exe "!open \"peepopen://" . shellescape(cwd) . "?editor=MacVim\""
+  silent exe "!open \"peepopen://" . shellescape(cwd) . "?editor=MacVim&servername=" . v:servername . "\""
 endfunction

 command! PeepOpen :call <SID>LaunchPeepOpenViaVim()

borgand avatar Sep 26 '11 10:09 borgand