📄 editcmd.c
字号:
edit_set_markers (edit, 0, 0, 0, 0);
edit->force |= REDRAW_PAGE;
return 0;
}
#ifdef MIDNIGHT
#define INPUT_INDEX 9
#define SEARCH_DLG_HEIGHT 10
#define REPLACE_DLG_HEIGHT 15
#define B_REPLACE_ALL B_USER+1
#define B_SKIP_REPLACE B_USER+2
int edit_replace_prompt (WEdit * edit, char *replace_text, int xpos, int ypos)
{
if (replace_prompt) {
QuickWidget quick_widgets[] =
{
/* NLS for hotkeys? */
{quick_button, 14, 18, 3, 6, "&Cancel", 0, B_CANCEL, 0,
0, XV_WLAY_DONTCARE, NULL},
{quick_button, 9, 18, 3, 6, "Replace &all", 0, B_REPLACE_ALL, 0,
0, XV_WLAY_DONTCARE, NULL},
{quick_button, 6, 18, 3, 6, "&Skip", 0, B_SKIP_REPLACE, 0,
0, XV_WLAY_DONTCARE, NULL},
{quick_button, 2, 18, 3, 6, "&Replace", 0, B_ENTER, 0,
0, XV_WLAY_DONTCARE, NULL},
{quick_label, 2, 50, 2, 6, 0,
0, 0, 0, XV_WLAY_DONTCARE, 0},
{0}};
quick_widgets[4].text = catstrs (_(" Replace with: "), replace_text, 0);
{
QuickDialog Quick_input =
{66, 6, 0, 0, N_(" Replace "),
"[Input Line Keys]", "quick_input", 0 /*quick_widgets */ };
Quick_input.widgets = quick_widgets;
Quick_input.xpos = xpos;
Quick_input.ypos = ypos;
return quick_dialog (&Quick_input);
}
} else
return 0;
}
void edit_replace_dialog (WEdit * edit, char **search_text, char **replace_text, char **arg_order)
{
int treplace_scanf = replace_scanf;
int treplace_regexp = replace_regexp;
int treplace_all = replace_all;
int treplace_prompt = replace_prompt;
int treplace_backwards = replace_backwards;
int treplace_whole = replace_whole;
int treplace_case = replace_case;
char *tsearch_text;
char *treplace_text;
char *targ_order;
QuickWidget quick_widgets[] =
{
{quick_button, 6, 10, 12, REPLACE_DLG_HEIGHT, "&Cancel", 0, B_CANCEL, 0,
0, XV_WLAY_DONTCARE, NULL},
{quick_button, 2, 10, 12, REPLACE_DLG_HEIGHT, "&Ok", 0, B_ENTER, 0,
0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 25, 50, 11, REPLACE_DLG_HEIGHT, "Scanf &expression", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 25, 50, 10, REPLACE_DLG_HEIGHT, "Replace &all", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 25, 50, 9, REPLACE_DLG_HEIGHT, "Pr&ompt on replace", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 4, 50, 11, REPLACE_DLG_HEIGHT, "&Backwards", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 4, 50, 10, REPLACE_DLG_HEIGHT, "&Regular exprssn", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 4, 50, 9, REPLACE_DLG_HEIGHT, "&Whole words only", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 4, 50, 8, REPLACE_DLG_HEIGHT, "Case &sensitive", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_input, 3, 50, 7, REPLACE_DLG_HEIGHT, "", 44, 0, 0,
0, XV_WLAY_BELOWCLOSE, "edit-argord"},
{quick_label, 2, 50, 6, REPLACE_DLG_HEIGHT, " Enter replacement argument order eg. 3,2,1,4 ", 0, 0,
0, 0, XV_WLAY_DONTCARE, 0},
{quick_input, 3, 50, 5, REPLACE_DLG_HEIGHT, "", 44, 0, 0,
0, XV_WLAY_BELOWCLOSE, "edit-replace"},
{quick_label, 2, 50, 4, REPLACE_DLG_HEIGHT, " Enter replacement string", 0, 0, 0,
0, XV_WLAY_DONTCARE, 0},
{quick_input, 3, 50, 3, REPLACE_DLG_HEIGHT, "", 44, 0, 0,
0, XV_WLAY_BELOWCLOSE, "edit-search"},
{quick_label, 2, 50, 2, REPLACE_DLG_HEIGHT, " Enter search string", 0, 0, 0,
0, XV_WLAY_DONTCARE, 0},
{0}};
quick_widgets[2].result = &treplace_scanf;
quick_widgets[3].result = &treplace_all;
quick_widgets[4].result = &treplace_prompt;
quick_widgets[5].result = &treplace_backwards;
quick_widgets[6].result = &treplace_regexp;
quick_widgets[7].result = &treplace_whole;
quick_widgets[8].result = &treplace_case;
quick_widgets[9].str_result = &targ_order;
quick_widgets[9].text = *arg_order;
quick_widgets[11].str_result = &treplace_text;
quick_widgets[11].text = *replace_text;
quick_widgets[13].str_result = &tsearch_text;
quick_widgets[13].text = *search_text;
{
QuickDialog Quick_input =
{50, REPLACE_DLG_HEIGHT, -1, 0, N_(" Replace "),
"[Input Line Keys]", "quick_input", 0 /*quick_widgets */ };
Quick_input.widgets = quick_widgets;
if (quick_dialog (&Quick_input) != B_CANCEL) {
*arg_order = *(quick_widgets[INPUT_INDEX].str_result);
*replace_text = *(quick_widgets[INPUT_INDEX + 2].str_result);
*search_text = *(quick_widgets[INPUT_INDEX + 4].str_result);
replace_scanf = treplace_scanf;
replace_backwards = treplace_backwards;
replace_regexp = treplace_regexp;
replace_all = treplace_all;
replace_prompt = treplace_prompt;
replace_whole = treplace_whole;
replace_case = treplace_case;
return;
} else {
*arg_order = NULL;
*replace_text = NULL;
*search_text = NULL;
return;
}
}
}
void edit_search_dialog (WEdit * edit, char **search_text)
{
int treplace_scanf = replace_scanf;
int treplace_regexp = replace_regexp;
int treplace_whole = replace_whole;
int treplace_case = replace_case;
int treplace_backwards = replace_backwards;
char *tsearch_text;
QuickWidget quick_widgets[] =
{
{quick_button, 6, 10, 7, SEARCH_DLG_HEIGHT, "&Cancel", 0, B_CANCEL, 0,
0, XV_WLAY_DONTCARE, NULL},
{quick_button, 2, 10, 7, SEARCH_DLG_HEIGHT, "&Ok", 0, B_ENTER, 0,
0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 25, 50, 6, SEARCH_DLG_HEIGHT, "Scanf &expression", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL },
{quick_checkbox, 25, 50, 5, SEARCH_DLG_HEIGHT, "&Backwards", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 4, 50, 6, SEARCH_DLG_HEIGHT, "&Regular exprssn", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 4, 50, 5, SEARCH_DLG_HEIGHT, "&Whole words only", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_checkbox, 4, 50, 4, SEARCH_DLG_HEIGHT, "Case &sensitive", 0, 0,
0, 0, XV_WLAY_DONTCARE, NULL},
{quick_input, 3, 50, 3, SEARCH_DLG_HEIGHT, "", 44, 0, 0,
0, XV_WLAY_BELOWCLOSE, "edit-search"},
{quick_label, 2, 50, 2, SEARCH_DLG_HEIGHT, " Enter search string", 0, 0, 0,
0, XV_WLAY_DONTCARE, 0},
{0}};
quick_widgets[2].result = &treplace_scanf;
quick_widgets[3].result = &treplace_backwards;
quick_widgets[4].result = &treplace_regexp;
quick_widgets[5].result = &treplace_whole;
quick_widgets[6].result = &treplace_case;
quick_widgets[7].str_result = &tsearch_text;
quick_widgets[7].text = *search_text;
{
QuickDialog Quick_input =
{50, SEARCH_DLG_HEIGHT, -1, 0, N_(" Search "),
"[Input Line Keys]", "quick_input", 0 /*quick_widgets */ };
Quick_input.widgets = quick_widgets;
if (quick_dialog (&Quick_input) != B_CANCEL) {
*search_text = *(quick_widgets[7].str_result);
replace_scanf = treplace_scanf;
replace_backwards = treplace_backwards;
replace_regexp = treplace_regexp;
replace_whole = treplace_whole;
replace_case = treplace_case;
return;
} else {
*search_text = NULL;
return;
}
}
}
#else
#define B_ENTER 0
#define B_SKIP_REPLACE 1
#define B_REPLACE_ALL 2
#define B_CANCEL 3
extern CWidget *wedit;
void edit_search_replace_dialog (Window parent, int x, int y, char **search_text, char **replace_text, char **arg_order, char *heading, int option)
{
Window win;
XEvent xev;
CEvent cev;
CState s;
int xh, yh, h, xb, ys, yc, yb, yr;
CWidget *m;
CBackupState (&s);
CDisable ("*");
win = CDrawHeadedDialog ("replace", parent, x, y, heading);
CGetHintPos (&xh, &h);
/* NLS hotkey ? */
CIdent ("replace")->position = WINDOW_ALWAYS_RAISED;
/* An input line comes after the ':' */
(CDrawText ("replace.t1", win, xh, h, _(" Enter search text : ")))->hotkey = 'E';
CGetHintPos (0, &yh);
(m = CDrawTextInput ("replace.sinp", win, xh, yh, 10, AUTO_HEIGHT, 256, *search_text))->hotkey = 'E';
if (replace_text) {
CGetHintPos (0, &yh);
(CDrawText ("replace.t2", win, xh, yh, _(" Enter replace text : ")))->hotkey = 'n';
CGetHintPos (0, &yh);
(CDrawTextInput ("replace.rinp", win, xh, yh, 10, AUTO_HEIGHT, 256, *replace_text))->hotkey = 'n';
CGetHintPos (0, &yh);
(CDrawText ("replace.t3", win, xh, yh, _(" Enter argument order : ")))->hotkey = 'o';
CGetHintPos (0, &yh);
(CDrawTextInput ("replace.ainp", win, xh, yh, 10, AUTO_HEIGHT, 256, *arg_order))->hotkey = 'o';
/* Tool hint */
CSetToolHint ("replace.ainp", _("Enter the order of replacement of your scanf format specifiers"));
CSetToolHint ("replace.t3", _("Enter the order of replacement of your scanf format specifiers"));
}
CGetHintPos (0, &yh);
ys = yh;
/* The following are check boxes */
CDrawSwitch ("replace.ww", win, xh, yh, replace_whole, _(" Whole words only "), 0);
CGetHintPos (0, &yh);
CDrawSwitch ("replace.case", win, xh, yh, replace_case, _(" Case sensitive "), 0);
yc = yh;
CGetHintPos (0, &yh);
CDrawSwitch ("replace.reg", win, xh, yh, replace_regexp, _(" Regular expression "), 1);
CSetToolHint ("replace.reg", _("See the regex man page for how to compose a regular expression"));
CSetToolHint ("replace.reg.label", _("See the regex man page for how to compose a regular expression"));
yb = yh;
CGetHintPos (0, &yh);
CGetHintPos (&xb, 0);
if (option & SEARCH_DIALOG_OPTION_BACKWARDS) {
CDrawSwitch ("replace.bkwd", win, xh, yh, replace_backwards, _(" Backwards "), 0);
/* Tool hint */
CSetToolHint ("replace.bkwd", _("Warning: Searching backward can be slow"));
CSetToolHint ("replace.bkwd.label", _("Warning: Searching backward can be slow"));
yb = yh;
}
if (replace_text) {
if (option & SEARCH_DIALOG_OPTION_BACKWARDS)
yr = yc;
else
yr = ys;
} else {
yr = yb;
}
if (replace_text) {
CDrawSwitch ("replace.pr", win, xb, yr, replace_prompt, _(" Prompt on replace "), 0);
/* Tool hint */
CSetToolHint ("replace.pr", _("Ask before making each replacement"));
CGetHintPos (0, &yr);
CDrawSwitch ("replace.all", win, xb, yr, replace_all, _(" Replace all "), 0);
CGetHintPos (0, &yr);
}
CDrawSwitch ("replace.scanf", win, xb, yr, replace_scanf, _(" Scanf expression "), 1);
/* Tool hint */
CSetToolHint ("replace.scanf", _("Allows entering of a C format string, see the scanf man page"));
get_hint_limits (&x, &y);
CDrawPixmapButton ("replace.ok", win, x - WIDGET_SPACING - TICK_BUTTON_WIDTH, h, PIXMAP_BUTTON_TICK);
/* Tool hint */
CSetToolHint ("replace.ok", _("Begin search, Enter"));
CDrawPixmapButton ("replace.cancel", win, x - WIDGET_SPACING - TICK_BUTTON_WIDTH, h + WIDGET_SPACING + TICK_BUTTON_WIDTH, PIXMAP_BUTTON_CROSS);
/* Tool hint */
CSetToolHint ("replace.cancel", _("Abort this dialog, Esc"));
CSetSizeHintPos ("replace");
CMapDialog ("replace");
m = CIdent ("replace");
CSetWidgetSize ("replace.sinp", m->width - WIDGET_SPACING * 3 - 4 - TICK_BUTTON_WIDTH, (CIdent ("replace.sinp"))->height);
if (replace_text) {
CSetWidgetSize ("replace.rinp", m->width - WIDGET_SPACING * 3 - 4 - TICK_BUTTON_WIDTH, (CIdent ("replace.rinp"))->height);
CSetWidgetSize ("replace.ainp", m->width - WIDGET_SPACING * 3 - 4 - TICK_BUTTON_WIDTH, (CIdent ("replace.ainp"))->height);
}
CFocus (CIdent ("replace.sinp"));
for (;;) {
CNextEvent (&xev, &cev);
if (!CIdent ("replace")) {
*search_text = 0;
break;
}
if (!strcmp (cev.ident, "replace.cancel") || cev.command == CK_Cancel) {
*search_text = 0;
break;
}
if (!strcmp (cev.ident, "replace.reg") || !strcmp (cev.ident, "replace.scanf")) {
if (CIdent ("replace.reg")->keypressed || CIdent ("replace.scanf")->keypressed) {
if (!(CIdent ("replace.case")->keypressed)) {
CIdent ("replace.case")->keypressed = 1;
CExpose ("replace.case");
}
}
}
if (!strcmp (cev.ident, "replace.ok") || cev.command == CK_Enter) {
if (replace_text) {
replace_all = CIdent ("replace.all")->keypressed;
replace_prompt = CIdent ("replace.pr")->keypressed;
*replace_text = strdup (CIdent ("replace.rinp")->text);
*arg_order = strdup (CIdent ("replace.ainp")->text);
}
*search_text = strdup (CIdent ("replace.sinp")->text);
replace_whole = CIdent ("replace.ww")->keypressed;
replace_case = CIdent ("replace.case")->keypressed;
replace_scanf = CIdent ("replace.scanf")->keypressed;
replace_regexp = CIdent ("replace.reg")->keypressed;
if (option & SEARCH_DIALOG_OPTION_BACKWARDS) {
replace_backwards = CIdent ("replace.bkwd")->keypressed;
} else {
replace_backwards = 0;
}
break;
}
}
CDestroyWidget ("replace");
CRestoreState (&s);
}
void edit_search_dialog (WEdit * edit, char **search_text)
{
/* Heads the 'Search' dialog box */
edit_search_replace_dialog (WIN_MESSAGES, search_text, 0, 0, _(" Search "), SEARCH_DIALOG_OPTION_BACKWARDS);
}
void edit_replace_dialog (WEdit * edit, char **search_text, char **replace_text, char **arg_order)
{
/* Heads the 'Replace' dialog box */
edit_search_replace_dialog (WIN_MESSAGES, search_text, replace_text, arg_order, _(" Replace "), SEARCH_DIALOG_OPTION_BACKWARDS);
}
int edit_replace_prompt (WEdit * edit, char *replace_text, int xpos, int ypos)
{
if (replace_prompt) {
int q;
char *p, *r = 0;
r = p = malloc (strlen (replace_text) + NUM_REPL_ARGS * 2);
strcpy (p, replace_text);
while ((p = strchr (p, '%'))) { /* convert "%" to "%%" so no convertion is attempted */
memmove (p + 2, p + 1, strlen (p) + 1);
*(++p) = '%';
p++;
}
edit->force |= REDRAW_COMPLETELY;
q = edit_query_dialog4 (_(" Replace "),
/* This is for the confirm replace dialog box. The replaced string comes after the ':' */
catstrs (_(" Replace with: "), r, 0),
/* Buttons for the confirm replace dialog box. */
_("Replace"), _("Skip"), _("Replace all"), _("Cancel"));
if (r)
free (r);
switch (q) {
case 0:
return B_ENTER;
case 1:
return B_SKIP_REPLACE;
case 2:
return B_REPLACE_ALL;
case -1:
case 3:
return B_CANCEL;
}
}
return 0;
}
#endif
long sargs[NUM_REPL_ARGS][256 / sizeof (long)];
#define SCANF_ARGS sargs[0], sargs[1], sargs[2], sargs[3], \
sargs[4], sargs[5], sargs[6], sargs[7], \
sargs[8], sargs[9], sargs[10], sargs[11], \
sargs[12], sargs[13], sargs[14], sargs[15]
#define PRINTF_ARGS sargs[argord[0]], sargs[argord[1]], sargs[argord[2]], sargs[argord[3]], \
sargs[argord[4]], sargs[argord[5]], sargs[argord[6]], sargs[argord[7]], \
sargs[argord[8]], sargs[argord[9]], sargs[argord[10]], sargs[argord[11]], \
sargs[argord[12]], sargs[argord[13]], sargs[argord[14]], sargs[argord[15]]
/* This function is a modification of mc-3.2.10/src/view.c:regexp_view_search() */
/* returns -3 on error in pattern, -1 on not found, found_len = 0 if either */
int string_regexp_search (char *pattern, char *string, int len, int match_type, int match_bol, int icase, int *found_len)
{
static regex_t r;
regmatch_t pmatch[1];
static char *old_pattern = NULL;
static int old_type, old_icase;
if (!old_pattern || strcmp (old_pattern, pattern) || old_type != match_type || old_icase != icase) {
if (old_pattern) {
regfree (&r);
free (old_pattern);
old_pattern = 0;
}
if (regcomp (&r, pattern, REG_EXTENDED | (icase ? REG_ICASE : 0))) {
*found_len = 0;
return -3;
}
old_pattern = strdup (pattern);
old_type = match_type;
old_icase = icase;
}
if (regexec (&r, string, 1, pmatch, ((match_bol || match_type != match_normal) ? 0 : REG_NOTBOL)) != 0) {
*found_len = 0;
return -1;
}
*found_len = pmatch[0].rm_eo - pmatch[0].rm_so;
return (pmatch[0].rm_so);
}
/* thanks to Liviu Daia <daia@stoilow.imar.ro> for getting this
(and the above) routines to work properly - paul */
long edit_find_string (long start, unsigned char *exp, int *len, long last_byte, int (*get_byte) (void *, long), void *data, int once_only)
{
long p, q = 0;
long l = strlen ((char *) exp), f = 0;
int n = 0;
for (p = 0; p < l; p++) /* count conversions... */
if (exp[p] == '%')
if (exp[++p] != '%') /* ...except for "%%" */
n++;
if (replace_scanf || replace_regexp) {
int c;
unsigned char *buf;
unsigned char mbuf[MAX_REPL_LEN * 2 + 3];
replace_scanf = (!replace_regexp); /* can't have both */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -