diff --git a/Build/Notepad3.ini b/Build/Notepad3.ini
index 2f4458018..6773aaf75 100644
--- a/Build/Notepad3.ini
+++ b/Build/Notepad3.ini
@@ -39,6 +39,7 @@ SettingsVersion=4
;WebTemplate2=https://en.wikipedia.org/w/index.php?search=%s
;ExtendedWhiteSpaceChars=:
;AutoCompleteWordCharSet=
+;AutoCompleteFillUpChars=
;UpdateDelayMarkAllOccurrences=50
;CurrentLineHorizontalSlop=40
;CurrentLineVerticalSlop=5
diff --git a/Versions/build.txt b/Versions/build.txt
index 075c4f664..37bdb5cae 100644
--- a/Versions/build.txt
+++ b/Versions/build.txt
@@ -1 +1 @@
-2405
+2406
diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf
index c9b83e1bf..c4ec9dfc1 100644
--- a/res/Notepad3.exe.manifest.conf
+++ b/res/Notepad3.exe.manifest.conf
@@ -3,7 +3,7 @@
Notepad3 BETA
diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp
index d277afb18..7000585c9 100644
--- a/src/Config/Config.cpp
+++ b/src/Config/Config.cpp
@@ -728,6 +728,10 @@ void LoadSettings()
IniSectionGetString(Settings2_Section, L"AutoCompleteWordCharSet", Defaults2.AutoCompleteWordCharSet,
Settings2.AutoCompleteWordCharSet, COUNTOF(Settings2.AutoCompleteWordCharSet));
+ Defaults2.AutoCompleteFillUpChars[0] = L'\0';
+ IniSectionGetString(Settings2_Section, L"AutoCompleteFillUpChars", Defaults2.AutoCompleteFillUpChars,
+ Settings2.AutoCompleteFillUpChars, COUNTOF(Settings2.AutoCompleteFillUpChars));
+
StringCchCopyW(Defaults2.TimeStamp, COUNTOF(Defaults2.TimeStamp), L"\\$Date:[^\\$]+\\$ | $Date: %Y/%m/%d %H:%M:%S $");
IniSectionGetString(Settings2_Section, L"TimeStamp", Defaults2.TimeStamp, Settings2.TimeStamp, COUNTOF(Settings2.TimeStamp));
@@ -743,7 +747,6 @@ void LoadSettings()
StringCchCopyW(Defaults2.WebTemplate2, COUNTOF(Defaults2.WebTemplate2), L"https://en.wikipedia.org/w/index.php?search=%s");
IniSectionGetString(Settings2_Section, L"WebTemplate2", Defaults2.WebTemplate2, Settings2.WebTemplate2, COUNTOF(Settings2.WebTemplate2));
-
// --------------------------------------------------------------------------
const WCHAR* const Settings_Section = L"Settings";
// --------------------------------------------------------------------------
diff --git a/src/Edit.c b/src/Edit.c
index 543c7a6ed..b26b4d8d2 100644
--- a/src/Edit.c
+++ b/src/Edit.c
@@ -64,6 +64,9 @@ static char WordCharsAccelerated[ANSI_CHAR_BUFFER] = { '\0' };
static char WhiteSpaceCharsAccelerated[ANSI_CHAR_BUFFER] = { '\0' };
static char PunctuationCharsAccelerated[1] = { '\0' }; // empty!
+static char AutoCompleteFillUpChars[64] = { '\0' };
+static bool s_ACFillUpCharsHaveNewLn = false;
+
// Default Codepage and Character Set
#define W_AUTOC_WORD_ANSI1252 L"#$%&@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ"
static char AutoCompleteWordCharSet[ANSI_CHAR_BUFFER] = { L'\0' };
@@ -255,6 +258,22 @@ void EditInitWordDelimiter(HWND hwnd)
StringCchCopyA(DelimCharsAccel, COUNTOF(DelimCharsAccel), WhiteSpaceCharsDefault);
StringCchCatA(DelimCharsAccel, COUNTOF(DelimCharsAccel), lineEnds);
+ if (StrIsNotEmpty(Settings2.AutoCompleteFillUpChars))
+ {
+ WideCharToMultiByte(Encoding_SciCP, 0, Settings2.AutoCompleteFillUpChars, -1, AutoCompleteFillUpChars, COUNTOF(AutoCompleteFillUpChars), NULL, NULL);
+ UnSlash(AutoCompleteFillUpChars, Encoding_SciCP);
+
+ s_ACFillUpCharsHaveNewLn = false;
+ int i = 0;
+ while (AutoCompleteFillUpChars[i]) {
+ if ((AutoCompleteFillUpChars[i] == '\r') || (AutoCompleteFillUpChars[i] == '\n')) {
+ s_ACFillUpCharsHaveNewLn = true;
+ break;
+ }
+ ++i;
+ }
+ }
+
if (StrIsNotEmpty(Settings2.AutoCompleteWordCharSet))
{
WideCharToMultiByte(Encoding_SciCP, 0, Settings2.AutoCompleteWordCharSet, -1, AutoCompleteWordCharSet, COUNTOF(AutoCompleteWordCharSet), NULL, NULL);
@@ -741,8 +760,8 @@ bool EditCopyAppend(HWND hwnd, bool bAppend)
HANDLE const hOld = GetClipboardData(CF_UNICODETEXT);
const WCHAR* pszOld = GlobalLock(hOld);
- int const _eol_mode = SciCall_GetEOLMode();
- const WCHAR *pszSep = ((_eol_mode == SC_EOL_CRLF) ? L"\r\n" : ((_eol_mode == SC_EOL_CR) ? L"\r" : L"\n"));
+ WCHAR pszSep[3] = { L'\0' };
+ Sci_GetCurrentEOL_W(pszSep);
size_t cchNewText = cchTextW;
if (pszOld && *pszOld) {
@@ -3903,14 +3922,8 @@ void EditWrapToColumn(HWND hwnd,DocPos nColumn/*,int nTabWidth*/)
return;
}
- int cchEOL = 2;
- WCHAR wszEOL[] = L"\r\n";
- int const cEOLMode = SciCall_GetEOLMode();
- if (cEOLMode == SC_EOL_CR)
- cchEOL = 1;
- else if (cEOLMode == SC_EOL_LF) {
- cchEOL = 1; wszEOL[0] = L'\n';
- }
+ WCHAR wszEOL[3] = { L'\0' };
+ int const cchEOL = Sci_GetCurrentEOL_W(wszEOL);
int cchConvW = 0;
DocPos iLineLength = 0;
@@ -4065,23 +4078,8 @@ void EditJoinLinesEx(HWND hwnd, bool bPreserveParagraphs, bool bCRLF2Space)
return;
}
- char szEOL[] = "\r\n";
- int cchEOL = 2;
- switch (SciCall_GetEOLMode())
- {
- case SC_EOL_LF:
- szEOL[0] = '\n';
- szEOL[1] = '\0';
- cchEOL = 1;
- break;
- case SC_EOL_CR:
- szEOL[1] = '\0';
- cchEOL = 1;
- break;
- case SC_EOL_CRLF:
- default:
- break;
- }
+ char szEOL[3] = { '\0' };
+ int const cchEOL = Sci_GetCurrentEOL_A(szEOL);
for (int i = 0; i < iSelLength; ++i)
{
@@ -4208,15 +4206,8 @@ void EditSortLines(HWND hwnd, int iSortFlags)
DocLn const iLineCount = iLineEnd - iLineStart + 1;
- int const cEOLMode = SciCall_GetEOLMode();
- char mszEOL[] = "\r\n";
- if (cEOLMode == SC_EOL_CR) {
- mszEOL[1] = '\0';
- }
- else if (cEOLMode == SC_EOL_LF) {
- mszEOL[0] = '\n';
- mszEOL[1] = '\0';
- }
+ char mszEOL[3] = { '\0' };
+ Sci_GetCurrentEOL_A(mszEOL);
int const _iTabWidth = SciCall_GetTabWidth();
@@ -6705,6 +6696,16 @@ void EditMarkAll(HWND hwnd, char* pszFind, int flags, DocPos rangeStart, DocPos
}
+//=============================================================================
+//
+// EditCheckNewLineInACFillUps()
+//
+bool EditCheckNewLineInACFillUps()
+{
+ return s_ACFillUpCharsHaveNewLn;
+}
+
+
//=============================================================================
//
// EditAutoCompleteWord()
@@ -6901,9 +6902,8 @@ bool EditAutoCompleteWord(HWND hwnd, bool autoInsert)
SciCall_AutoCSetIgnoreCase(true);
//SendMessage(hwnd, SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR, (WPARAM)SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE, 0);
SciCall_AutoCSetChooseSingle(autoInsert);
- //SciCall_AutoCSetOrder(SC_ORDER_PERFORMSORT); // already sorted
- SciCall_AutoCSetFillups("\t\n\r");
- //SciCall_AutoCSetFillups(Settings.AccelWordNavigation ? WhiteSpaceCharsDefault : WhiteSpaceCharsAccelerated);
+ //~SciCall_AutoCSetOrder(SC_ORDER_PERFORMSORT); // already sorted
+ SciCall_AutoCSetFillups(AutoCompleteFillUpChars);
++iWListSize; // zero termination
char* const pList = AllocMem(iWListSize, HEAP_ZERO_MEMORY);
diff --git a/src/Edit.h b/src/Edit.h
index 0f198d778..c713db237 100644
--- a/src/Edit.h
+++ b/src/Edit.h
@@ -110,6 +110,7 @@ void EditFinalizeStyling(HWND hwnd, DocPos iEndPos);
void EditUpdateIndicators(HWND hwnd, DocPos startPos, DocPos endPos, bool bClearOnly);
void EditSetAccelWordNav(HWND hwnd,bool);
bool EditAutoCompleteWord(HWND hwnd,bool);
+bool EditCheckNewLineInACFillUps();
void EditShowZeroLengthCallTip(HWND hwnd, DocPos iPosition);
void EditGetBookmarkList(HWND hwnd,LPWSTR pszBookMarks,int cchLength);
void EditSetBookmarkList(HWND hwnd,LPCWSTR pszBookMarks);
diff --git a/src/Helpers.h b/src/Helpers.h
index eeced1a67..31d5f5b5d 100644
--- a/src/Helpers.h
+++ b/src/Helpers.h
@@ -347,6 +347,7 @@ bool MRU_MergeSave(LPMRULIST pmru,bool,bool,bool);
#define MRU_Count(pmru) MRU_Enum((pmru), 0, NULL, 0)
//==== UnSlash Functions ======================================================
+unsigned int UnSlash(char* s, UINT cpEdit);
void TransformBackslashes(char* pszInput,bool,UINT cpEdit,int* iReplaceMsg);
void TransformMetaChars(char* pszInput,bool,int iEOLMode);
diff --git a/src/Notepad3.c b/src/Notepad3.c
index 27e1767cc..1f5254f1f 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -3091,11 +3091,11 @@ LRESULT MsgInitMenu(HWND hwnd, WPARAM wParam, LPARAM lParam)
}
CheckMenuRadioItem(hmenu,IDM_ENCODING_ANSI,IDM_ENCODING_UTF8SIGN,i,MF_BYCOMMAND);
- int const _eol_mode = SciCall_GetEOLMode();
- if (_eol_mode == SC_EOL_CRLF) {
+ int const eol_mode = SciCall_GetEOLMode();
+ if (eol_mode == SC_EOL_CRLF) {
i = IDM_LINEENDINGS_CRLF;
}
- else if (_eol_mode == SC_EOL_CR) {
+ else if (eol_mode == SC_EOL_CR) {
i = IDM_LINEENDINGS_CR;
}
else {
@@ -6787,8 +6787,8 @@ static void _HandleAutoIndent(int const charAdded)
{
// TODO: handle indent after '{' and un-indent on '}' in C/C++ ?
// in CRLF mode handle LF only...
- int const _eol_mode = SciCall_GetEOLMode();
- if (((SC_EOL_CRLF == _eol_mode) && (charAdded != '\r')) || (SC_EOL_CRLF != _eol_mode))
+ int const eol_mode = SciCall_GetEOLMode();
+ if (((SC_EOL_CRLF == eol_mode) && (charAdded != '\r')) || (SC_EOL_CRLF != eol_mode))
{
DocPos const iCurPos = SciCall_GetCurrentPos();
DocLn const iCurLine = SciCall_LineFromPosition(iCurPos);
@@ -7015,6 +7015,33 @@ static LRESULT _MsgNotifyFromEdit(HWND hwnd, const LPNMHDR pnmh, const SCNotific
case SCN_CALLTIPCLICK:
return 0;
+ case SCN_AUTOCSELECTION:
+ {
+ switch (scn->listCompletionMethod)
+ {
+ case SC_AC_TAB:
+ case SC_AC_COMMAND:
+ case SC_AC_DOUBLECLICK:
+ // accepted
+ break;
+
+ case SC_AC_FILLUP:
+ // see: SciCall_AutoCSetFillups() -> accepted
+ break;
+
+ case SC_AC_NEWLINE:
+ if (!EditCheckNewLineInACFillUps()) {
+ SciCall_AutoCCancel(); // rejected
+ PostMessage(Globals.hwndEdit, SCI_NEWLINE, 0, 0);
+ }
+ break;
+
+ default:
+ SciCall_AutoCCancel(); // rejected
+ break;
+ }
+ }
+ break;
case SCN_MODIFIED:
{
@@ -7394,10 +7421,10 @@ LRESULT MsgNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
case STATUS_EOLMODE:
{
int i;
- int const _eol_mode = SciCall_GetEOLMode();
- if (_eol_mode == SC_EOL_CRLF)
+ int const eol_mode = SciCall_GetEOLMode();
+ if (eol_mode == SC_EOL_CRLF)
i = IDM_LINEENDINGS_CRLF;
- else if (_eol_mode == SC_EOL_CR)
+ else if (eol_mode == SC_EOL_CR)
i = IDM_LINEENDINGS_CR;
else
i = IDM_LINEENDINGS_LF;
@@ -8632,17 +8659,17 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw)
if (s_iStatusbarVisible[STATUS_EOLMODE])
{
static int s_iEOLMode = -1;
- int const _eol_mode = SciCall_GetEOLMode();
+ int const eol_mode = SciCall_GetEOLMode();
- if (bForceRedraw || (s_iEOLMode != _eol_mode))
+ if (bForceRedraw || (s_iEOLMode != eol_mode))
{
static WCHAR tchEOL[16] = { L'\0' };
- if (_eol_mode == SC_EOL_LF)
+ if (eol_mode == SC_EOL_LF)
{
StringCchPrintf(tchStatusBar[STATUS_EOLMODE], txtWidth, (Globals.bDocHasInconsistentEOLs ? _LFi_f : _LF_f),
s_mxSBPrefix[STATUS_EOLMODE], s_mxSBPostfix[STATUS_EOLMODE]);
}
- else if (_eol_mode == SC_EOL_CR)
+ else if (eol_mode == SC_EOL_CR)
{
StringCchPrintf(tchStatusBar[STATUS_EOLMODE], txtWidth, (Globals.bDocHasInconsistentEOLs ? _CRi_f : _CR_f),
s_mxSBPrefix[STATUS_EOLMODE], s_mxSBPostfix[STATUS_EOLMODE]);
@@ -8651,7 +8678,7 @@ static void _UpdateStatusbarDelayed(bool bForceRedraw)
StringCchPrintf(tchStatusBar[STATUS_EOLMODE], txtWidth, (Globals.bDocHasInconsistentEOLs ? _CRLFi_f : _CRLF_f),
s_mxSBPrefix[STATUS_EOLMODE], s_mxSBPostfix[STATUS_EOLMODE]);
}
- s_iEOLMode = _eol_mode;
+ s_iEOLMode = eol_mode;
bIsUpdateNeeded = true;
}
}
diff --git a/src/SciCall.h b/src/SciCall.h
index 9684c9b30..a19bd58a6 100644
--- a/src/SciCall.h
+++ b/src/SciCall.h
@@ -539,8 +539,6 @@ DeclareSciCallR0(IsSelectionRectangle, SELECTIONISRECTANGLE, bool)
#define Sci_HaveUndoRedoHistory() (SciCall_CanUndo() || SciCall_CanRedo())
-#define Sci_GetEOLLen() ((SciCall_GetEOLMode() == SC_EOL_CRLF) ? 2 : 1)
-
#define Sci_GetCurrentLineNumber() SciCall_LineFromPosition(SciCall_GetCurrentPos())
#define Sci_GetLastDocLineNumber() (SciCall_GetLineCount() - 1)
@@ -569,6 +567,46 @@ inline DocPos Sci_GetRangeMaxLineLength(DocLn iBeginLine, DocLn iEndLine) {
#define Sci_DisableMouseDWellNotification() SciCall_SetMouseDWellTime(SC_TIME_FOREVER)
+// ----------------------------------------------------------------------------
+
+#define Sci_GetEOLLen() ((SciCall_GetEOLMode() == SC_EOL_CRLF) ? 2 : 1)
+
+
+inline int Sci_GetCurrentEOL_A(LPCH eol) {
+ switch (SciCall_GetEOLMode()) {
+ case SC_EOL_CRLF:
+ eol[0] = '\r'; eol[1] = '\n'; eol[2] = '\0';
+ return 2;
+ case SC_EOL_CR:
+ eol[0] = '\r'; eol[1] = '\0';
+ return 1;
+ case SC_EOL_LF:
+ eol[0] = '\n'; eol[1] = '\0';
+ return 1;
+ default:
+ return 0;
+ }
+}
+// ----------------------------------------------------------------------------
+
+inline int Sci_GetCurrentEOL_W(LPWCH eol) {
+ switch (SciCall_GetEOLMode()) {
+ case SC_EOL_CRLF:
+ eol[0] = L'\r'; eol[1] = L'\n'; eol[2] = L'\0';
+ return 2;
+ case SC_EOL_CR:
+ eol[0] = L'\r'; eol[1] = L'\0';
+ return 1;
+ case SC_EOL_LF:
+ eol[0] = L'\n'; eol[1] = L'\0';
+ return 1;
+ default:
+ return 0;
+ }
+}
+// ----------------------------------------------------------------------------
+
+
//=============================================================================
#endif //_NP3_SCICALL_H_
diff --git a/src/TypeDefs.h b/src/TypeDefs.h
index 79989ee0b..727412935 100644
--- a/src/TypeDefs.h
+++ b/src/TypeDefs.h
@@ -502,6 +502,7 @@ typedef struct _settings2_t
WCHAR FileBrowserPath[MAX_PATH];
WCHAR AppUserModelID[32];
+ WCHAR AutoCompleteFillUpChars[64];
WCHAR ExtendedWhiteSpaceChars[ANSI_CHAR_BUFFER + 1];
WCHAR AutoCompleteWordCharSet[ANSI_CHAR_BUFFER + 1];
WCHAR TimeStamp[128];
diff --git a/src/Version.h b/src/Version.h
index 34dc5092d..b0f3f6012 100644
--- a/src/Version.h
+++ b/src/Version.h
@@ -66,10 +66,16 @@
// Compiler specific
#if defined(_MSC_VER)
- #if (_MSC_VER >= 1920)
- #if(_MSC_FULL_VER >= 192127702)
+ #if (_MSC_VER >= 1922)
+ #if(_MSC_FULL_VER >= 192227905)
+ #define VER_CPL MS Visual C++ 2019 v16.2.0
+ #endif
+ #elif (_MSC_VER >= 1921)
+ #if(_MSC_FULL_VER >= 192127702)
#define VER_CPL MS Visual C++ 2019 v16.1.(0-6)
- #elif(_MSC_FULL_VER >= 192027508)
+ #endif
+ #elif (_MSC_VER >= 1920)
+ #if(_MSC_FULL_VER >= 192027508)
#define VER_CPL MS Visual C++ 2019 v16.0.(0-4)
#elif(_MSC_FULL_VER >= 192027027)
#define VER_CPL MS Visual C++ 2019 v16.0.Prev(1-4)
diff --git a/src/VersionEx.h b/src/VersionEx.h
index 2d8b043f8..6a6f47e22 100644
--- a/src/VersionEx.h
+++ b/src/VersionEx.h
@@ -8,7 +8,7 @@
#define VERSION_MAJOR 5
#define VERSION_MINOR 19
#define VERSION_REV 725
-#define VERSION_BUILD 2405
+#define VERSION_BUILD 2406
#define SCINTILLA_VER 420
#define ONIGURUMA_REGEX_VER 6.9.3
#define VERSION_PATCH BETA