Version: 4.5.5 (using KDE 3.5.5, Debian Package 4:3.5.5a.dfsg.1-5 (4.0)) Compiler: Target: i486-linux-gnu OS: Linux (i586) release 2.6.18-3-486 Anders, Thanks for your Ctrl+8/+9 hint. :) But now... maybe you shouldn't have tell me about them. ;-) See below.. I tried them out amidst a word and got stuck with no chance to recover the original word without additional Backspace/Delete keystrokes. I'm not yet sure whether or not this is a real issue -- i.e. whether people indeed might move the cursor into the middle of a word and use Ctrl+8/+9 there --, but if so, I'd opt for an additional "nil" completion (=""), so that the original word becomes recovered.
That is a good idea i believe. I will add it "at cursor position" in the flow.
SVN commit 630772 by alund: FEATURE:141253 When using directional completion, reset if the user moves back to the original position in the flow (comlete forward/backward an equal amount of times, and the text is reset) M +22 -2 docwordcompletion.cpp --- trunk/KDE/kdelibs/kate/plugins/wordcompletion/docwordcompletion.cpp #630771:630772 @@ -93,7 +93,6 @@ return QVariant::Invalid; case InheritanceDepth: return 0; - } return QVariant(); @@ -267,6 +266,7 @@ QRegExp re; // hrm KToggleAction *autopopup; // for accessing state uint treshold; // the required length of a word before popping up the completion list automatically + int directionalPos; // be able to insert "" at the correct time }; DocWordCompletionPluginView::DocWordCompletionPluginView( uint treshold, @@ -434,6 +434,8 @@ if ( wrd.isEmpty() ) return; + int inc = fw ? 1 : -1; + /* IF the current line is equal to the previous line AND the position - the length of the last inserted string is equal to the old position @@ -447,6 +449,24 @@ // this is a repeted activation ccol = d->ccol; wrd = d->last; + + // if we are back to where we started, reset. + if ( ( fw && d->directionalPos == -1 ) || + ( !fw && d->directionalPos == 1 ) ) + { + if ( d->lilen ) + m_view->document()->removeText( KTextEditor::Range(d->cline, d->ccol, d->cline, d->ccol + d->lilen) ); + + d->lastIns = ""; + d->lilen = 0; + d->line = d->cline; + d->col = d->ccol; + d->directionalPos = 0; + + return; + } + + d->directionalPos += inc; } else { @@ -457,10 +477,10 @@ d->line = cline; d->col = ccol - wrd.length(); d->lilen = 0; + d->directionalPos = inc; } d->re.setPattern( "\\b" + wrd + "(\\w+)" ); - int inc = fw ? 1 : -1; int pos ( 0 ); QString ln = m_view->document()->line( d->line );
SVN commit 634566 by alund: Backport fixes to directional completion in trunk backport new feature: revert to to original in the correct position in series of directional completions CCBUG: 141253 M +62 -31 docwordcompletion.cpp --- branches/KDE/3.5/kdelibs/kate/plugins/wordcompletion/docwordcompletion.cpp #634565:634566 @@ -131,7 +131,8 @@ QString lastIns; // latest applied completion QRegExp re; // hrm KToggleAction *autopopup; // for accessing state - uint treshold; // the required length of a word before popping up the completion list automatically + uint treshold; // the required length of a word before popping up the completion list automatically + int directionalPos; // be able to insert "" at the correct time }; DocWordCompletionPluginView::DocWordCompletionPluginView( uint treshold, bool autopopup, KTextEditor::View *view, const char *name ) @@ -264,8 +265,11 @@ uint cline, ccol; viewCursorInterface( m_view )->cursorPositionReal( &cline, &ccol ); QString wrd = word(); - if ( wrd.isEmpty() ) return; + if ( wrd.isEmpty() ) + return; + int inc = fw ? 1 : -1; + /* IF the current line is equal to the previous line AND the position - the length of the last inserted string is equal to the old position @@ -277,28 +281,47 @@ wrd.endsWith( d->lastIns ) ) { // this is a repeted activation + + // if we are back to where we started, reset. + if ( ( fw && d->directionalPos == -1 ) || + ( !fw && d->directionalPos == 1 ) ) + { + if ( d->lilen ) + ei->removeText( d->cline, d->ccol, d->cline, d->ccol + d->lilen ); + + d->lastIns.clear(); + d->lilen = 0; + d->line = d->cline; + d->col = d->ccol; + d->directionalPos = 0; + + return; + } + + if ( fw ) + d->col += d->lilen; + ccol = d->ccol; wrd = d->last; + + d->directionalPos += inc; } else { d->cline = cline; d->ccol = ccol; d->last = wrd; - d->lastIns = QString::null; - d->line = d->cline; - d->col = d->ccol - wrd.length(); + d->lastIns.clear(); + d->line = cline; + d->col = ccol - wrd.length(); d->lilen = 0; + d->directionalPos = inc; } d->re.setPattern( "\\b" + wrd + "(\\w+)" ); - int inc = fw ? 1 : -1; int pos ( 0 ); QString ln = ei->textLine( d->line ); - if ( ! fw ) - ln = ln.mid( 0, d->col ); - while ( true ) { pos = fw ? @@ -310,50 +333,58 @@ QString m = d->re.cap( 1 ); if ( m != d->lastIns ) { - d->col = pos; // for next try - - if ( fw ) - d->col += m.length(); - - // if this is a constructed word at cursor pos, retry. - if ( pos + wrd.length() == ccol ) - { - d->col = pos + inc; - continue; - } - // we got good a match! replace text and return. if ( d->lilen ) ei->removeText( d->cline, d->ccol, d->cline, d->ccol + d->lilen ); ei->insertText( d->cline, d->ccol, m ); + d->lastIns = m; d->lilen = m.length(); - d->lastIns = m; + d->col = pos; // for next try return; } // equal to last one, continue else - d->col = pos + inc; // for next try + { + d->col = pos; // for next try + + if ( fw ) + d->col += d->re.matchedLength(); + + else + { + if ( pos == 0 ) + { + if ( d->line > 0 ) + { + d->line += inc; + ln = ei->textLine( d->line ); + d->col = ln.length(); + } + else + { + KNotifyClient::beep(); + return; + } + } + + else + d->col--; + } + } } else // no match { - if ( ! fw && d->line == 0) + if ( (! fw && d->line == 0 ) || ( fw && d->line >= (uint)ei->numLines() ) ) { KNotifyClient::beep(); return; } - else if ( fw && d->line >= ei->numLines() ) - { - KNotifyClient::beep(); - return; - } d->line += inc; - if ( fw ) - d->col++; ln = ei->textLine( d->line ); d->col = fw ? 0 : ln.length();