One of the features I use of the command shell, which is provided by the consol functions (as other non-command shell programs exhibit the same behaviour) is the use of F8 to retrieve commands with the same prefix. I have coded something which behaves like this to update the console editing functions, but wanted to get verification I have done the right thing. Specifically I am concerned about having to add another table, as the char code for f8 is 0x00, so I cannot add it to the existing table. Assuming it is ok, heres the patch Changelog: - Add f8 (histroy retrieval from partial command) support to console editing modes Note: This includes my previous (small) patch relating to del, ctrl+right, and ctrl+end (must work out how to do diff better!) Regards, Jason jason @ the-edmeades.demon.co.uk Index: editline.c =================================================================== RCS file: /home/wine/wine/win32/editline.c,v retrieving revision 1.6 diff -u -u -r1.6 editline.c --- editline.c 26 Apr 2002 19:05:18 -0000 1.6 +++ editline.c 29 Apr 2002 21:48:36 -0000 @@ -19,8 +19,6 @@ */ #include "config.h" -#include "wine/port.h" - #include <string.h> #include "windef.h" @@ -239,8 +237,8 @@ static int WCEL_GetRightWordTransition(WCEL_Context* ctx, int ofs) { ofs++; - while (ofs <= ctx->len && !WCEL_iswalnum(ctx->line[ofs])) ofs++; while (ofs <= ctx->len && WCEL_iswalnum(ctx->line[ofs])) ofs++; + while (ofs <= ctx->len && !WCEL_iswalnum(ctx->line[ofs])) ofs++; return min(ofs, ctx->len); } @@ -296,6 +294,46 @@ } } +static void WCEL_FindPrevInHist(WCEL_Context* ctx) +{ + int startPos = ctx->histPos; + WCHAR* data; + int len, oldofs; + + if (ctx->histPos && ctx->histPos == ctx->histSize) { + startPos--; + ctx->histPos--; + } + + do { + data = WCEL_GetHistory(ctx, ctx->histPos); + + if (ctx->histPos) ctx->histPos--; + else ctx->histPos = (ctx->histSize-1); + + len = lstrlenW(data) + 1; + if ((len >= ctx->ofs) && + (memcmp(ctx->line, data, ctx->ofs * sizeof(WCHAR)) == 0)) { + + /* need to clean also the screen if new string is shorter than old one */ + WCEL_DeleteString(ctx, 0, ctx->len); + + if (WCEL_Grow(ctx, len)) + { + oldofs = ctx->ofs; + ctx->ofs = 0; + WCEL_InsertString(ctx, data); + ctx->ofs = oldofs; + SetConsoleCursorPosition(ctx->hConOut, WCEL_GetCoord(ctx, ctx->ofs)); + HeapFree(GetProcessHeap(), 0, data); + return; + } + } + } while (ctx->histPos != startPos); + + return; +} + /* ==================================================================== * * basic edition functions @@ -537,6 +575,13 @@ { 0, NULL } }; +static KeyEntry Win32ExtraStdKeyMap[] = +{ + {/*VK_F8*/ 0x77, WCEL_FindPrevInHist }, + { 0, NULL } +}; + + static KeyEntry EmacsKeyMapCtrl[] = { { CTRL('@'), WCEL_SetMark }, @@ -617,6 +662,7 @@ {/*VK_END*/ 0x23, WCEL_MoveToEnd }, {/*VK_UP*/ 0x26, WCEL_MoveToPrevHist }, {/*VK_DOWN*/ 0x28, WCEL_MoveToNextHist }, + {/*VK_DEL*/ 0x2e, WCEL_FindPrevInHist /*L_DeleteCurrChar*/ }, { 0, NULL } }; @@ -624,12 +670,14 @@ { {/*VK_LEFT*/ 0x25, WCEL_MoveToLeftWord }, {/*VK_RIGHT*/0x27, WCEL_MoveToRightWord }, + {/*VK_END*/ 0x23, WCEL_KillToEndOfLine }, { 0, NULL } }; KeyMap Win32KeyMap[] = { {0x00000000, 1, StdKeyMap}, + {0x00000000, 0, Win32ExtraStdKeyMap}, {0x00000100, 0, Win32KeyMapExtended}, {0x00000104, 0, Win32KeyMapCtrlExtended}, {0x00000108, 0, Win32KeyMapCtrlExtended},
Attachment:
console-edit2.patch.6
Description: Binary data