| Summary: | Ctrl+8/Ctrl+9 completion should offer "nil" completion, also | ||
|---|---|---|---|
| Product: | [Applications] kate | Reporter: | Wolfram R. Sieber <Wolfram.R.Sieber> |
| Component: | kwrite | Assignee: | KWrite Developers <kwrite-bugs-null> |
| Status: | RESOLVED FIXED | ||
| Severity: | wishlist | ||
| Priority: | NOR | ||
| Version First Reported In: | unspecified | ||
| Target Milestone: | --- | ||
| Platform: | unspecified | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
|
Description
Wolfram R. Sieber
2007-02-06 02:20:48 UTC
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();
|