Possible with a plugin?

#1
Charles, Rex, anyone, do you think this is possible with a keystroke handler plugin?

... put a timestamp at the end of a command line ... on the same line ... maybe, upon <Enter>, put the timestamp on the command line after the current position, without altering the current position, and leaving the <Enter> (or NUL) in place. That could get messy with multi-line commands.

Do you think it could be done with PRE_EXEC? I tried
Code:
alias pre_exec `echos %_time`
but it gets it's own line.
 
#3
Wouldn't be difficult with a keystroke handler. I don't think you'd want to hook Enter, though -- there wouldn't be very many commands you would want to add a timestamp to!
Yes, it was quite easy.
Code:
  if ( lpki->nKey == 13 )
   {
     WCHAR szCmd[64] = L"ECHO ^e[35;1m(%_TIME)^e[0m";
     Command(szCmd, 0);
     return 0;
   }
upload_2014-10-16_23-24-10.png
<snip>
It seems a bit kludgy. Any suggestions? (probably should be ECHOS).
 
#4
This makes it versatile and user-friendly, and works as shown above after
Code:
set postprompt=`^e[35;1m(%_TIME)^e[0m`
Code:
  if ( lpki->nKey == 13 )
   {
     WCHAR szCmd[64] = L"ECHO ^s";
     if ( GetEnvironmentVariable(L"POSTPROMPT", szCmd + 7, 57) )
       Command(szCmd, 0);
     return 0;
   }
 
#5
But that only works well if the cursor is at the end of the command line when <Enter> is pressed. Hmmm! Now I have to figure out where the end of the command line is in the console (not tonight).
 

Charles Dye

Super Moderator
Staff member
May 20, 2008
3,588
46
Albuquerque, NM
prospero.unm.edu
#6
Well, I completely misunderstood what you're trying to do.

The structure passed to keystroke plugins includes the starting row/column of the command line, as well as a copy of the command line itself. Add the length of pszLine to the start column, and then I guess do some modulo arithmetic to handle lines longer than the console width?
 
#7
Well, I completely misunderstood what you're trying to do.

The structure passed to keystroke plugins includes the starting row/column of the command line, as well as a copy of the command line itself. Add the length of pszLine to the start column, and then I guess do some modulo arithmetic to handle lines longer than the console width?
Thanks! I knew all that but got off on the wrong foot ... trying to start at the current cursor position. I also suppressed the action for empty and continued command lines and changed the name of the variable (though I'm not crazy about the new name).
Code:
  if ( lpki->nKey == VK_RETURN )
   {
     WCHAR szCmd[128] = L"ECHOS ^s";
     if ( GetEnvironmentVariable(L"CMD_POSTFIX", szCmd + 8, 120) && *(lpki->pszCurrent - 1) != L'^' && *lpki->pszLine != 0 )
     {
       INT len = lstrlen(lpki->pszLine);
       csbi.dwCursorPosition.Y = lpki->nHomeRow  + (len / csbi.dwSize.X);
       csbi.dwCursorPosition.X = lpki->nHomeColumn + (len % csbi.dwSize.X);
       SetConsoleCursorPosition(STD_OUT, csbi.dwCursorPosition);
       Command(szCmd, 0);
     }
     return 0;
   }