Index: src/sdk/cbeditor.cpp
===================================================================
--- src/sdk/cbeditor.cpp (revision 6196)
+++ src/sdk/cbeditor.cpp (working copy)
@@ -414,6 +414,21 @@
control->GotoPos(pos);
if (ch == _T('{'))
{
+ int curLine = control->GetCurrentLine();
+ int keyLine = curLine;
+ wxString text;
+ do
+ {
+ int keyPos = control->GetLineIndentPosition(keyLine);
+ int start = control->WordStartPosition(keyPos, true);
+ int end = control->WordEndPosition(keyPos, true);
+ text = control->GetTextRange(start, end);
+ }
+ while (text.IsEmpty() && --keyLine);
+
+ if (text == _T("class") || text == _T("struct"))
+ control->InsertText(control->GetLineEndPosition(curLine), _T(";"));
+
const wxRegEx reg(_T("^[ \t]*{}[ \t]*"));
if (reg.Matches(control->GetCurLine()))
{
Example, this code:
class A {|}
class B
{
|
}
struct A {|}
struct B
{
|
}
After apply this patch, it's auto changed to:
class A {|};
class B
{
|
};
struct A {|};
struct B
{
|
};
A semicolon add here: };
[attachment deleted by admin]
What will happen if I type:
{|}
or
{
|
}
Sorry, I do not know what you mean.
If not class or struct, then it do nothing.
Update: support 'enum' keyword
Update2: support 'union' keyword :P
Index: src/sdk/cbeditor.cpp
===================================================================
--- src/sdk/cbeditor.cpp (revision 6196)
+++ src/sdk/cbeditor.cpp (working copy)
@@ -414,6 +414,21 @@
control->GotoPos(pos);
if (ch == _T('{'))
{
+ int curLine = control->GetCurrentLine();
+ int keyLine = curLine;
+ wxString text;
+ do
+ {
+ int keyPos = control->GetLineIndentPosition(keyLine);
+ int start = control->WordStartPosition(keyPos, true);
+ int end = control->WordEndPosition(keyPos, true);
+ text = control->GetTextRange(start, end);
+ }
+ while (text.IsEmpty() && --keyLine);
+
+ if (text == _T("class") || text == _T("struct") || text == _T("enum") || text == _T("union"))
+ control->InsertText(control->GetLineEndPosition(curLine), _T(";"));
+
const wxRegEx reg(_T("^[ \t]*{}[ \t]*"));
if (reg.Matches(control->GetCurLine()))
{
A small suggestion for your patch: you should also support the "union" keyword.
Wow, that was fast! You guys are great! :)
What happens in my whole file looks like:
{ | }
???
You don't check for the first line / character in the editor being reached, or am I wrong?!
If so, your code my result in an infinite loop, maybe even in a crash.
Quote from: MortenMacFly on March 24, 2010, 04:13:09 PM
What happens in my whole file looks like:
{ | }
???
You don't check for the first line / character in the editor being reached, or am I wrong?!
If so, your code my result in an infinite loop, maybe even in a crash.
@morten:
Loaden use this for condition below:
while (text.IsEmpty() && --keyLine);Look at the variable: keyLine, when it reaches zero, the loop will break, so, there will never be a infinite loop.
Quote from: ollydbg on March 24, 2010, 04:24:40 PM
Loaden use this for condition below:
while (text.IsEmpty() && --keyLine);
Look at the variable: keyLine, when it reaches zero, the loop will break, so, there will never be a infinite loop.
Indeed. I missed that. C++ style calculations inside an if/while statement - I don't allow such in my coding style, so I am not used to it.
namespace blah{}; ?
Quote from: MortenMacFly on March 24, 2010, 04:27:49 PM
Quote from: ollydbg on March 24, 2010, 04:24:40 PM
Loaden use this for condition below:
while (text.IsEmpty() && --keyLine);
Look at the variable: keyLine, when it reaches zero, the loop will break, so, there will never be a infinite loop.
Indeed. I missed that. C++ style calculations inside an if/while statement - I don't allow such in my coding style, so I am not used to it.
Please test this demo:
class A
{If not use "do/while", when type '{', it can not judge the class type. :(
Quote from: Loaden on March 24, 2010, 04:40:28 PM
Please test this demo:
class A
{
If not use "do/while", when type '{', it can not judge the class type. :(
??? Strange. I did not apply in my copy yet, but what if you use:
do
{
int keyPos = control->GetLineIndentPosition(keyLine);
int start = control->WordStartPosition(keyPos, true);
int end = control->WordEndPosition(keyPos, true);
text = control->GetTextRange(start, end)
text.Trim();
--keyLine;
}
while ( text.IsEmpty() && (keyLine>0) );
Notice: This is
untested.
But noone will write this kind of code, search to the previous line is enough.
Quote from: MortenMacFly on March 24, 2010, 04:43:29 PM
??? Strange. I did not apply in my copy yet, but what if you use:
do
{
int keyPos = control->GetLineIndentPosition(keyLine);
int start = control->WordStartPosition(keyPos, true);
int end = control->WordEndPosition(keyPos, true);
text = control->GetTextRange(start, end)
text.Trim();
--keyLine;
}
while ( text.IsEmpty() && (keyLine>0) );
Notice: This is untested.
I test it, but it's not work for 'namespace {' question.
I will check it, and fix this problem.
Quote from: ollydbg on March 24, 2010, 04:46:38 PM
But noone will write this kind of code, search to the previous line is enough.
class A :
public B1,
public B2,
public B3,
public B4
{
|
};
Replace A, B1-4 with very long strings and for sure someone will write such code :)
namespace my
{
}; <--- here the semicolon is not needed!
Quote from: thomas on March 24, 2010, 04:30:15 PM
namespace blah{}; ?
namespace blah{}
;Sorry, I can not reproduce this problem.
Can you give me some demo?
I make a new patch, welcome test.
Index: src/sdk/cbeditor.cpp
===================================================================
--- src/sdk/cbeditor.cpp (revision 6195)
+++ src/sdk/cbeditor.cpp (working copy)
@@ -414,6 +414,23 @@
control->GotoPos(pos);
if (ch == _T('{'))
{
+ int curLine = control->GetCurrentLine();
+ int keyLine = curLine;
+ wxString text;
+ do
+ {
+ int keyPos = control->GetLineIndentPosition(keyLine);
+ int start = control->WordStartPosition(keyPos, true);
+ int end = control->WordEndPosition(keyPos, true);
+ text = control->GetTextRange(start, end);
+ }
+ while ((text.IsEmpty() || text == _T("public") || text == _T("protected") || text == _T("private"))
+ && text != _T("namespace")
+ && (--keyLine));
+
+ if (text == _T("class") || text == _T("struct") || text == _T("enum") || text == _T("union"))
+ control->InsertText(control->GetLineEndPosition(curLine), _T(";"));
+
const wxRegEx reg(_T("^[ \t]*{}[ \t]*"));
if (reg.Matches(control->GetCurLine()))
{
[attachment deleted by admin]
Quote from: Loaden on March 24, 2010, 05:13:36 PMCan you give me some demo?
Quote from: oBFusCATed on March 24, 2010, 04:55:42 PM
namespace my
{
}; <--- here the semicolon is not needed!
That's what I wanted to point out:)
Although most compilers in non-strict mode will silently convert that trailing semicolon to
((void)0); and ignore it, nevertheless it doesn't belong there.