Remote ctags with vim

Using a text editor inside a terminal really sucks. It’s really lame that it’s 2012, and we’re still doing it this way.

So I resolved to try to run MacVim locally to do my work. It has a netrw module that lets you do certain things like open a sftp:// url directly, and browse remote trees. Great. But what about ctags?

Turns out ctags file format is pretty simple.

tag<tab>filename<tab>bunch of other stuff...

It also turns out that if in the filename field, you have a “sftp://…” style string, vim doesn’t freak out! Sweet!

So my hack for the night was to write a script that:

  1. logs in remotely and kicks of a ctags run
  2. copies that tags file locally
  3. munges that file to replace relative paths in the remote fs with sftp://… prefixed paths that a local vim could use to access remote files
  4. write some .vimrc to load that tags file

And it works! I can use :tj to search for tags, and vim will automatically open up the right file over sftp and show me the tag. 

The only thing I can’t seem to work out is how to disable the extra “press Enter to continue” prompt that happens every time vim needs to open a new remote file. If I can get rid of that, this is almost a perfect solution.

Actually, one other problem is that vim doesn’t seem to be able to tab-complete sftp://… urls, which seems a little silly, since it has a pretty sophisticated directory browser built in.

For those who are curious, here’s my lame script to munge the tags file:

sftp_prefix = 'sftp://dev/www/'

infile = file('/Users/kdeeter/workstate/tags.raw', 'r')
outfile = file('/Users/kdeeter/workstate/tags', 'w')

lines = infile.readlines()
cnt = 0

for line in lines:
   tag, fname, rest = line.split('t', 2)
   if not tag[0:5] == '!_TAG':
     outfile.write(tag + 't' + sftp_prefix + fname + 't' + rest)
   cnt += 1
   if cnt % 1000 == 0:
      print '%s tags mungedr' % (cnt * 1000),


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: