example extension also used for testing see extend txt for more details on creating an extension see configextension def for configuring an extension prepend or remove initial text from selected lines extend the format menu menudefs format z in zin z out zout def initself editwin initialize the settings for this extension self editwin editwin self text editwin text self formatter editwin fregion classmethod def reloadcls load class variables from config cls ztext idleconf getoption extensions zzdummy ztext formatselection def zineventself line return f self ztextline formatselection def zouteventself line zlength 0 if not line startswithself ztext else lenself ztext return linezlength zzdummy reload if name main import unittest unittest main idlelib idletest testzzdummy verbosity2 exitfalse prepend or remove initial text from selected lines extend the format menu insert text at the beginning of each selected line this is bound to the z in virtual event when the extensions are loaded remove specific text from the beginning of each selected line this is bound to the z out virtual event when the extensions are loaded
from idlelib.config import idleConf
from functools import wraps


def format_selection(format_line):
    "Apply a formatting function to all of the selected lines."

    @wraps(format_line)
    def apply(self, event=None):
        head, tail, chars, lines = self.formatter.get_region()
        for pos in range(len(lines) - 1):
            line = lines[pos]
            lines[pos] = format_line(self, line)
        self.formatter.set_region(head, tail, chars, lines)
        return 'break'

    return apply


class ZzDummy:
    

    
    menudefs = [
        ('format', [
            ('Z in', '<<z-in>>'),
            ('Z out', '<<z-out>>'),
        ] )
    ]

    def __init__(self, editwin):
        "Initialize the settings for this extension."
        self.editwin = editwin
        self.text = editwin.text
        self.formatter = editwin.fregion

    @classmethod
    def reload(cls):
        "Load class variables from config."
        cls.ztext = idleConf.GetOption('extensions', 'ZzDummy', 'z-text')

    @format_selection
    def z_in_event(self, line):
        
        return f'{self.ztext}{line}'

    @format_selection
    def z_out_event(self, line):
        
        zlength = 0 if not line.startswith(self.ztext) else len(self.ztext)
        return line[zlength:]


ZzDummy.reload()


if __name__ == "__main__":
    import unittest
    unittest.main('idlelib.idle_test.test_zzdummy', verbosity=2, exit=False)