Pith - xed_shift_line
from gi.repository import GObject, Gdk, Gtk, Xed

_MODS = Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK
_UP = (Gdk.KEY_Up, Gdk.KEY_KP_Up)
_DOWN = (Gdk.KEY_Down, Gdk.KEY_KP_Down)


class MoveLinesViewActivatable(GObject.Object, Xed.ViewActivatable):
    __gtype_name__ = "MoveLinesViewActivatable"

    view = GObject.Property(type=Xed.View)

    def __init__(self):
        GObject.Object.__init__(self)
        self._handler = None
        self._nparams = None

    def do_activate(self):
        # Signal arity
        self._nparams = len(GObject.signal_query(
            "move-lines", self.view.__gtype__).param_types)
        self._handler = self.view.connect("key-press-event", self._on_key)

    def do_deactivate(self):
        if self._handler:
            self.view.disconnect(self._handler)
            self._handler = None

    def _on_key(self, view, event):
        mods = event.state & Gtk.accelerator_get_default_mod_mask()
        if mods != _MODS:
            return False

        if event.keyval in _UP:
            down = False
        elif event.keyval in _DOWN:
            down = True
        else:
            return False

        if not view.get_editable():
            return True

        if self._nparams == 1:
            # GtkSourceView 4
            view.emit("move-lines", down)
        else:
            # GtkSourceView 3
            view.emit("move-lines", False, 1 if down else -1)
        return True