Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Extendiendo Marave

En­ton­ces la so­lu­ció­n, en la an­ti­gua tra­di­ción de Ema­cs y Vim es... ha­cer­lo ex­ten­si­ble.

Soy un gran fan de los pro­gra­mas ex­ten­si­bles por el usua­rio.

Así que... acá es­tá la ana­to­mía de un plu­gin de Ma­ra­ve tal co­mo fun­cio­na aho­ra mis­mo en SVN trunk, lo que por su­pues­to pue­de cam­biar en cual­quier mo­men­to.

Creando un plugin

Só­lo hay que crear un ar­chi­vo .py en la car­pe­ta plu­gin­s. És­te es el plu­gin más bá­si­co, que no ha­ce na­da:

# -*- coding: utf-8 -*-

from plugins import Plugin
class Smarty(Plugin):
    name='smarty'
    shortcut='Ctrl+.'
    description='Smart quote and dash replacement'
    mode="qBde"

Va­lo­res por de­fault de al­go con­fi­gu­ra­ble (en es­te ca­so "mo­de") se po­nen en la cla­se.

Los cam­pos obli­ga­to­rio­s:

  • sho­r­­tcu­­t: un ata­­jo de te­­cla­­do que dis­­pa­­ra es­­te plu­­gin

  • na­­me: un no­m­­bre co­r­­to

  • des­­cri­p­­tio­­n: una des­­cri­p­­ción de una lí­­nea

¿Qué ha­ce es­to? Agre­ga el plu­gin a la lis­ta en el diá­lo­go de pre­fe­ren­cia­s, y se pue­de abrir el diá­lo­go de con­fi­gu­ra­ción del plu­gi­n, don­de se pue­de cam­biar el shor­tcu­t:

maraveplugin1

Si se ha­bi­li­ta es­te plu­gi­n, cuan­do el usua­rio use ese shor­tcu­t, se lla­ma al mé­to­do "run" del plu­gi­n.

Haciéndolo Configurable

És­te plu­gin so­por­ta dis­tin­tos mo­dos de ope­ra­ció­n. Pa­ra ha­cer que es­to sea ac­ce­si­ble al usua­rio, hay que im­ple­men­tar unos po­cos mé­to­dos ma­s.

El mé­to­do addCon­fi­gWi­dge­ts to­ma co­mo ar­gu­men­to un diá­lo­go, y agre­ga lo que uno quie­ra ahí:

@classmethod
def addConfigWidgets(self, dialog):
    print 'Adding widgets to smarty config'
    l=dialog.ui.layout
    self.q=QtGui.QCheckBox(dialog.tr('Replace normal quotes'))
    if 'q' in self.mode:
        self.q.setChecked(True)
    self.b=QtGui.QCheckBox(dialog.tr('Replace backtick-style quotes (` and ``)'))
    if 'B' in self.mode:
        self.b.setChecked(True)
    self.d=QtGui.QCheckBox(dialog.tr('Replace -- by en-dash, --- by em-dash'))
    if 'd' in self.mode:
        self.d.setChecked(True)
    self.e=QtGui.QCheckBox(dialog.tr('Replace ellipses'))
    if 'e' in self.mode:
        self.e.setChecked(True)
    l.addWidget(self.q)
    l.addWidget(self.b)
    l.addWidget(self.d)
    l.addWidget(self.e)

Y en­ton­ces el diá­lo­go de con­fi­gu­ra­ción se ve así:

maraveplugin2

Tam­bién que­re­mos que esas op­cio­nes se pue­dan guar­dar en al­gún la­do, en­ton­ces reim­ple­men­ta­mos save­Con­fi­g:

@classmethod
def saveConfig(self, dialog):

    self.shortcut=unicode(dialog.ui.shortcut.text())
    self.settings.setValue('plugin-'+self.name+'-shortcut', self.shortcut)

    newmode=""
    if self.q.isChecked():
        newmode+='q'
    if self.b.isChecked():
        newmode+='B'
    if self.d.isChecked():
        newmode+='d'
    if self.e.isChecked():
        newmode+='e'
    self.mode=newmode

    self.settings.setValue('plugin-smarty-mode',self.mode)
    self.settings.sync()

Y que­re­mos que esas op­cio­nes se lean an­tes de crear el plu­gi­n, en­ton­ce­s:

@classmethod
def loadConfig(self):
    print 'SMARTY loadconfig', self.settings
    if self.settings:
        sc=self.settings.value('plugin-'+self.name+'-shortcut')
        if sc.isValid():
            self.shortcut=unicode(sc.toString())
        mode=self.settings.value('plugin-smarty-mode')
        if mode.isValid():
            self.mode=unicode(mode.toString())

Que haga algo!

Y sí, hay que ha­cer que sir­va pa­ra al­go. El plu­gin tie­ne ac­ce­so a un "clien­t" que es la ven­ta­na prin­ci­pal de Ma­ra­ve. To­do es­tá ahí, en al­gu­na par­te ;-)

def run(self):
    print 'running smarty plugin'
    text=unicode(self.client.editor.toPlainText()).splitlines()
    prog=QtGui.QProgressDialog(self.client.tr("Applying smarty"),
                               self.client.tr("Cancel"),
                               0,len(text),
                               self.client)
    prog.show()
    output=[]
    for i,l in enumerate(text):
        output.append(unescape(smartyPants(l,self.mode)))
        prog.setValue(i)
        QtGui.QApplication.instance().processEvents()
    prog.hide()
    self.client.editor.setPlainText('\n'.join(output))

Y ya es­tá, si se ha­bi­li­ta el plu­gin smar­ty, se pue­den "a­rre­gla­r" las co­mi­lla­s, guio­nes y elip­sis con una com­bi­na­ción de te­clas :-)

Có­di­go fuen­te com­ple­to aquí: http://­co­de.­google.­co­m/­p/­ma­ra­ve/­sour­ce/­bro­wse/­trunk/­ma­ra­ve/­plu­gin­s/s­mar­ty.­py

Fal­ta ha­ce­r: otras ma­ne­ras de in­te­grar plu­gins en la in­ter­fa­ce, bo­to­nes, pa­ne­le­s, etc.


Contents © 2000-2023 Roberto Alsina