On Sun, Dec 20, 2009 at 03:02:30AM +0100, Enrico Forestieri wrote: > The script works on both Windows and Linux but doesn't work > on Cygwin :( I don't know why.
For some reason, COMMAND has to be quoted on cygwin. The attached now works on everything I have access to. Bennet, does it work for you on Mac? If not, please launch python in a terminal and report the output of the following command: "import sys; print sys.platform" -- Enrico
#! /usr/bin/env python # -*- coding: utf-8 -*- # file lyxeditor.py # This file is part of LyX, the document processor. # Licence details can be found in the file COPYING. # author Ronald Florence # author Angus Leeming # author Bennett Helm # author Enrico Forestieri # author Ben M. # Full author contact details are available in file CREDITS # This script passes filename and line number of a latex file to the lyxpipe # of a running instance of LyX. If the filename is an absolute path pointing # to an already existing latex file in the temp dir (produced by a preview, # for example), LyX will jump to the corresponding line in the .lyx file. # It may also be invoked by a viewer for performing a reverse DVI/PDF search. import os, re, string, sys, glob OSTYPE = sys.platform if OSTYPE == "darwin": OSTYPE="macosx" if OSTYPE == "win32": HOME = os.environ["USERPROFILE"] else: HOME = os.environ["HOME"] def parse_serverpipe(PREFERENCES): print "Parsing " + PREFERENCES fh = open(PREFERENCES, "r") lines = fh.readlines() serverpipe = r"\serverpipe " # Want to find lines starting with \serverpipe for line in lines: # Remove extra whitespace line = line.strip() # Does line start with \serverpipe? if line.startswith(serverpipe): # Remove \serverpipe line = line[len(serverpipe):].strip() # Get rid of any quotation marks if line[0] == line[-1] == '"': line = line[1:-1].strip() # Substitute $HOME for ~/ if line.startswith("~/"): line = HOME + line[1:] if not line == "": return line # Nothing found return "" if not len(sys.argv) == 3: print "Usage: " + sys.argv[0] + " <latexfile> <lineno>" sys.exit(1) if OSTYPE == "macosx": LYXSYSDIRS = ["/Applications/LyX.app/Contents/Resources"] LYXBASEDIR = "LyX" old_dir = os.getcwd() os.chdir(HOME + "/Library/Application Support") elif OSTYPE == "win32": LYXSYSDIRS = [r"..\Resources"] LYXBASEDIR = "lyx" old_dir = os.getcwd() os.chdir(os.environ["APPDATA"]) else: LYXSYSDIRS = ["/usr/share/lyx", "/usr/local/share/lyx", "/opt/share/lyx"] LYXBASEDIR = ".lyx" old_dir = os.getcwd() os.chdir(HOME) LYXPIPE = "" print "We're running " + OSTYPE print "Looking in " + os.getcwd() for LYXDIR in glob.glob(LYXBASEDIR + "*"): PREFERENCES = LYXDIR + "/preferences" if not os.path.isfile(PREFERENCES): continue # See if preferences file contains a \serverpipe entry LYXPIPE = parse_serverpipe(PREFERENCES) # If it does and $LYXPIPE.in exists, break out of the loop if (not LYXPIPE == "") and os.path.exists(LYXPIPE + ".in"): break LYXPIPE="" os.chdir(old_dir) if LYXPIPE == "": # The preferences file does not set lyxpipe, so check lyxrc.dist for SUBDIR in LYXSYSDIRS: for LYXSYSDIR in glob.glob(SUBDIR + "*"): LYXRC_DIST = LYXSYSDIR + "/lyxrc.dist" if not os.path.isfile(LYXRC_DIST): continue # See if lyxrc.dist contains a \serverpipe entry LYXPIPE = parse_serverpipe(LYXRC_DIST) # If it does and $LYXPIPE.in exists, break out of the loop if (not LYXPIPE == "") and os.path.exists(LYXPIPE + ".in"): break LYXPIPE="" if (not LYXPIPE == ""): break if LYXPIPE == "": print "Unable to find the lyxpipe!" sys.exit(1) # Let's do the job CAT = "cat" QUOTE = "\"" file = sys.argv[1] if OSTYPE == "macosx": file = string.replace(file, "/private", "") elif OSTYPE == "cygwin": cygpath = os.popen("cygpath -a \"" + file + "\"") file = cygpath.read().strip() cygpath.close() elif OSTYPE == "win32": CAT = "type" QUOTE = "" print "Using the lyxpipe " + LYXPIPE COMMAND = "LYXCMD:revdvi:server-goto-file-row:" + file + " " + sys.argv[2] print COMMAND LYXPIPEIN = "\"" + LYXPIPE + ".in\"" LYXPIPEOUT = "\"" + LYXPIPE + ".out\"" handle = os.popen("echo " + QUOTE + COMMAND + QUOTE + ">" + LYXPIPEIN, 'r') cmd_stdout = handle.read().strip() cmd_status = handle.close() print cmd_stdout if not cmd_status: handle = os.popen(CAT + " " + LYXPIPEOUT, 'r') cmd_stdout = handle.read().strip() cmd_status = handle.close() print "Response: " + cmd_stdout