Thanks, here is an improved patch, which handle them in the "else" clause.
Index: cbeditor.cpp
===================================================================
--- cbeditor.cpp (revision 8249)
+++ cbeditor.cpp (working copy)
@@ -731,6 +731,42 @@
END_EVENT_TABLE()
+// Count lines of EOL style in the opened file
+static void CountLineEnds(cbStyledTextCtrl* control, int &linesCR, int &linesLF, int &linesCRLF)
+{
+ linesCR = 0;
+ linesLF = 0;
+ linesCRLF = 0;
+
+ int lengthDoc = control->GetLength();
+ const int maxLengthDoc = 1000000;
+ char chPrev = ' ';
+ char chNext = control->GetCharAt(0);
+ for (int i = 0; i < lengthDoc; i++)
+ {
+ char ch = chNext;
+ chNext = control->GetCharAt(i + 1);
+ if (ch == '\r')
+ {
+ if (chNext == '\n')
+ linesCRLF++;
+ else
+ linesCR++;
+ }
+ else if (ch == '\n')
+ {
+ if (chPrev != '\r')
+ {
+ linesLF++;
+ }
+ }
+ else if (i > maxLengthDoc) // stop the loop if the file contains too many characters
+ return;
+
+ chPrev = ch;
+ }
+}
+
// class constructor
cbEditor::cbEditor(wxWindow* parent, const wxString& filename, EditorColourSet* theme)
: EditorBase(parent, filename),
@@ -1557,7 +1593,6 @@
control->SetMarginWidth(C_CHANGEBAR_MARGIN, 0);
// NOTE: duplicate line in editorconfigurationdlg.cpp (ctor)
- control->SetEOLMode( mgr->ReadInt(_T("/eol/eolmode"), platform::windows ? wxSCI_EOL_CRLF : wxSCI_EOL_LF)); // Windows takes CR+LF, other platforms LF only
control->SetScrollWidthTracking( mgr->ReadBool(_T("/margin/scroll_width_tracking"), false));
control->SetMultipleSelection( mgr->ReadBool(_T("/selection/multi_select"), false));
control->SetAdditionalSelectionTyping(mgr->ReadBool(_T("/selection/multi_typing"), false));
@@ -1575,6 +1610,79 @@
ConfigManager* mgr = Manager::Get()->GetConfigManager(_T("editor"));
+ // set the EOL, fall back value: Windows takes CR+LF, other platforms LF only
+ int eolMode = mgr->ReadInt(_T("/eol/eolmode"), platform::windows ? wxSCI_EOL_CRLF : wxSCI_EOL_LF);
+
+ // The code snippet of auto detect EOL is copied from SciTE's source, CountLineEnds() function
+ // scans the current source file, and counts lines of each EOL style, then finally sets the EOL
+ // by voting logic. In the case of mixed EOL files, we give the user a beep and InfoWindow notification.
+ if (eolMode == 3) //auto detect the EOL
+ {
+ int linesCR;
+ int linesLF;
+ int linesCRLF;
+
+ // count lines of each EOL style
+ CountLineEnds(control, linesCR, linesLF, linesCRLF);
+
+ //voting logic
+ unsigned int delay = 2000;
+ if (((linesLF >= linesCR) && (linesLF > linesCRLF)) || ((linesLF > linesCR) && (linesLF >= linesCRLF)))
+ {
+ eolMode = wxSCI_EOL_LF;
+ if((linesCR>0) || (linesCRLF>0))
+ {
+ wxBell();
+ InfoWindow::Display(_("Mixed Line Endings"), _("Mixed line endings found, setting mode \"LF\""), delay);
+ }
+ }
+ else if (((linesCR >= linesLF) && (linesCR > linesCRLF)) || ((linesCR > linesLF) && (linesCR >= linesCRLF)))
+ {
+ eolMode = wxSCI_EOL_CR;
+ if((linesLF>0) || (linesCRLF>0))
+ {
+ wxBell();
+ InfoWindow::Display(_("Mixed Line Endings"), _("Mixed line endings found, setting mode \"CR\""), delay);
+ }
+ }
+ else if (((linesCRLF >= linesLF) && (linesCRLF > linesCR)) || ((linesCRLF > linesLF) && (linesCRLF >= linesCR)))
+ {
+ eolMode = wxSCI_EOL_CRLF;
+ if((linesCR>0) || (linesLF>0))
+ {
+ wxBell();
+ InfoWindow::Display(_("Mixed Line Endings"), _("Mixed line endings found, setting mode \"CR-LF\""), delay);
+ }
+ }
+ else // in the case of the file does not contain any line-feed, or the file have equally counts of EOL styles
+ {
+ //set to the fall back mode
+ wxString eolModeStr;
+ if (platform::windows)
+ {
+ eolMode = wxSCI_EOL_CRLF;
+ eolModeStr = _T("\"CR-LF\"");
+ }
+ else
+ {
+ eolMode = wxSCI_EOL_LF;
+ eolModeStr = _T("\"LF\"");
+ }
+
+ if((linesCR>0) || (linesLF>0) || (linesCRLF>0)) //equal counts
+ {
+ wxBell();
+ InfoWindow::Display(_("Mixed Line Endings"), _("Mixed line endings found, setting mode ") + eolModeStr, delay);
+ }
+ else //no line-feed found
+ {
+ wxBell();
+ InfoWindow::Display(_("No Line Endings"), _("No Line Endings found, setting mode ") + eolModeStr, delay);
+ }
+ }
+ }
+ control->SetEOLMode(eolMode);
+
// Interpret #if/#else/#endif to grey out code that is not active
control->SetProperty(_T("lexer.cpp.track.preprocessor"), mgr->ReadBool(_T("/track_preprocessor"), true) ? _T("1") : _T("0"));
Index: resources/editor_configuration.xrc
===================================================================
--- resources/editor_configuration.xrc (revision 8249)
+++ resources/editor_configuration.xrc (working copy)
@@ -200,6 +200,7 @@
<item>CR LF</item>
<item>CR</item>
<item>LF</item>
+ <item>AUTO</item>
</content>
<style>wxCB_READONLY</style>
</object>
I have tested several cases, the only minor issue can be: e.g. Under Windows, a file have: linesCR = 0; linesLF = 5; linesCRLF = 5; --------> this will set the eol mode to "LF"......Logicially, I think it should set the eol mode to "CRLF", because under Windows, the CRLF take precedence. Any good idea about the voting logic? I can't find a better, simple and clean way.