[wingide-users] Re: Implementing Smart-Cut and Smart-Copy macros

Matthew Zaleski matthew.zaleski at spamcop.net
Wed Oct 5 15:38:47 MDT 2011

Wing IDE Support <support <at> wingware.com> writes:

> I took another try at implementing this and think I came up with 
> something that should usually work.  The code is below and replaces the 
> current smart_copy implementation in editor-extensions.py.
> I'm not sure I got the correct behavior for smart-paste with regards to 
> the selection after the line insertion so please let me know if it 
> should do something different.

Sorry for the delay.  GMane does not display old resurrected threads in a      
manner I expected and your direct reply got filtered by my email package.

The smart_copy() and smart_paste() seem to be working exactly as I expected.
I tried a variety of boundary conditions and all behaved the same as my other
editors.  I then tried to create a complimentary smart_cut() and failed
miserably.  I'm not sure if I'm being bitten by the same bug that started this
thread (asynchronous handling of app.ExecuteCommand() calls).  Here is what I 

def smart_cut():
    """Implement a variant of clipboard cut that cuts the whole
    current line if there is no selection on the editor."""
    app = wingapi.gApplication
    editor = app.GetActiveEditor()
    if editor is None:
    selection = editor.GetSelection()
    if selection[1] - selection[0] > 0:
        SMART_COPIED_LINE = None
        doc = editor.GetDocument()
        lineno = doc.GetLineNumberFromPosition(selection[0])
        start = doc.GetLineStart(lineno)
        if lineno + 1 < doc.GetLineCount():
            end = doc.GetLineStart(lineno + 1)
            column = selection[0] - start
            start_next_line = doc.GetLineStart(lineno + 1)
            end_next_line = doc.GetLineEnd(lineno + 1)
            if start_next_line + column > end_next_line:
                new_caret = end_next_line
                new_caret = start_next_line + column   
            end = doc.GetLineEnd(lineno)
            new_selection = (start, start)
        editor.SetSelection(start, end)
        SMART_COPIED_LINE = doc.GetCharRange(start, end)
        if SMART_COPIED_LINE.endswith(editor.GetEol()):
            SMART_COPIED_LINE = SMART_COPIED_LINE[:-len(editor.GetEol())]
        editor.SetSelection(new_caret, new_caret)

More information about the wingide-users mailing list