📄 console.cpp
字号:
LPTSTR lptstr = (LPTSTR)GlobalLock(hglb);
if (lptstr != NULL)
{
_tcsncpy(m_pchBuffer1,lptstr,m_dwBufferSize);
m_pchBuffer1[m_dwBufferSize-1] = 0;
pch = m_pchBuffer1;
GlobalUnlock(hglb);
}
}
CloseClipboard();
if (pch == NULL) continue;
while (*pch)
{
if (_istprint(*pch))
{
if (dwLastCharOffset >= m_dwBufferSize-1)
{
ASSERT(dwLastCharOffset == m_dwBufferSize-1);
// Beep(1000,100);
break;
}
TCHAR ch1;
//if (m_blnInsetMode)
ch1 = m_pchBuffer[dwCurrentCharOffset];
m_pchBuffer[dwCurrentCharOffset] = *pch;
if ((m_blnInsetMode)||(dwCurrentCharOffset == dwLastCharOffset)) dwLastCharOffset++;
dwCurrentCharOffset++;
if (!Write(pch,1)) return FALSE;
if (m_blnInsetMode)
{
COORD Cursor = m_CursorPosition;
DWORD ofs = dwCurrentCharOffset;
while(ofs <= dwLastCharOffset)
{
ch = m_pchBuffer[ofs];
m_pchBuffer[ofs] = ch1;
ch1 = ch;
ofs++;
}
if (dwCurrentCharOffset < dwLastCharOffset)
{
if (!Write(m_pchBuffer+dwCurrentCharOffset,dwLastCharOffset-dwCurrentCharOffset)) return FALSE;
if (m_LinesScrolled)
{
if (m_LinesScrolled > FristCharCursorPosition.Y) return FALSE;
Cursor.Y = SHORT(Cursor.Y - m_LinesScrolled);
}
// Update cursor position
m_CursorPosition = Cursor;
if (!SetConsoleCursorPosition(m_hStdOut,m_CursorPosition)) return FALSE;
}
}
}
pch++;
}
}
}
else
#endif
if (InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_LEFT)
{
if (blnCompletionMode) blnCompletionMode = FALSE;
if (dwCurrentCharOffset)
{
if (InputRecord.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED))
{
TCHAR *pchWordBegin = m_pchBuffer+dwCurrentCharOffset-1;
while (pchWordBegin > m_pchBuffer)
{
if (!_istspace(*pchWordBegin)) break;
pchWordBegin--;
}
while (pchWordBegin > m_pchBuffer)
{
if (_istspace(*(pchWordBegin-1))) break;
pchWordBegin--;
}
ASSERT(pchWordBegin >= m_pchBuffer);
dwCurrentCharOffset = pchWordBegin - m_pchBuffer;
ASSERT(dwCurrentCharOffset < dwLastCharOffset);
m_CursorPosition.X = X_CURSOR_POSITION_FROM_OFFSET(dwCurrentCharOffset);
m_CursorPosition.Y = Y_CURSOR_POSITION_FROM_OFFSET(dwCurrentCharOffset);
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
}
else
{
dwCurrentCharOffset--;
if (m_CursorPosition.X)
{
m_CursorPosition.X--;
}
else
{
m_CursorPosition.X = SHORT(m_BufferSize.X-1);
ASSERT(m_CursorPosition.Y);
m_CursorPosition.Y--;
}
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
}
}
}
else if (InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_RIGHT)
{
if (blnCompletionMode) blnCompletionMode = FALSE;
if (dwCurrentCharOffset < dwLastCharOffset)
{
if (InputRecord.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED))
{
TCHAR *pchWordBegin = m_pchBuffer+dwCurrentCharOffset;
while ((DWORD)(pchWordBegin - m_pchBuffer) < dwLastCharOffset)
{
if (_istspace(*pchWordBegin)) break;
pchWordBegin++;
}
while ((DWORD)(pchWordBegin - m_pchBuffer) < dwLastCharOffset)
{
if (!_istspace(*pchWordBegin)) break;
pchWordBegin++;
}
dwCurrentCharOffset = pchWordBegin - m_pchBuffer;
ASSERT(dwCurrentCharOffset <= dwLastCharOffset);
m_CursorPosition.X = X_CURSOR_POSITION_FROM_OFFSET(dwCurrentCharOffset);
m_CursorPosition.Y = Y_CURSOR_POSITION_FROM_OFFSET(dwCurrentCharOffset);
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
}
else
{
dwCurrentCharOffset++;
m_CursorPosition.X++;
if (m_CursorPosition.X == m_BufferSize.X)
{
m_CursorPosition.Y++;
m_CursorPosition.X = 0;
}
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
}
}
}
else if (InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_HOME)
{
if (blnCompletionMode) blnCompletionMode = FALSE;
dwCurrentCharOffset = 0;
m_CursorPosition = FristCharCursorPosition;
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
}
else if (InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_END)
{
if (blnCompletionMode) blnCompletionMode = FALSE;
dwCurrentCharOffset = dwLastCharOffset;
m_CursorPosition.X = X_CURSOR_POSITION_FROM_OFFSET(dwLastCharOffset);
m_CursorPosition.Y = Y_CURSOR_POSITION_FROM_OFFSET(dwLastCharOffset);
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
}
else if (InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_UP)
{
if (blnCompletionMode) blnCompletionMode = FALSE;
dwHistoryIndex++;
const TCHAR *pchHistoryLine = m_History.GetHistoryLine(dwHistoryIndex-1);
if (pchHistoryLine)
{
if (dwLastCharOffset)
{
_tcsnset(m_pchBuffer,_T(' '),dwLastCharOffset);
m_CursorPosition = FristCharCursorPosition;
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
VERIFY(Write(m_pchBuffer,dwLastCharOffset));
dwCurrentCharOffset = dwLastCharOffset = 0;
m_CursorPosition = FristCharCursorPosition;
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
}
dwCurrentCharOffset = dwLastCharOffset = _tcslen(pchHistoryLine);
if (dwLastCharOffset >= m_dwBufferSize)
{
ASSERT(FALSE);
return FALSE;
}
_tcscpy(m_pchBuffer,pchHistoryLine);
if (!Write(m_pchBuffer)) return FALSE;
}
else
{
dwHistoryIndex--;
}
}
else if (InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_DOWN)
{
if (blnCompletionMode) blnCompletionMode = FALSE;
if (dwHistoryIndex)
{
dwHistoryIndex--;
const TCHAR *pchHistoryLine = m_History.GetHistoryLine(dwHistoryIndex-1);
if (dwLastCharOffset)
{
_tcsnset(m_pchBuffer,_T(' '),dwLastCharOffset);
m_CursorPosition = FristCharCursorPosition;
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
VERIFY(Write(m_pchBuffer,dwLastCharOffset));
dwCurrentCharOffset = dwLastCharOffset = 0;
m_CursorPosition = FristCharCursorPosition;
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
}
if (pchHistoryLine)
{
dwCurrentCharOffset = dwLastCharOffset = _tcslen(pchHistoryLine);
if (dwLastCharOffset >= m_dwBufferSize)
{
ASSERT(FALSE);
return FALSE;
}
_tcscpy(m_pchBuffer,pchHistoryLine);
if (!Write(m_pchBuffer)) return FALSE;
}
}
}
else if ((InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_DELETE)&&
(dwLastCharOffset))
{
// Move the characters if any...
ASSERT(dwLastCharOffset);
DWORD dwCharOffset = dwCurrentCharOffset;
if (dwCharOffset < dwLastCharOffset)
{
while(dwCharOffset < dwLastCharOffset)
{
m_pchBuffer[dwCharOffset] = m_pchBuffer[dwCharOffset+1];
dwCharOffset++;
}
m_pchBuffer[dwLastCharOffset-1] = _T(' ');
// Save cursor position
COORD Cursor = m_CursorPosition;
if (!Write(m_pchBuffer+dwCurrentCharOffset,dwLastCharOffset-dwCurrentCharOffset)) return FALSE;
dwLastCharOffset--;
// Update cursor position
m_CursorPosition = Cursor;
if (!SetConsoleCursorPosition(m_hStdOut,m_CursorPosition)) return FALSE;
}
}
// else if ((InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_PAUSE)&&
// (InputRecord.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)))
// {
// if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0)) return FALSE;
// }
}
else if ((ch == 27) && dwLastCharOffset &&
(InputRecord.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE))
{
if (blnCompletionMode) blnCompletionMode = FALSE;
_tcsnset(m_pchBuffer,_T(' '),dwLastCharOffset);
m_CursorPosition = FristCharCursorPosition;
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
VERIFY(Write(m_pchBuffer,dwLastCharOffset));
dwCurrentCharOffset = dwLastCharOffset = 0;
m_CursorPosition = FristCharCursorPosition;
VERIFY(SetConsoleCursorPosition(m_hStdOut,m_CursorPosition));
}
else if (ch == _T('\r'))
{ // carriage return
if (!SetConsoleCursorPosition(m_hStdOut,m_CursorPosition = FristCharCursorPosition)) return FALSE;
ASSERT(dwLastCharOffset <= m_dwBufferSize);
m_pchBuffer[dwLastCharOffset] = 0; // terminate string in buffer
ret = Write(m_pchBuffer);
m_History.AddHistoryLine(m_pchBuffer);
TCHAR *strLF = _T("\n");
ret = Write(strLF);
break;
}
else if (ch == _T('\b'))
{ // backspace
if (blnCompletionMode) blnCompletionMode = FALSE;
if ((dwCurrentCharOffset) && ((m_CursorPosition.X != 0) || (m_CursorPosition.Y != 0)))
{
// Calculate new cursor position
COORD NewCursorPosition;
if (m_CursorPosition.X)
{
NewCursorPosition.X = SHORT(m_CursorPosition.X-1);
NewCursorPosition.Y = m_CursorPosition.Y;
}
else
{
ASSERT(m_BufferSize.X);
NewCursorPosition.X = SHORT(m_BufferSize.X-1);
ASSERT(m_CursorPosition.Y);
NewCursorPosition.Y = SHORT(m_CursorPosition.Y-1);
}
// Move the characters if any...
ASSERT(dwLastCharOffset);
DWORD dwCharOffset = dwCurrentCharOffset-1;
while(dwCharOffset < dwLastCharOffset-1)
{
m_pchBuffer[dwCharOffset] = m_pchBuffer[dwCharOffset+1];
dwCharOffset++;
}
m_pchBuffer[dwLastCharOffset-1] = _T(' ');
dwCurrentCharOffset--;
m_CursorPosition = NewCursorPosition;
if (!Write(m_pchBuffer+dwCurrentCharOffset,dwLastCharOffset-dwCurrentCharOffset)) return FALSE;
// Update cursor position
m_CursorPosition = NewCursorPosition;
if (!SetConsoleCursorPosition(m_hStdOut,m_CursorPosition)) return FALSE;
dwLastCharOffset--;
}
}
else if (ch == _T('\t'))
{ // Tab
if (!blnCompletionMode) // If tab was pressed after non-tab. We enter in completion mode.
{
// Initialize completion index
if (InputRecord.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED) // If shift was pressed
nCompletionIndex = (unsigned long long) -1; // Last completion
else
nCompletionIndex = 0; // First completion
// Find completion offset. It points at char after first non-quoted whitespace.
dwCompletionOffset = dwCurrentCharOffset;
BOOL blnQuotedParameter = FALSE;
while(dwCompletionOffset)
{
dwCompletionOffset--;
if (m_pchBuffer[dwCompletionOffset] == _T('\"'))
{
blnQuotedParameter = !blnQuotedParameter;
}
else if (!blnQuotedParameter && _istspace(m_pchBuffer[dwCompletionOffset]))
{ // Found ! We are not inside quored parameter and we are on whitespace.
dwCompletionOffset++; // dwCompletionOffset must point at char AFTER first non-quoted whitespace.
break;
}
}
ASSERT(dwCompletionOffset <= dwCurrentCharOffset);
// Save not changing part (context) of completion in m_pchBuffer1
_tcsncpy(m_pchBuffer1,m_pchBuffer,dwCompletionOffset);
m_pchBuffer1[dwCompletionOffset] = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -