[TxMt] Calling 'mate' remotely
William Uther
willu.mailingLists at cse.unsw.edu.au
Mon Aug 14 12:37:33 UTC 2006
Hi,
Thanks for the previous help. I'm a little chagrined that they
seemed obvious questions. I had looked for answers... honest. :)
Anyway, I've got another use case that I could use some help with. I
often ssh into another unix box, and occasionally need to edit a file
while I'm there. With bbedit, I had a script that would ssh back
into my mac and then open the remote file on the unix box. I'm
trying to replicate that with TextMate. The closest I've found in
the mailing list is this:
http://comox.textdrive.com/pipermail/textmate/2006-February/008384.html
My version is as follows. On the remote box I have a script called
'mate':
-----
#! /bin/sh
# Make sure we have the full path to the file
if echo $1 | egrep ^/ - > /dev/null ; then
path=$1 ;
else
path=`pwd`/$1 ;
fi
HOST=`hostname`
echo Opening $path on ${SSH_CLIENT%% *}
ssh willu@${SSH_CLIENT%% *} remoteOpen ${USER} ${HOST} "$path"
-----
On my Mac I have this script called 'remoteOpen':
-----
#!/bin/sh
remUser=$1
remHost=$2
remPath=$3
remBase=`basename $remPath`
remDir=`dirname $remPath`
tempDir=`mktemp -d` || exit 1
localfile="${tempDir}/scp:${remHost}:${remBase}"
localBackup="${tempDir}/backup"
remLoc="${remUser}@${remHost}:${remPath}"
echo "${remLoc}" > ${tempDir}/remLoc
scp -Bpq "${remLoc}" "${localfile}" && cp "${localfile}" $
{localBackup} && osasc
ript -e "tell app \"Terminal\" to do shell script \"mate -w $
{localfile}\""
if ! cmp -s "${localfile}" ${localBackup} ; then
scp -Bpq "${localfile}" "${remLoc}"
fi
rm -rf ${tempDir}
-----
I then have the following command for use within TextMate (instead of
the normal 'save'):
Save the current file then:
-----
if [[ ${TM_FILEPATH} == */scp:* ]] ; then
# this is an scp file
# it has been saved by the time we get here
# now just extract its remote name and scp it back
localDir=`dirname $TM_FILEPATH`
remLoc=`cat ${localDir}/remLoc`
scp -Bpq "$TM_FILEPATH" "${remLoc}" && cp "$TM_FILEPATH" "$
{localDir}/backup"
fi
-----
This setup saves a backup of the remote version locally. If the
local copy gets saved with the special command while you're editing,
and the data is scp'd back to the other host, then the backup is
updated. Otherwise, the difference is detected and the data is scp'd
back to the remote box when the window is closed.
Current issues:
i) Most importantly, the 'mate' command doesn't work from a remote
shell. This leads to the whole osascript workaround. Unfortunately,
while Terminal is running a script it just queues up all the input to
its other windows and waits for the script to end. This makes the
current setup significantly less useful than the same setup using
bbedit (where the 'bbedit' command does work from a remote terminal).
ii) It would be nice if there was a way to tell textmate 'run this
script when you write to that file'. Basically, make the 'mate'
command have an equivalent to the ODB Editor Suite of Apple Events.
I imagine some extra options like this:
--title WindowTitle Start editing the new file with this window
title instead of the file name as window title
--onsave scriptPath When the file is saved, this script is run
with the path to the file as an argument
--onclose scriptPath When the file is closed (or Save As... is
used to detach from the original file), this script is run with the
path of the file as an argument
and perhaps a final option:
--on-reopen scriptPath Data This is a command line option that
takes two arguments. If this file re-opened from the 'Open Recent >'
menu then the script 'scriptPath' is run with 'Data' as an argument
to get the path of the file to open.
This set of options would allow third parties to implement the
much-requested 'sftp' feature, as well as any other file access
method they wanted to.
Cheers,
Will :-}
P.S. I know - just use transmit or Cyberduck. The problem is that
they require me to connect from the mac. I could modify my
'remoteOpen' script to use them instead of scp, and that would solve
the 'detecting save' problem (point ii), but it wouldn't solve the
worst problem, point i.
More information about the textmate
mailing list