/* vi:ts=4:sw=4
*
* VIM - Vi IMproved
*
* Code Contributions By: Bram Moolenaar mool@oce.nl
* Tim Thompson twitch!tjt
* Tony Andrews onecom!wldrdg!tony
* G. R. (Fred) Walter watmath!watcgl!grwalter
*/
/*
* message.c: functions for displaying messages on the command line
*/
#include "vim.h"
#include "globals.h"
#define MESSAGE
#include "proto.h"
#include "param.h"
static int msg_invert = FALSE; /* message should be inverted */
/*
* msg(s) - displays the string 's' on the status line
*/
void
msg(s)
char *s;
{
if (Columns == 0) /* terminal not initialized */
{
fprintf(stderr, s);
fflush(stderr);
return;
}
start_msg();
if (msg_invert && T_TI)
{
outstr(T_TI);
char_count -= strlen(T_TI);
}
outtrans(s, -1);
if (msg_invert && T_TP)
{
outstr(T_TP);
msg_invert = FALSE;
char_count -= strlen(T_TP);
}
end_msg();
}
#ifndef PROTO /* automatic prototype generation does not understand this */
/* VARARGS */
void
smsg(s, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
char *s;
long a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11;
{
sprintf(IObuff, s, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
msg(IObuff);
}
#endif
/*
* emsg() - display an error message
*
* Rings the bell, if appropriate, and calls message() to do the real work
*/
void
emsg(s)
char *s;
{
if (p_eb)
beep(); /* also includes flush_buffers() */
else
flush_buffers(FALSE); /* flush internal buffers */
msg_invert = TRUE;
msg(s);
if (char_count < sc_col) /* if wait_return not called */
sleep(1); /* give the user a chance to read the message */
}
void
emsg2(s, a1)
char *s, *a1;
{
sprintf(IObuff, s, a1);
emsg(IObuff);
}
extern int global_busy, global_wait; /* shared with csearch.c, cmdline.c */
void
wait_return(redraw)
int redraw;
{
u_char c;
int oldState;
int tmpState;
/* with the global command we only need one return at the end */
if (global_busy)
{
global_wait = 1;
starttermcap();
return;
}
oldState = State;
State = HITRETURN;
if (got_int)
outstrn("Interrupt: ");
#ifdef ORG_HITRETURN
outstrn("Press RETURN to continue");
do {
c = vgetc();
} while (strchr("\r\n: ", c) == NULL);
if (c == ':') /* this can vi too (but not always!) */
stuffcharReadbuff(c);
#else
outstrn("Press RETURN or enter command to continue");
c = vgetc();
breakcheck();
if (strchr("\r\n ", c) == NULL)
stuffcharReadbuff(c);
#endif
if (!termcap_active) /* start termcap before redrawing */
starttermcap();
/*
* If the window size changed set_winsize() will redraw the screen.
* Otherwise the screen is only redrawn if 'redraw' is set.
*/
tmpState = State;
State = oldState; /* restore State before set_winsize */
if (tmpState == SETWSIZE) /* got resize event while in vgetc() */
set_winsize(0, 0, FALSE);
else if (redraw)
updateScreen(CLEAR);
script_winsize_pp();
}
void
start_msg()
{
gotocmdline(TRUE, NUL);
char_count = 0;
}
void
end_msg()
{
/*
* if the string is larger than the window,
* or the ruler option is set and we run into it,
* we have to redraw the window.
* Do not do this if we are abandoning the file.
*/
if (!exiting && char_count >= sc_col)
{
outchar('\n');
wait_return(TRUE);
}
else
flushbuf();
}
void
check_msg()
{
/*
* if the string is larger than the window,
* or the ruler option is set and we run into it,
* we have to redraw the window later.
*/
if (char_count >= sc_col)
must_redraw = CLEAR;
cmdoffset = char_count / Columns;
}
syntax highlighted by Code2HTML, v. 0.9.1