Created
October 23, 2013 10:42
-
-
Save nils-werner/7116389 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
SUBLIME="subl" | |
# We need to remove the stupid "file://" that Evince puts in front of the file name | |
# Notice the wild quoting: we need to interpolate $SUBLIME | |
# In the end, EDITORCMD should be of the form: | |
# | |
# f=%f; sublime-text "${f#file://}:%l" | |
# | |
# where sublime-text is the name of the sublime-text binary | |
EDITORCMD="f=\"%f\"; $SUBLIME \"\${f#file://}:%l\"" | |
PDFFILE="$1" | |
if [ -f "$PDFFILE" ];then | |
# danke an Feuerfieber | |
# http://forum.ubuntuusers.de/topic/evince-synctex-vim-emacs-scite-lyx-kile-editor/#post-2841828 | |
if [ -f "${PDFFILE%%.pdf}.synctex" ];then | |
# we change the cwd to this directory, so this should work | |
# also note that we stick in 'python' because the script file need not be executable | |
evince_backward_search "$PDFFILE" "$EDITORCMD"& | |
BACKWARD_SEARCH_PID=$! | |
#echo $BACKWARD_SEARCH_PID | |
fi | |
fi | |
/usr/bin/evince "$1" | |
if [ "$BACKWARD_SEARCH_PID" ];then | |
#echo "Killing $BACKWARD_SEARCH_PID" | |
kill $BACKWARD_SEARCH_PID | |
fi |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python2 | |
# -*- coding: utf-8 -*- | |
# Copyright (C) 2010 Jose Aliste <[email protected]> | |
# 2011 Benjamin Kellermann <[email protected]> | |
# | |
# This program is free software; you can redistribute it and/or modify it under | |
# the terms of the GNU General Public Licence as published by the Free Software | |
# Foundation; either version 2 of the Licence, or (at your option) any later | |
# version. | |
# | |
# This program is distributed in the hope that it will be useful, but WITHOUT | |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
# FOR A PARTICULAR PURPOSE. See the GNU General Public Licence for more | |
# details. | |
# | |
# You should have received a copy of the GNU General Public Licence along with | |
# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin | |
# Street, Fifth Floor, Boston, MA 02110-1301, USA | |
# Incorporates fixes from http://ubuntuforums.org/showthread.php?t=1716268 | |
import dbus, subprocess, time, re, urllib, sys | |
RUNNING, CLOSED = range(2) | |
EV_DAEMON_PATH = "/org/gnome/evince/Daemon" | |
EV_DAEMON_NAME = "org.gnome.evince.Daemon" | |
EV_DAEMON_IFACE = "org.gnome.evince.Daemon" | |
EVINCE_PATH = "/org/gnome/evince/Evince" | |
EVINCE_IFACE = "org.gnome.evince.Application" | |
EV_WINDOW_IFACE = "org.gnome.evince.Window" | |
class EvinceWindowProxy: | |
"""A DBUS proxy for an Evince Window.""" | |
daemon = None | |
bus = None | |
def __init__(self, uri, editor, spawn = False, logger = None): | |
self._log = logger | |
self.uri = uri.replace(" ", "%20") | |
self.editor = editor | |
self.status = CLOSED | |
self.source_handler = None | |
self.dbus_name = '' | |
self._handler = None | |
try: | |
if EvinceWindowProxy.bus is None: | |
EvinceWindowProxy.bus = dbus.SessionBus() | |
if EvinceWindowProxy.daemon is None: | |
EvinceWindowProxy.daemon = EvinceWindowProxy.bus.get_object(EV_DAEMON_NAME, | |
EV_DAEMON_PATH, | |
follow_name_owner_changes=True) | |
EvinceWindowProxy.bus.add_signal_receiver(self._on_doc_loaded, signal_name="DocumentLoaded", | |
dbus_interface = EV_WINDOW_IFACE, | |
sender_keyword='sender') | |
self._get_dbus_name(False) | |
except dbus.DBusException: | |
if self._log: | |
self._log.debug("Could not connect to the Evince Daemon") | |
def _on_doc_loaded(self, uri, **keyargs): | |
if uri == self.uri and self._handler is None: | |
self.handle_find_document_reply(keyargs['sender']) | |
def _get_dbus_name(self, spawn): | |
EvinceWindowProxy.daemon.FindDocument(self.uri, spawn, | |
reply_handler=self.handle_find_document_reply, | |
error_handler=self.handle_find_document_error, | |
dbus_interface = EV_DAEMON_IFACE) | |
def handle_find_document_error(self, error): | |
if self._log: | |
self._log.debug("FindDocument DBus call has failed") | |
def handle_find_document_reply(self, evince_name): | |
if self._handler is not None: | |
handler = self._handler | |
else: | |
handler = self.handle_get_window_list_reply | |
if evince_name != '': | |
self.dbus_name = evince_name | |
self.status = RUNNING | |
self.evince = EvinceWindowProxy.bus.get_object(self.dbus_name, EVINCE_PATH) | |
self.evince.GetWindowList(dbus_interface = EVINCE_IFACE, | |
reply_handler = handler, | |
error_handler = self.handle_get_window_list_error) | |
def handle_get_window_list_error (self, e): | |
if self._log: | |
self._log.debug("GetWindowList DBus call has failed") | |
def handle_get_window_list_reply (self, window_list): | |
if len(window_list) > 0: | |
window_obj = EvinceWindowProxy.bus.get_object(self.dbus_name, window_list[0]) | |
self.window = dbus.Interface(window_obj,EV_WINDOW_IFACE) | |
self.window.connect_to_signal("SyncSource", self.on_sync_source) | |
else: | |
#That should never happen. | |
if self._log: | |
self._log.debug("GetWindowList returned empty list") | |
def on_sync_source(self, input_file, source_link, time): | |
#print input_file + ":" + str(source_link[0]) | |
# This is probably useless | |
input_file = input_file.replace("%20", " ") | |
# This is to deal with source files with non-ascii names | |
# We get url-quoted UTF-8 from dbus; convert to url-quoted ascii | |
# and then unquote. If you don't first convert ot ascii, it fails. | |
# It's a bit magical, but it seems to work | |
input_file = urllib.unquote(input_file.encode('ascii')) | |
#print type(input_file), input_file | |
cmd = re.sub("%f",input_file,self.editor) | |
cmd = re.sub("%l",str(source_link[0]), cmd) | |
#print cmd | |
subprocess.call(cmd, shell=True) | |
if self.source_handler is not None: | |
self.source_handler(input_file, source_link, time) | |
## This file offers backward search in any editor. | |
## evince_dbus pdf_file line_source input_file | |
if __name__ == '__main__': | |
import dbus.mainloop.glib, gobject, glib, sys, os | |
def print_usage(): | |
print """Usage: | |
evince_backward_search pdf_file "editorcmd %f %l"' | |
%f ... TeX-file to load | |
%l ... line to jump to | |
E.g.: | |
evince_backward_search somepdf.pdf "gvim --servername somepdf --remote-silent '+%l<Enter>' %f" | |
evince_backward_search somepdf.pdf "emacsclient -a emacs --no-wait +%l %f" | |
evince_backward_search somepdf.pdf "scite %f '-goto:%l'" | |
evince_backward_search somepdf.pdf "lyxclient -g %f %l" | |
evince_backward_search somepdf.pdf "kate --use --line %l" | |
evince_backward_search somepdf.pdf "kile --line %l" """ | |
sys.exit(1) | |
if len(sys.argv)!=3: | |
print_usage() | |
pdf_file = os.path.abspath(sys.argv[1]) | |
if not os.path.isfile(pdf_file): | |
print_usage() | |
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) | |
a = EvinceWindowProxy('file://' + pdf_file, sys.argv[2] ,True) | |
loop = gobject.MainLoop() | |
loop.run() | |
# ex:ts=4:et: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python2 | |
# -*- coding: utf-8 -*- | |
# Copyright (C) 2010 Jose Aliste <[email protected]> | |
# 2011 Benjamin Kellermann <[email protected]> | |
# | |
# This program is free software; you can redistribute it and/or modify it under | |
# the terms of the GNU General Public Licence as published by the Free Software | |
# Foundation; either version 2 of the Licence, or (at your option) any later | |
# version. | |
# | |
# This program is distributed in the hope that it will be useful, but WITHOUT | |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
# FOR A PARTICULAR PURPOSE. See the GNU General Public Licence for more | |
# details. | |
# | |
# You should have received a copy of the GNU General Public Licence along with | |
# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin | |
# Street, Fifth Floor, Boston, MA 02110-1301, USA | |
# This file offers forward search for evince. | |
import dbus, subprocess, time, sys, os | |
def print_usage(): | |
print 'Usage: evince_forward_search pdf_file line_number tex_file' | |
sys.exit(1) | |
if len(sys.argv)!=4: | |
print_usage() | |
try: | |
line_number = int(sys.argv[2]) | |
except ValueError: | |
print_usage() | |
# If there are spaces in the PDF file name, they MUST be URI-encoded as %20; | |
# the TEX file instead must be left alone, or SyncView will fail. | |
pdf_file = os.path.abspath(sys.argv[1]).replace(" ","%20") | |
tex_file = os.path.abspath(sys.argv[3]) | |
try: | |
bus = dbus.SessionBus() | |
daemon = bus.get_object('org.gnome.evince.Daemon', '/org/gnome/evince/Daemon') | |
dbus_name = daemon.FindDocument('file://' + pdf_file, True, dbus_interface = "org.gnome.evince.Daemon") | |
window = bus.get_object(dbus_name, '/org/gnome/evince/Window/0') | |
except dbus.DBusException: | |
print_exc() | |
# Added int(time.time()) per http://www.benwhale.com/blog/2012/09/06/evince-synctex-support-broke-for-me-today/ | |
window.SyncView(tex_file, (line_number,1), 0, dbus_interface="org.gnome.evince.Window") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment