¿Cómo obtener una tecla de acceso rápido de "línea duplicada" en gedit?

¿Cómo obtener una tecla de acceso rápido de "línea duplicada" en gedit?

Quiero tener una tecla de acceso directo para duplicar la línea actualmente seleccionada en gedit. Muchos otros editores usan Ctrl+ Do Ctrl++ para eso, pero gedit es diferente Shift.D

Aquí el comportamiento predeterminado:

  • Ctrl+ D: elimina una línea
  • Ctrl+ Shift+ D: abre el inspector GTK

Estoy bien con ambos comportamientos actuales siempre que la otra tecla de acceso rápido haga lo que realmente quiero hacer.

Entonces viesta respuestadonde se muestra, puedes parchear el binario gedit. Sin embargo, no quiero hacer esto ya que parchear archivos binarios es probablemente el peor tipo de solución que puede hacer (piense en actualizaciones y cambios binarios). Además, en esa pregunta solo se eliminó el acceso directo "eliminar línea" y se agregó el acceso directo "duplicar línea" con un complemento, que ya no existe.

Entonces, ¿cómo puedo obtener el comportamiento "duplicar esta línea" en gedit?

Respuesta1

Elenchufarmencionado en los comentarios y la otra respuesta se actualizó recientemente y después de la instalación debería poder usarCtrl+Mayús+Dpara duplicar una línea o una selección.

Lo probé en gedit 3.18.3 en Ubuntu 16.04 pero debería funcionar en cualquier versión.>=3.14.0aunque eso es un poco cuestionable porque los desarrolladores de gedit no son tímidos a la hora de introducir cambios importantes en versiones menores (o siguen algo más queversionado semántico) y parece que no hay documentación actualizada para el desarrollo de complementos.

Respuesta2

¿Sigues buscando una respuesta? Creo que tengo el correcto, aunque no estoy seguro porque no estoy familiarizado con Python.
1. Debes editar el archivo duplicadoline.py desdecomplemento para gedit3Por aquí:


import gettext
from gi.repository import GObject, Gtk, Gio, Gedit
ACCELERATOR = ['<Alt>d']

#class DuplicateLineWindowActivatable(GObject.Object, Gedit.WindowActivatable):
class DuplicateLineAppActivatable(GObject.Object, Gedit.AppActivatable):
    __gtype_name__ = "DuplicateLineWindowActivatable"

    app = GObject.Property(type=Gedit.App)

    def __init__(self):
        GObject.Object.__init__(self)

    def do_activate(self):
        #self._insert_menu()
        self.app.set_accels_for_action("win.duplicate", ACCELERATOR)
        self.menu_ext = self.extend_menu("tools-section")
        item = Gio.MenuItem.new(_("Duplicate Line"), "win.duplicate")
        self.menu_ext.prepend_menu_item(item)

    def do_deactivate(self):
        #self._remove_menu()
        self.app.set_accels_for_action("win.duplicate", [])
        self.menu_ext = None

        #self._action_group = None

    #def _insert_menu(self):
        #manager = self.window.get_ui_manager()

        # Add our menu action and set ctrl+shift+D to activate.
        #self._action_group = Gtk.ActionGroup("DuplicateLinePluginActions")
        #self._action_group.add_actions([(
            #"DuplicateLine",
            #None,
            #_("Duplicate Line"),
            #"d",
            #_("Duplicate current line, current selection or selected lines"),
            #self.on_duplicate_line_activate
        #)])

        #manager.insert_action_group(self._action_group, -1)

        #self._ui_id = manager.add_ui_from_string(ui_str)

    #def _remove_menu(self):
        #manager = self.window.get_ui_manager()
        #manager.remove_ui(self._ui_id)
        #manager.remove_action_group(self._action_group)
        #manager.ensure_update()

    def do_update_state(self):
        #self._action_group.set_sensitive(self.window.get_active_document() != None)
        pass
class DuplicateLineWindowActivatable(GObject.Object, Gedit.WindowActivatable):
    window = GObject.property(type=Gedit.Window)

    def __init__(self):
        GObject.Object.__init__(self)
        self.settings = Gio.Settings.new("org.gnome.gedit.preferences.editor")

    def do_activate(self):
        action = Gio.SimpleAction(name="duplicate")
        action.connect('activate', self.on_duplicate_line_activate)
        self.window.add_action(action)

    def on_duplicate_line_activate(self, action, user_data=None):
        doc = self.window.get_active_document()
        if not doc:
            return

        if doc.get_has_selection():
            # User has text selected, get bounds.
            s, e = doc.get_selection_bounds()
            l1 = s.get_line()
            l2 = e.get_line()

            if l1 != l2:
                # Multi-lines selected. Grab the text, insert.
                s.set_line_offset(0)
                e.set_line_offset(e.get_chars_in_line())

                text = doc.get_text(s, e, False)
                if text[-1:] != '\n':
                    # Text doesn't have a new line at the end. Add one for the beginning of the next.
                    text = "\n" + text

                doc.insert(e, text)
            else:
                # Same line selected. Grab the text, insert on same line after selection.
                text = doc.get_text(s, e, False)
                doc.move_mark_by_name("selection_bound", s)
                doc.insert(e, text)
        else:
            # No selection made. Grab the current line the cursor is on, insert on new line.
            s = doc.get_iter_at_mark(doc.get_insert())
            e = doc.get_iter_at_mark(doc.get_insert())
            s.set_line_offset(0)

            if not e.ends_line():
                e.forward_to_line_end()

            text = "\n" + doc.get_text(s, e, False)

            doc.insert(e, text)



2. Alt+ Dduplica una línea. Puede cambiar la tecla de acceso rápido: edite la línea 3d "ACELERADOR = ['<Alt>d']" como mejor le parezca.
3. Al menos funciona para gedit v. 3.14.3.

información relacionada