00001
00002
00003
00004
00005
00006
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
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
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
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)