On 1.07.04, G. Milde wrote:
>
> I wrote a simple shell script that seems to do the trick.
There is an error when the filename is relative and
pwd != LyX's working dir.
The attached python version solves this.
G�nter
--
G.Milde at web.de
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
"""Open a file in a running LyX or start LyX with the file
Needs the LyX-Server running (Set Edit>Preferences>Paths>Server-pipe)
Test the LyX-Server with lyx -dbg 4096.
"""
# TODO: a function for nonblocking opening of a file/pipe
# a function for reading a nonblocking pipe with select
# a lyxclient object (see /usr/share/pybliographer/Pyblio/LyX.py)
import sys, os
# --- Customizable values -------------------------------------------
# the server pipe path (".in" and ".out" will be added)
lyxpipe = os.environ.get("LYXPIPE", "~/.lyx/lyxpipe")
# the lyx-function we want to use (see lfuns in the LyX-Wiki)
lfun = "file-open"
# --- Preparation ---------------------------------------------------
# normalize the path and convert ~-constructs
pipename = os.path.abspath(os.path.expanduser(lyxpipe))
inpipename = pipename+".in"
outpipename = pipename+".out"
# --- open the server pipe -------------------------------------------
# the built in file() function doesnot allow nonblocking mode
# inpipe = file(lyxpipe+'.in', 'w', 0)
# --> use os.open
# instead of advance tests we catch exceptions (no pipe, lefover pipe)
try:
inpipe_fd = os.open(inpipename, os.O_WRONLY|os.O_NONBLOCK)
except OSError, exception:
# print "\nerror opening " + inpipename
if exception.errno == 2:
print "serverpipe " + inpipename + " doesnot exist:"
print "wrong path or no running LyX"
elif exception.errno == 6:
print "pipe exists but not open for reading"
print "assume leftover from a crashed lyx -> deleting it"
os.remove(inpipename)
os.remove(outpipename)
else:
raise
print "starting a new lyx session"
os.execvp("lyx", sys.argv)
# convert to built in file object
inpipe = os.fdopen(inpipe_fd, 'w', 0)
# Send a LYXCMD for every filename argument
for arg in sys.argv[1:]:
arg = os.path.abspath(arg)
# close the LYXCMD line with a '\n' or it will be ignored!
inpipe.write("LYXCMD:lyx-remote:%s:%s\n"%(lfun,arg))
# response = outpipe.read()
# print response
inpipe.close()