emacs.py

Go to the documentation of this file.
00001 # Copyright 2005, 2006  Timo Savola
00002 #
00003 # This program is free software; you can redistribute it and/or modify
00004 # it under the terms of the GNU Lesser General Public License as published
00005 # by the Free Software Foundation; either version 2.1 of the License, or
00006 # (at your option) any later version.
00007 
00008 import os
00009 import gobject
00010 import gtk
00011 from gettext import gettext
00012 
00013 import environment
00014 import view
00015 import execution
00016 import config
00017 import extension
00018 
00019 conf = config.Directory('encode/emacs')
00020 views = []
00021 
00022 def init_extension(datadir):
00023         pass
00024 
00025 ##
00026 ## Handler
00027 
00028 class Handler (environment.HandlerExtension):
00029         command = 'emacsclient'
00030 
00031         def __init__(self):
00032                 environment.HandlerExtension.__init__(self)
00033 
00034                 conf.add_string('client_command', self.set_command)
00035 
00036                 label = gettext('Open in Emacs')
00037                 self.action = gtk.Action(None, label, None, None)
00038                 self.action.set_visible(True)
00039 
00040                 self.executor = execution.Executor()
00041 
00042         def set_command(self, command):
00043                 self.command = command
00044 
00045         def get_action(self):
00046                 return self.action
00047 
00048         def get_view(self):
00049                 global views
00050                 if views:
00051                         return views[0]
00052                 else:
00053                         raise environment.ViewNotFound, 'Emacs not running'
00054 
00055         def eval(self, view, expr):
00056                 server = view.get_server()
00057                 args = [self.command, '--socket-name', server, '--eval', expr]
00058 
00059                 self.executor.start(execution.Job(args))
00060 
00061         def supports_file(self, path):
00062                 global views
00063                 return bool(views)
00064 
00065         def handle_file(self, path):
00066                 self.open_file(path)
00067 
00068         def open_file(self, path, workdir=None, line=None):
00069                 path_expr = string_expr(path)
00070 
00071                 if line is not None:
00072                         expr = '(let* ((f %s)' \
00073                                '       (b (find-buffer-visiting f)))' \
00074                                ' (if b (switch-to-buffer b)' \
00075                                '       (find-file f))' \
00076                                ' (goto-line %d))' \
00077                                % (path_expr, line)
00078                 else:
00079                         expr = '(let* ((f %s)' \
00080                                '       (b (find-buffer-visiting f)))' \
00081                                ' (if b (switch-to-buffer b)' \
00082                                '       (find-file f)))' \
00083                                % path_expr
00084 
00085                 view = self.get_view()
00086                 self.eval(view, expr)
00087 
00088                 environment.show_view(view, focus=True)
00089 
00090         def close_file(self, path):
00091                 expr = '(let ((b (find-buffer-visiting %s)))' \
00092                        ' (if b (kill-buffer b)))' \
00093                        % Handler.string_expr(path)
00094 
00095                 global views
00096                 for view in views:
00097                         self.eval(view, expr)
00098 
00099         def cleanup(self):
00100                 global views
00101                 for view in views:
00102                         self.eval(view, '(save-buffers-kill-emacs)')
00103 
00104 gobject.type_register(Handler)
00105 
00106 def string_expr(path):
00107         return '"%s"' % path.replace('"', '\\"')
00108 
00109 ##
00110 ## Launcher
00111 
00112 class Launcher (environment.LauncherExtension):
00113         def __init__(self):
00114                 environment.LauncherExtension.__init__(self)
00115 
00116                 label = gettext('Emacs text editor')
00117                 self.action = gtk.Action(None, label, None, None)
00118                 self.action.set_visible(True)
00119 
00120         def get_action(self):
00121                 return self.action
00122 
00123         def create(self):
00124                 return View()
00125 
00126 gobject.type_register(Launcher)
00127 
00128 ##
00129 ## View
00130 
00131 class View (view.AbstractEmbedder):
00132         command = 'emacs'
00133 
00134         def __init__(self):
00135                 view.AbstractEmbedder.__init__(self)
00136 
00137                 conf.add_string('command', self.set_command)
00138 
00139                 text = gettext('Emacs')
00140                 self.label = gtk.Label(text)
00141                 self.label.show()
00142 
00143                 self.executor = execution.Executor()
00144                 self.server = None
00145 
00146         def set_command(self, command):
00147                 self.command = command
00148 
00149         def is_alive(self):
00150                 return self.executor.is_alive()
00151 
00152         def get_server(self):
00153                 return self.server
00154 
00155         def client_start(self, xid):
00156                 self.server = 'encode-%d' % xid
00157 
00158                 args = [self.command, '--no-splash', '--parent-id', str(xid),
00159                         '--eval', '(setq server-name "%s")' % self.server,
00160                         '--eval', '(server-start)',
00161                         '--eval', '(setq confirm-kill-emacs nil)']
00162 
00163                 self.executor.start(execution.Job(args))
00164 
00165                 global views
00166                 views.append(self)
00167 
00168         def client_destroy(self):
00169                 global views
00170                 views.remove(self)
00171 
00172                 self.server = None
00173                 self.executor.stop()
00174 
00175         def get_label(self):
00176                 return self.label
00177 
00178 gobject.type_register(View)

Generated on Thu Jan 18 09:47:40 2007 for Encode by  doxygen 1.4.7