int main()
select the opening '(' => press '[' ==>
int main[]
select the opening '[' => press '(' ==>
int main())
==> so we get 2 ')'
I think this is a conflict with SmartIndent :'( (Disable smart indent and try again).
So I can
1/ Merge into smart indent.
2/ Change smart indent logic slightly (don't do smart indent's bracing if there is a selection) but keep the feature separate.
3/ Move the smart indent brace completion out of smart indent
4/ Do nothing / revert.
Obviously 4 isn't my preferred. The unappealing thing about 1 is having to do that logic 5+ times over for all of the SmartIndent languages. Not sure where these features really belong. It's not clear to me that a plugin named "Smart Indent" should include brace completions at all, but that's not a huge deal.
I was planning to add additional features:
* autoconversions for <, > (for html/xml), ' and "
* if user has a selection, typing a brace char (or quote char) puts the brace around the selection instead of deleting the selection.
What are the circumstances in which one would want to do this? I don't think I have ever wanted to convert () to [].
Quote from: Neil Butterworth on October 20, 2012, 02:09:36 PM
What are the circumstances in which one would want to do this? I don't think I have ever wanted to convert () to [].
Converting the braces is mostly useful for python (in C/C++, probably much less commonly needed). Removing the matching brace is probably generally useful as would be enclosing a selection in braces instead of just deleting it. But fair point, I could just make the changes to the smart indent python code.
Quote from: dmoore on October 20, 2012, 02:06:38 PM
* if user has a selection, typing a brace char (or quote char) puts the brace around the selection instead of deleting the selection.
This feature already exists. Do you have
Selection brace completion enabled? (Although, the recent SmartIndent refactor has restricted it to C/C++ only; I am exploring how to make it general purpose again.)
@alpha: I do have that option enabled. I was working in python when I decided to make the changes so that's probably why I missed it. We should coordinate on these changes and decide where they should go.
Which reminds me, the value of the brace conversion is it means less typing when porting code from another language. In my case it was Matlab to Python, but it could be useful in lots of other cases.
Quote from: dmoore on October 20, 2012, 04:22:18 PM
...decide where they should go.
Base class functions?
Ok, I'm trying to reimplement this in the smart indent plugin. For now, just in the Cpp handler, which I will eventually move parts of to the base class. That patch is below and attached.
I am having a couple problems:
1. To do it in SmartIndent I need to handle wxEVT_SCI_KEY. But for some reason the plugin doesn't seem to receive it, despite receiving wsEVT_SCI_CHARADDED? I'm probably just doing something dumb, but any pointers appreciated
2. Many of the methods have been defined const. I would prefer to change them not to be const so I can add a member that holds the bracematch position (I could imagine all of the methods might need to be non-const for some languages). I have worked around this with a global variable for now. Is there a strong reason to make these functions const other than trying to be strict?
Index: src/plugins/contrib/SmartIndent/CppSmartIndent.cpp
===================================================================
--- src/plugins/contrib/SmartIndent/CppSmartIndent.cpp (revision 8464)
+++ src/plugins/contrib/SmartIndent/CppSmartIndent.cpp (working copy)
@@ -19,8 +19,11 @@
namespace
{
PluginRegistrant<CppSmartIndent> reg(_T("CppSmartIndent"));
-}
-void CppSmartIndent::OnEditorHook(cbEditor* ed, wxScintillaEvent& event) const
+}
+
+static int m_bracePos=-1;
+
+void CppSmartIndent::OnEditorHook(cbEditor* ed, wxScintillaEvent& event)const
{
// check if smart indent is enabled
@@ -32,18 +35,33 @@
if ( !SmartIndentEnabled() )
return;
-
- wxEventType type = event.GetEventType();
- if ( type != wxEVT_SCI_CHARADDED )
- return;
-
+
cbStyledTextCtrl* stc = ed->GetControl();
if (!stc)
return;
wxString langname = Manager::Get()->GetEditorManager()->GetColourSet()->GetLanguageName(ed->GetLanguage());
if ( langname != _T("C/C++") && langname != _T("D") && langname != _T("Java") ) return;
+
+ wxEventType type = event.GetEventType();
+ if ( type == wxEVT_SCI_KEY )
+ {
+ int p = stc->GetCurrentPos();
+ int a = stc->GetAnchor();
+ int m=p;
+ if(a>=0 && a<p)
+ m=a;
+ m_bracePos = stc->BraceMatch(m);
+ Manager::Get()->GetLogManager()->Log(wxString::Format(_T("Key Event Brace pos %i"),m_bracePos));
+ event.Skip(true);
+ return;
+ }
+ if ( type != wxEVT_SCI_CHARADDED )
+ return;
+
+
+
ed->AutoIndentDone(); // we are responsible.
const int pos = stc->GetCurrentPos();
@@ -440,13 +458,56 @@
}
return false;
}
+
void CppSmartIndent::DoSelectionBraceCompletion(cbStyledTextCtrl* control, const wxChar &ch)const
{
if (!control->GetLastSelectedText().IsEmpty())
{
-
const int pos = control->GetCurrentPos();
- wxString selectedText = control->GetLastSelectedText();
+ wxString selectedText = control->GetLastSelectedText();
+ Manager::Get()->GetLogManager()->Log(_T("Last Selected Text ")+selectedText);
+ if(selectedText == _T("(") ||
+ selectedText == _T(")") ||
+ selectedText == _T("[") ||
+ selectedText == _T("]") ||
+ selectedText == _T("{") ||
+ selectedText == _T("}")
+ )
+ {
+ int p = pos;
+ wxString opch;
+ switch (ch)
+ {
+ case _T('('):
+ opch = _T(")");
+ break;
+ case _T(')'):
+ opch = _T("(");
+ break;
+ case _T('['):
+ opch = _T("]");
+ break;
+ case _T(']'):
+ opch = _T("[");
+ break;
+ case _T('{'):
+ opch = _T("}");
+ break;
+ case _T('}'):
+ opch = _T("{");
+ break;
+ }
+ //int m = control->BraceMatch(p-1);
+ Manager::Get()->GetLogManager()->Log(wxString::Format(_T("Brace pos %i"),m_bracePos));
+ if (m_bracePos == wxSCI_INVALID_POSITION)
+ return;
+ control->BeginUndoAction();
+ control->InsertText(m_bracePos, opch);
+ control->DeleteRange(m_bracePos+1, 1);
+ control->SetCurrentPos(p);
+ control->EndUndoAction();
+ return;
+ }
switch (ch)
{
case _T('\''):
@@ -547,6 +608,7 @@
}
} // SelectionBraceCompletion
}
+
void CppSmartIndent::DoBraceCompletion(cbStyledTextCtrl* control, const wxChar& ch)const
{
int pos = control->GetCurrentPos();
[attachment deleted by admin]
doh, RTFM. wxEVT_SCI_KEY only triggers for keystrokes that aren't processed by scintilla. So I have to do this the same way I did it in EditorTweaks and handle wxEVT_CHAR or wxEVT_KEY_DOWN in order to get matching brace positions before the brace is replaced. I think I can make this work, but I'm even less sure it belongs in SmartIndent.
I did what I probably should have just done to start with and fixed the implementation in EditorTweaks so that it doesn't conflict with SmartIndent. This version actually has better undo behavior because a single undo will revert both brace changes. Unless someone feels strongly that this feature shouldn't be in editor tweaks, it can stay there for now.
@Alpha: would still like to have the brace selection behavior for other languages beside C/C++. As obfuscated suggests, just move that method to the base class and have more (all?) of the smart indent implementations call it would be one way to do it.
Quote from: dmoore on October 21, 2012, 07:55:00 PM
@Alpha: would still like to have the brace selection behavior for other languages beside C/C++. As obfuscated suggests, just move that method to the base class and have more (all?) of the smart indent implementations call it would be one way to do it.
Something like that; what I am planning is to have more generic base function that is called as a fall-back, and smart indent plugins would then (have the option to) specialize the behavior (for example, when used on a double quote (
"), it currently utilizes C/C++ escapes, which may not be applicable to all languages).
If you want to work on this, go ahead. Otherwise, I should have a patch available in a few days.
Quote from: Alpha on October 23, 2012, 11:16:58 PM
If you want to work on this, go ahead. Otherwise, I should have a patch available in a few days.
Quite content for you to work on this :) Happy to test of course.
Here is a candidate patch.
Index: src/plugins/contrib/SmartIndent/PythonSmartIndent.cpp
===================================================================
--- src/plugins/contrib/SmartIndent/PythonSmartIndent.cpp (revision 8478)
+++ src/plugins/contrib/SmartIndent/PythonSmartIndent.cpp (working copy)
@@ -69,4 +69,7 @@
stc->EndUndoAction();
}
}
+
+ if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() )
+ ed->DoSelectionBraceCompletion(stc, ch);
}
Index: src/plugins/contrib/SmartIndent/LuaSmartIndent.cpp
===================================================================
--- src/plugins/contrib/SmartIndent/LuaSmartIndent.cpp (revision 8478)
+++ src/plugins/contrib/SmartIndent/LuaSmartIndent.cpp (working copy)
@@ -67,6 +67,9 @@
stc->EndUndoAction();
}
}
+
+ if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() )
+ ed->DoSelectionBraceCompletion(stc, ch);
}
bool LuaSmartIndent::BraceIndent(cbStyledTextCtrl *stc, wxString &indent)const
Index: src/plugins/contrib/SmartIndent/XMLSmartIndent.cpp
===================================================================
--- src/plugins/contrib/SmartIndent/XMLSmartIndent.cpp (revision 8478)
+++ src/plugins/contrib/SmartIndent/XMLSmartIndent.cpp (working copy)
@@ -47,16 +47,28 @@
ed->AutoIndentDone(); // we are responsible
- const int pos = stc->GetCurrentPos();
+ int pos = stc->GetCurrentPos();
int currLine = stc->LineFromPosition(pos);
const wxChar ch = event.GetKey();
wxRegEx reTag(wxT("***:<[ \t]*?(|/)[ \t]*?([a-zA-Z][a-zA-Z0-9_-]*).*?(|/)[ \t]*?>"));
+ bool complQuote = true;
+ if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() )
+ {
+ ed->DoSelectionBraceCompletion(stc, ch);
+ if (pos != stc->GetCurrentPos())
+ {
+ complQuote = false;
+ pos = stc->GetCurrentPos();
+ currLine = stc->LineFromPosition(pos);
+ }
+ }
+
if (BraceCompletionEnabled())
{
// finish tag
- if (ch == wxT('>'))
+ if ( ch == wxT('>') && !stc->IsString(stc->GetStyleAt(pos)) )
{
wxString tag;
for (int i = pos - 2; i > 0; --i)
@@ -72,7 +84,7 @@
stc->InsertText(pos, wxT("</") + reTag.GetMatch(tag, 2) + wxT(">"));
}
// close string
- else if (ch == wxT('"') || ch == wxT('\''))
+ else if (complQuote && (ch == wxT('"') || ch == wxT('\'')))
{
if (stc->GetCharAt(pos) == ch)
{
@@ -113,14 +125,14 @@
}
}
// indent
- if ( (ch == wxT('\n')) || ( (stc->GetEOLMode() == wxSCI_EOL_CR) && (ch == wxT('\r')) ) )
+ if ( AutoIndentEnabled()
+ && ( (ch == wxT('\n')) || ((stc->GetEOLMode() == wxSCI_EOL_CR) && (ch == wxT('\r'))) ) )
{
- if (AutoIndentEnabled())
+ wxString indent = ed->GetLineIndentString(currLine - 1);
+ stc->BeginUndoAction();
+ if (SmartIndentEnabled()) // smart indent
{
- wxString indent = ed->GetLineIndentString(currLine - 1);
int idx = stc->GetLine(currLine - 1).Find(wxT('>'), true);
-
- stc->BeginUndoAction();
if (idx != wxNOT_FOUND)
{
wxString tag;
@@ -167,10 +179,10 @@
}
}
}
- stc->InsertText(pos, indent);
- stc->GotoPos(pos + indent.Length());
- stc->ChooseCaretX();
- stc->EndUndoAction();
}
+ stc->InsertText(pos, indent);
+ stc->GotoPos(pos + indent.Length());
+ stc->ChooseCaretX();
+ stc->EndUndoAction();
}
}
Index: src/plugins/contrib/SmartIndent/PascalSmartIndent.cpp
===================================================================
--- src/plugins/contrib/SmartIndent/PascalSmartIndent.cpp (revision 8478)
+++ src/plugins/contrib/SmartIndent/PascalSmartIndent.cpp (working copy)
@@ -44,6 +44,9 @@
DoIndent(ed, langname); // indent because \n added
else if ( ch != wxT(' ') )
DoUnIndent(ed, langname); // un-indent because not a newline added
+
+ if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() )
+ ed->DoSelectionBraceCompletion(stc, ch);
}
void PascalSmartIndent::DoIndent(cbEditor* ed, const wxString& WXUNUSED(langname)) const
Index: src/plugins/contrib/SmartIndent/HDLSmartIndent.cpp
===================================================================
--- src/plugins/contrib/SmartIndent/HDLSmartIndent.cpp (revision 8478)
+++ src/plugins/contrib/SmartIndent/HDLSmartIndent.cpp (working copy)
@@ -49,6 +49,9 @@
DoIndent(ed, langname); // indent because \n added
else if ( ch != wxT(' ') )
DoUnIndent(ed, langname); // un-indent because not a newline added
+
+ if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() )
+ ed->DoSelectionBraceCompletion(stc, ch);
}
int HDLSmartIndent::FindBlockStartVHDL(cbEditor* ed, int position, wxString block) const
Index: src/plugins/contrib/SmartIndent/FortranSmartIndent.cpp
===================================================================
--- src/plugins/contrib/SmartIndent/FortranSmartIndent.cpp (revision 8478)
+++ src/plugins/contrib/SmartIndent/FortranSmartIndent.cpp (working copy)
@@ -103,4 +103,7 @@
stc->EndUndoAction();
}
+
+ if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() )
+ ed->DoSelectionBraceCompletion(stc, ch);
}
Index: src/include/cbeditor.h
===================================================================
--- src/include/cbeditor.h (revision 8478)
+++ src/include/cbeditor.h (working copy)
@@ -301,6 +301,7 @@
static void ApplyStyles(cbStyledTextCtrl* control);
void AutoIndentDone();
+ void DoSelectionBraceCompletion(cbStyledTextCtrl* control, const wxChar& ch) const;
private:
cbEditor(const cbEditor& /*rhs*/); // prevent copy construction
Index: src/sdk/cbeditor.cpp
===================================================================
--- src/sdk/cbeditor.cpp (revision 8478)
+++ src/sdk/cbeditor.cpp (working copy)
@@ -3095,12 +3095,33 @@
control->EndUndoAction();
}
}
+ if( Manager::Get()->GetConfigManager(_T("editor"))->ReadBool(_T("/brace_completion"), true)
+ || control->IsBraceShortcutActive())
+ DoSelectionBraceCompletion(control, ch);
}
}
void cbEditor::AutoIndentDone()
{
m_autoIndentDone = true;
}
+void cbEditor::DoSelectionBraceCompletion(cbStyledTextCtrl* control, const wxChar& ch) const
+{
+ if (control->GetLastSelectedText().IsEmpty())
+ return;
+ const wxString braces(wxT("([{<'\")]}>'\""));
+ const int braceAIdx = braces.Find(ch, true); // from end (so caret ends after quotes)
+ if (braceAIdx == wxNOT_FOUND)
+ return;
+ const int braceBIdx = (braceAIdx + (braces.Length() / 2)) % braces.Length();
+ control->BeginUndoAction();
+ control->DeleteBack();
+ if (braceAIdx < braceBIdx)
+ control->InsertText(control->GetCurrentPos(),
+ braces[braceAIdx] + control->GetLastSelectedText() + braces[braceBIdx]);
+ else
+ control->AddText(braces[braceBIdx] + control->GetLastSelectedText() + braces[braceAIdx]);
+ control->EndUndoAction();
+}
void cbEditor::OnEditorDwellStart(wxScintillaEvent& event)
{
Quote from: Alpha on October 26, 2012, 11:02:21 PM
Here is a candidate patch.
dmoore: Do you take action?
Quote from: MortenMacFly on October 27, 2012, 05:46:38 PM
Quote from: Alpha on October 26, 2012, 11:02:21 PM
Here is a candidate patch.
dmoore: Do you take action?
I haven't but I can. Might take a few days so if you get to it sooner be my guest. Anyone else tested it?
Quote from: dmoore on October 27, 2012, 10:19:10 PM
Anyone else tested it?
I've applied it in my local copy but didn't test.
Quote from: Alpha on October 26, 2012, 11:02:21 PM
Here is a candidate patch.
Having troubles applying this on linux. There are different line endings in at least one of the target files (I thought we had done something to fix this in our SVN). Do you mind attaching a patch file Alpha?
Also, is there a good reason to put the brace completion stuff in cbEditor instead of the plugin base? I thought the point of making smart indent a set of plugins was to reduce the amount of cruft in the editor code.
Attached.
Quote from: dmoore on October 29, 2012, 12:50:22 AM
I thought we had done something to fix this in our SVN.
Most files are set to match system EOL style, however, it appears as if the files added by Smart Indent are
CR LF only.
Quote from: dmoore on October 29, 2012, 01:13:38 AM
Also, is there a good reason to put the brace completion stuff in cbEditor instead of the plugin base?
I put it there so the editor has access to use it as fall-back if no plugin supports the current lexer. The Smart Indent plugins for languages that I am less familiar with just call this more-generic method, whereas the C++ plugin has its own specialized implementation (that I previously wrote - although, it occasionally has some issues, so I may have to look back at it again).
I did this under the same idea that cbEditor contains a minimal auto-indent (just copy the previous line's indentation). Not sure if this was correct thinking...
Quote from: Alpha on October 29, 2012, 01:28:06 AM
I put it there so the editor has access to use it as fall-back if no plugin supports the current lexer.
That makes some sense.
Thx for the patch.
Quote from: Alpha on October 29, 2012, 01:28:06 AM
Attached.
Did that patch change anything in comparison to the previous one? After applying this I see no differences to what I already had with the previous patch...?! ???
Quote from: MortenMacFly on October 29, 2012, 10:13:53 AM
Quote from: Alpha on October 29, 2012, 01:28:06 AM
Attached.
Did that patch change anything in comparison to the previous one? After applying this I see no differences to what I already had with the previous patch...?! ???
I think it is the same, I just wanted it this way to hopefully make it easier to apply.
This seems to work as I would expect on different types of files. I don't love the undo behavior, but I guess it makes sense that undo gives you what you would expect if selection brace matching was turned off.
Small style thing: I thought we added at least one line of empty whitespace between class method implementations. (I notice that whitespace is virtually non-existent in most of the smartindent cpp files.)
@morten: can you check/change the newline svn properties of those files? (And any other recently added files)
Also @Morten, if this is ok with you one of us should apply. (I haven't tested on windows, but nothing seems OS specific in this one)
Quote from: dmoore on October 29, 2012, 03:14:45 PM
Also @Morten, if this is ok with you one of us should apply. (I haven't tested on windows, but nothing seems OS specific in this one)
Feel free to do so - I've tested it under Windows meanwhile. It looks OK.
Concerning the SVN props: I'll have a look...
Quote from: MortenMacFly on October 29, 2012, 10:13:53 AM
Did that patch change anything in comparison to the previous one? After applying this I see no differences to what I already had with the previous patch...?! ???
The line endings are different... oh,
LF and
CR LF look exactly the same in your browser? ;)
@Alpha: For python, I noticed that smart indent does not provide brace completions for non-selected text. If we are doing it for C/C++, why not python (and other languages) too? I guess this would be a separate patch, and, if so, I am happy to commit the last one.
Brace completion and selection brace completion are (in my opinion) completely separate features, so yes, different patch.
Fall-back for brace completion would have to be very conservative, because languages differ so greatly. Compare editing C/C++ with editing XML/HTML (the only places brace completion is currently implemented); they act quite different.
If I am able, I will see what I can come up with in the next few days.
Quote from: dmoore on October 29, 2012, 10:27:11 PM
If we are doing it for C/C++, why not python (and other languages) too?
I guess simply no one got there yet.
That's what I thought. Will commit your patch soon.
Committed in rev 8489. Apologies for spacing and forgetting to give you credit in the log message, Alpha. :-[ Hopefully we give you commit access soon!
Quote from: dmoore on October 30, 2012, 12:12:40 AM
Apologies for spacing and forgetting to give you credit in the log message, Alpha.
No worries.
Quote from: Alpha on October 29, 2012, 11:28:05 PM
Fall-back for brace completion would have to be very conservative, because languages differ so greatly.
Here is a fall-back (plus a small fix for the previous patch - it had read from the wrong environment variable). The language specific implementations will take some more time (and probably will require help from people who use those languages more frequently).
Index: src/sdk/cbeditor.cpp
===================================================================
--- src/sdk/cbeditor.cpp (revision 8496)
+++ src/sdk/cbeditor.cpp (working copy)
@@ -3076,9 +3076,9 @@
{
const wxChar ch = event.GetKey();
cbStyledTextCtrl* control = GetControl();
+ const int pos = control->GetCurrentPos();
if ( (ch == _T('\n')) || ( (control->GetEOLMode() == wxSCI_EOL_CR) && (ch == _T('\r')) ) )
{
- const int pos = control->GetCurrentPos();
const int currLine = control->LineFromPosition(pos);
const bool autoIndent = Manager::Get()->GetConfigManager(_T("editor"))->ReadBool(_T("/auto_indent"), true);
if (autoIndent && currLine > 0)
@@ -3093,9 +3093,27 @@
control->EndUndoAction();
}
}
- if( Manager::Get()->GetConfigManager(_T("editor"))->ReadBool(_T("/brace_completion"), true)
+ if( Manager::Get()->GetConfigManager(wxT("editor"))->ReadBool(wxT("/selection_brace_completion"), false)
|| control->IsBraceShortcutActive())
DoSelectionBraceCompletion(control, ch);
+ // brace completion
+ const wxString braces(wxT("([{)]}"));
+ const int braceIdx = braces.Find(ch);
+ if ( braceIdx != wxNOT_FOUND && pos == control->GetCurrentPos() // pos != curPos if selection brace completion succeeded
+ && Manager::Get()->GetConfigManager(wxT("editor"))->ReadBool(wxT("/brace_completion"), true))
+ {
+ if (control->GetCharAt(pos) == ch)
+ {
+ control->DeleteBack();
+ control->CharRight();
+ }
+ else if (braceIdx < (braces.Length() / 2))
+ {
+ const int closeIdx = braceIdx + (braces.Length() / 2);
+ if (control->GetCharAt(pos) != braces[closeIdx] || control->BraceMatch(pos) != wxNOT_FOUND)
+ control->InsertText(pos, braces[closeIdx]);
+ }
+ }
}
}
I did not make this a separate function because most languages will have very different requirements, so it would therefore remain relatively unused; do you agree?
Quote from: Alpha on October 31, 2012, 11:19:54 PM
I did not make this a separate function because most languages will have very different requirements, so it would therefore remain relatively unused; do you agree?
Busy ATM but will take a look in the next few days. In terms of different languages, I would think it's rare to find a language that doesn't expect brace chars to be closed. So that seems like something that should always happen when this feature is turned on, which it appears is what your patch does. I would say same with quote chars, but scintilla doesn't offer a nice bracematch function for quotes so would require more work.
I guess the tricky thing is that you probably don't want auto brace completion inside a string or comment, and different lexers have different style codes for their strings, but this would be hard to do right. (Doesn't look like your patch deals with this?)
Quote from: dmoore on November 01, 2012, 05:28:44 PM
I guess the tricky thing is that you probably don't want auto brace completion inside a string or comment, and different lexers have different style codes for their strings, but this would be hard to do right. (Doesn't look like your patch deals with this?)
cbStyledTextCtrl::IsComment() and
cbStyledTextCtrl::IsString() should help
Thanks.
Attached is another patch.
It handles quotes (with guess work that is often, but not always, close enough) and attempts to act more intelligently during brace completion. I have also now separated it into a function, and called the function from the SmartIndent plugins that have not yet implemented their own brace completion.
I still want to write some specialized functions; the fall-back function attempts to be generalized, so it misses many language specifics (for example triple quoted python strings).
Here is python triple quote completion (it requires the patch from my last post be applied to everything but PythonSmartIndent.cpp).
Index: src/plugins/contrib/SmartIndent/PythonSmartIndent.cpp
===================================================================
--- src/plugins/contrib/SmartIndent/PythonSmartIndent.cpp (revision 8500)
+++ src/plugins/contrib/SmartIndent/PythonSmartIndent.cpp (working copy)
@@ -71,6 +71,18 @@
}
}
+ bool braceCompleted = false;
if ( SelectionBraceCompletionEnabled() || stc->IsBraceShortcutActive() )
- ed->DoSelectionBraceCompletion(stc, ch);
+ braceCompleted = ed->DoSelectionBraceCompletion(stc, ch);
+ if (!braceCompleted && BraceCompletionEnabled())
+ {
+ ed->DoBraceCompletion(stc, ch);
+ if ( !(stc->IsComment(stc->GetStyleAt(pos)) || stc->IsComment(stc->GetStyleAt(pos - 2)))
+ && (ch == wxT('"') || ch == wxT('\'')) )
+ {
+ const wxString tripleQuote(3, ch);
+ if (stc->GetTextRange(pos - 3, pos) == tripleQuote && !stc->IsString(stc->GetStyleAt(pos - 4)))
+ stc->InsertText(pos, tripleQuote);
+ }
+ }
}
I also wanted to add term -> end term "brace" completion (similar to how C++ matches PP directives, and XML matches tags), but I realized that I do not use/understand those languages enough to be able to create something that functions as expected.
I tried your last patch last night and it seemed to be working well on python files. So should I take this new patch, test a little more then commit over the weekend?
One thing I wondered about was whether you it is better add the sdk functions to cbEditor (as you do now) or to cbStyledTextCtrl. The advantage of the latter is that you don't need to pass around the redundant cbStyleTextCtrl pointer as the first arg.
Assuming it passes your testing, I believe the patch is ready for commit.
Attached I have refactored to cbStyledTextCtrl (plus a slight improvement to brace completion).
Tested and works well enough for me.
Unless someone has objections to putting the Do*BraceCompletion methods in cbStyleTextCtrl or finds some other major problem, I will commit within the next 24 hours. (The alternative would be to put the methods in cbEditor but I think this is stuff that doesn't need to be exposed in the SDK to anything other than smart indent plugins, so hiding them away makes some sense.)
aaargh! The commit would be a big mess of line ending changes on Linux because I had to dos2unix before applying the patch. (Some of the line ending changes might be unavoidable due to the changes to xml lexer files)
@Morten: please do the propset magic if you have time. (I would do it myself, but only have linux access ATM which will commit a huge batch of unwanted line ending changes if I do the propset)
EDIT: In case I wasn't clear, I am going to hold off on the commit until I resolve the line endings.
Never mind. I figured this out and made the eol propset changes.
Quote from: dmoore on November 03, 2012, 07:21:31 PM
Tested and works well enough for me.
It doesn't compile under wx2.9.x. this line:
if (GetCharAt(nextPos) != braces[closeIdx] || BraceMatch(nextPos) != wxNOT_FOUND)...raises:
cbstyledtextctrl.cpp:356:54: error: ambiguous overload for 'operator!=' in '((cbStyledTextCtrl*)this)->cbStyledTextCtrl::<anonymous>.wxScintilla::GetCharAt(nextPos) != braces.wxString::operator[](((int)closeIdx))'
This should be fixed before committing...
I do not currently have wx2.9 available for testing; does a cast fix this?
if ((wxChar)GetCharAt(nextPos) != braces[closeIdx] || BraceMatch(nextPos) != wxNOT_FOUND)
Quote from: Alpha on November 05, 2012, 01:32:44 AM
if ((wxChar)GetCharAt(nextPos) != braces[closeIdx] || BraceMatch(nextPos) != wxNOT_FOUND)
Yes. Not nice and I don't know if it would work for all Unicode characters... but yes. :-)
Quote from: Alpha on November 03, 2012, 01:51:27 AM
Attached I have re-factored to cbStyledTextCtrl (plus a slight improvement to brace completion).
Oh dear... I'm afraid I just screwed the compatibility with the patch after the last commits of mine (renaming of SmartIndent). Maybe you can provide an updated version? Sorry - I didn't have that in mind.
Ok, I'm leaving this one to you guys. (Let me know if you want me to look at anything specific.)
Quote from: dmoore on November 05, 2012, 05:38:10 PM
Ok, I'm leaving this one to you guys.
I am not really looking into it. Please continue testing, if possible. I was just the one breaking it. :P
Quote from: MortenMacFly on November 05, 2012, 01:36:18 PM
Oh dear... I'm afraid I just screwed the compatibility with the patch after the last commits of mine (renaming of SmartIndent). Maybe you can provide an updated version? Sorry - I didn't have that in mind.
Not a problem; update attached.
OK. If Morten doesn't break anything in between, ;D I will test and commit tonight.
Quote from: dmoore on November 06, 2012, 01:20:07 PM
OK. If Morten doesn't break anything in between, ;D I will test and commit tonight.
I'll keep my fingers away - I promise...
Committed rev 8514. FYI - I had to clean out my build settings before this one worked properly, but this was probably due to the other SmartIndent changes that Morten made.
In rev 8515 I fixed a bug that prevented Convert Matching Braces from being saved. I also tidied up the naming of the config settings for EditorTweaks. Unfortunately, this will means users will need to redo any previously set aligner settings (sorry!)
Quote from: dmoore on November 07, 2012, 03:53:05 AM
Committed rev 8514.
Uh-oh... looks like I killed three of the lexers:
Index: src/sdk/resources/lexers/lexer_batch.xml
===================================================================
--- src/sdk/resources/lexers/lexer_batch.xml (revision 8529)
+++ src/sdk/resources/lexers/lexer_batch.xml (working copy)
@@ -78,7 +78,6 @@
BoxCommentMid=""
BoxCommentEnd=""
CaseSensitive="0"
- CaseSensitive="1"
LexerCommentStyles="1"
LexerCharacterStyles=""
LexerStringStyles=""
Index: src/sdk/resources/lexers/lexer_css.xml
===================================================================
--- src/sdk/resources/lexers/lexer_css.xml (revision 8529)
+++ src/sdk/resources/lexers/lexer_css.xml (working copy)
@@ -110,7 +110,6 @@
BoxCommentMid=" * "
BoxCommentEnd=" */"
CaseSensitive="0"
- CaseSensitive="1"
LexerCommentStyles="9"
LexerCharacterStyles=""
LexerStringStyles="13,14"
Index: src/sdk/resources/lexers/lexer_cmake.xml
===================================================================
--- src/sdk/resources/lexers/lexer_cmake.xml (revision 8529)
+++ src/sdk/resources/lexers/lexer_cmake.xml (working copy)
@@ -542,10 +542,7 @@
CaseSensitive="0"
LexerCommentStyles="1"
LexerStringStyles="2,3,4"
- CaseSensitive="1"
- LexerCommentStyles="1"
LexerCharacterStyles=""
- LexerStringStyles="2,3,4"
LexerPreprocessorStyles=""/>
</Lexer>
</CodeBlocks_lexer_properties>
Is it just these 3?
From what I can tell, yes. In the application log for revisions 8514 - 8529, the "Loading lexer_*" failed on these three.
(It seems I had not been careful enough in modifying all the lexers so quickly to ensure valid XML files :-\.)
Looks like Morten got all these (http://svn.berlios.de/wsvn/codeblocks?manualorder=1&op=comp&compare%5B0%5D=%2Ftrunk%2F&compare_rev%5B0%5D=8529&compare%5B1%5D=%2Ftrunk%2F&compare_rev%5B1%5D=8530&comparesubmit=Compare+Paths)?
Yes. (Sorry, forgot to respond.)