This post explores what Leo and pyzo <https://pyzo.org/>have to offer each 
other.

*tl;dr*: It will be much easier to use pyzo features and code in Leo than 
adding Leonine features to pyzo.

*Studying pyzo*

Yesterday I created a personal study repository of pyzo here 
<https://github.com/edreamleo/pyzo>.  This allows me to track (back up) 
localized changes to pyzo.  The git commits are a record of my work.

Not surprisingly, it is far easier to study pyzo code with Leo than with 
pyzo.  Also not surprisingly, it's far easier to understand what pyzo 
offers by actually playing with it.

*Embedding pyzo's features and code into Leo*

Here is a partial list of pyzo features that should(!) be added to Leo.

*Windowing*: pyzo allows any pane to be dragged to a new position.  Each 
pane has a label area which can be dragged anywhere else.  pyzo remembers 
the arrangement of panes on exit, and restores the arrangement when it 
restarts.  This is, I'm pretty sure, a feature of Qt, and it will likely be 
fairly easy to implement.  It's a more intuitive and general solution than 
Leo's toggle-split-direction command, the new pane Easter Egg.  Leo must 
have this.  It's the extensible window management that Leo has needed for a 
long time.  In pyzo, users create new panes using the tools menu.  Again, 
Leo should so something like this.

*Qt Styles*: The pyzo View menu allows users to select a Qt Style.  The 
default style is "cleanlooks", which imo is way better than the native 
styles.  The style is indeed very clean and highlights the location of drag 
areas.  Leo should have this.

*File Browser*: The pyzo file browser is excellent.  It need not always be 
visible (It will be a window option), but at the least it should be part of 
a dialog when opening files.

*IPython and kernels*: Pyzo has an interactive "Shells" window, and the 
"Logger" window also supports IPython features.  Both these windows are 
superior to Leo's buggy python_console plugin.  I intend to move the code 
for both these into Leo.

*Yoton*: Yoton <https://yoton.readthedocs.io/en/latest/>is a separate 
project for interprocess communication, bundled with pyzo, and used by the 
pyzo "Shells" and "Logger" windows.  It should be part of Leo.

*Syntax coloring*: Here is the heart of the pyzo syntax coloring code:

tokens = list(parser.parseLine(line, previousState))
for token in tokens :
    # Handle block state
    if isinstance(token, parsers.BlockState):
        self.setCurrentBlockState(token.state)
    else:
        # Get format
        try:
            styleFormat = nameToFormat(token.name)
            charFormat = styleFormat.textCharFormat
        except KeyError:
            continue
        # Set format
        self.setFormat(token.start,token.end-token.start,charFormat)
        # Is this a cell?
        if (fullLineFormat is None) and styleFormat._parts.get('underline',
'') == 'full':
            fullLineFormat = styleFormat

This is a spectacular simplification on Leo's own colorizing code, but it 
requires a separate "tokenizing" of each line.  There are two possible ways 
to use this code:

1. Add a line tokenizer based on Leo's existing files in leo/modes.
2. Use the code above as a template for pygments <http://pygments.org/>.  
I'll explore this first. It might eliminate all of leo/modes!


*Embedding Leonine features in pyzo*

Pyzo uses lines of the form "## name" to define *chunks*. Chunks continue 
until the next class or method definition.  Chunks are not replacements for 
either @others or << sections >> both of which require an explicit end 
point.  I considered adding lines like ##<, ##>, ##<others and ##others>, 
but such new sentinel lines would, naturally, clutter the external files.

It is tantalizing to think that the pyzo way of breaking files into classes 
and methods could somehow eliminate all forms of @<file> nodes in Leo.  I 
considered that possibility yesterday, for several hours.  But the result 
would not be Leo.  Specifically, the result would lack the following 
crucial capabilities:

- Organizer nodes.  @clean does this, without embedded sentinels.
- gnx's (unique, invariant data).
- uA's (arbitrary data).
- Clones, living in a separate outline, not an external file.

*Summary*

Leonine features could be added to pyzo only at great cost.  Almar Klein is 
unlikely to be interested.

Pyzo's most important features *will* be added to Leo:

- Leo's windows will be more intuitive, more flexible and better looking.
- Pyzo's file browser is the best I've seen.
- Pyzo's "Shells" and "Logger" window would be important additions.
- Pyzo's colorizing code suggests how Leo could support pygments. That 
might eliminate the entire leo/modes directory!
- Yoton is an important tool, worth understanding and using in its own 
right.

This list shows the value of playful exploration.  It's much easier than 
deep study of code :-)

Edward

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/d/optout.

Reply via email to