global.c 38.4 KB
Newer Older
Chris Allegretta's avatar
Chris Allegretta committed
1
/* $Id$ */
Chris Allegretta's avatar
Chris Allegretta committed
2
3
4
/**************************************************************************
 *   global.c                                                             *
 *                                                                        *
5
 *   Copyright (C) 1999-2004 Chris Allegretta                             *
Chris Allegretta's avatar
Chris Allegretta committed
6
7
 *   This program is free software; you can redistribute it and/or modify *
 *   it under the terms of the GNU General Public License as published by *
8
 *   the Free Software Foundation; either version 2, or (at your option)  *
Chris Allegretta's avatar
Chris Allegretta committed
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *   any later version.                                                   *
 *                                                                        *
 *   This program is distributed in the hope that it will be useful,      *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of       *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
 *   GNU General Public License for more details.                         *
 *                                                                        *
 *   You should have received a copy of the GNU General Public License    *
 *   along with this program; if not, write to the Free Software          *
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.            *
 *                                                                        *
 **************************************************************************/

#include "config.h"
23

24
#include <stdlib.h>
25
#include <assert.h>
26
#include <sys/stat.h>
Chris Allegretta's avatar
Chris Allegretta committed
27
#include "proto.h"
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
28
#include "nano.h"
Chris Allegretta's avatar
Chris Allegretta committed
29

Chris Allegretta's avatar
Chris Allegretta committed
30
/* Global variables */
31

32
#ifndef DISABLE_WRAPJUSTIFY
33
34
35
/* wrap_at might be set in rcfile.c or nano.c. */
ssize_t wrap_at = -CHARS_FROM_EOL;	/* Right justified fill value,
					   allows resize */
36
37
#endif

Chris Allegretta's avatar
Chris Allegretta committed
38
39
40
41
char *last_search = NULL;	/* Last string we searched for */
char *last_replace = NULL;	/* Last replacement string */
int search_last_line;		/* Is this the last search line? */

42
long flags = 0;			/* Our flag containing many options */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
43
WINDOW *edit;			/* The file portion of the editor */
Chris Allegretta's avatar
Chris Allegretta committed
44
45
WINDOW *topwin;			/* Top line of screen */
WINDOW *bottomwin;		/* Bottom buffer */
Chris Allegretta's avatar
Chris Allegretta committed
46
char *filename = NULL;		/* Name of the file */
47
48
49
50
51

#ifndef NANO_SMALL
struct stat originalfilestat;	/* Stat for the file as we loaded it */
#endif

Chris Allegretta's avatar
Chris Allegretta committed
52
53
54
55
56
57
58
59
60
61
62
63
64
int editwinrows = 0;		/* How many rows long is the edit
				   window? */
filestruct *current;		/* Current buffer pointer */
int current_x = 0, current_y = 0;	/* Current position of X and Y in
					   the editor - relative to edit
					   window (0,0) */
filestruct *fileage = NULL;	/* Our file buffer */
filestruct *edittop = NULL;	/* Pointer to the top of the edit
				   buffer with respect to the
				   file struct */
filestruct *filebot = NULL;	/* Last node in the file struct */
filestruct *cutbuffer = NULL;	/* A place to store cut text */

65
#ifdef ENABLE_MULTIBUFFER
66
openfilestruct *open_files = NULL;	/* The list of open files */
67
68
#endif

69
70
71
72
73
74
#if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
char *whitespace = NULL;	/* Characters used when displaying
				   the first characters of tabs and
				   spaces. */
#endif

75
#ifndef DISABLE_JUSTIFY
76
77
78
79
80
char *punct = NULL;		/* Closing punctuation that can end
				   sentences. */
char *brackets = NULL;		/* Closing brackets that can follow
				   closing punctuation and can end
				   sentences. */
Chris Allegretta's avatar
Chris Allegretta committed
81
82
char *quotestr = NULL;		/* Quote string.  The default value is
				   set in main(). */
83
84
85
86
87
88
89
#ifdef HAVE_REGEX_H
regex_t quotereg;		/* Compiled quotestr regular expression. */
int quoterc;			/* Did it compile? */
char *quoteerr = NULL;		/* The error message. */
#else
size_t quotelen;		/* strlen(quotestr) */
#endif
Chris Allegretta's avatar
Chris Allegretta committed
90
#endif
91

92
93
94
95
#ifndef NANO_SMALL
char *backup_dir = NULL;	/* Backup directory. */
#endif

96
97
int resetstatuspos;		/* Hack for resetting the status bar 
				   cursor position */
Chris Allegretta's avatar
Chris Allegretta committed
98
char *answer = NULL;		/* Answer str to many questions */
Chris Allegretta's avatar
Chris Allegretta committed
99
int totlines = 0;		/* Total number of lines in the file */
100
long totsize = 0;		/* Total number of bytes in the file */
101
size_t placewewant = 0;		/* The column we'd like the cursor
Chris Allegretta's avatar
Chris Allegretta committed
102
103
104
				   to jump to when we go to the
				   next or previous line */

105
106
ssize_t tabsize = -1;		/* Our internal tabsize variable.  The
				   default value is set in main(). */
107

Chris Allegretta's avatar
Chris Allegretta committed
108
char *hblank = NULL;		/* A horizontal blank line */
Chris Allegretta's avatar
Chris Allegretta committed
109
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
110
char *help_text;		/* The text in the help window */
Chris Allegretta's avatar
Chris Allegretta committed
111
#endif
Chris Allegretta's avatar
Chris Allegretta committed
112
113
114

/* More stuff for the marker select */

Chris Allegretta's avatar
Chris Allegretta committed
115
#ifndef NANO_SMALL
116
filestruct *mark_beginbuf;	/* The begin marker buffer */
Chris Allegretta's avatar
Chris Allegretta committed
117
int mark_beginx;		/* X value in the string to start */
Chris Allegretta's avatar
Chris Allegretta committed
118
#endif
Chris Allegretta's avatar
Chris Allegretta committed
119

120
#ifndef DISABLE_OPERATINGDIR
121
122
char *operating_dir = NULL;	/* Operating directory, which we can't */
char *full_operating_dir = NULL;/* go higher than */
123
124
#endif

125
#ifndef DISABLE_SPELLER
126
char *alt_speller = NULL;		/* Alternative spell command */
127
128
#endif

129
130
131
shortcut *main_list = NULL;
shortcut *whereis_list = NULL;
shortcut *replace_list = NULL;
132
shortcut *replace_list_2 = NULL; 	/* 2nd half of replace dialog */
133
134
135
shortcut *goto_list = NULL;
shortcut *writefile_list = NULL;
shortcut *insertfile_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
136
#ifndef DISABLE_HELP
137
shortcut *help_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
138
139
#endif
#ifndef DISABLE_SPELLER
140
shortcut *spell_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
141
#endif
Chris Allegretta's avatar
Chris Allegretta committed
142
#ifndef NANO_SMALL
143
shortcut *extcmd_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
144
#endif
145
#ifndef DISABLE_BROWSER
146
shortcut *browser_list = NULL;
147
shortcut *gotodir_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
148
#endif
149

150
#ifdef ENABLE_COLOR
151
152
153
const colortype *colorstrings = NULL;
syntaxtype *syntaxes = NULL;
char *syntaxstr = NULL;
154
155
#endif

156
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || !defined(DISABLE_MOUSE)
Chris Allegretta's avatar
Chris Allegretta committed
157
const shortcut *currshortcut;	/* Current shortcut list we're using */
158
#endif
159

160
#ifndef NANO_SMALL
161
toggle *toggles = NULL;
162
#endif
Chris Allegretta's avatar
Chris Allegretta committed
163

164
165
166
167
168
#ifndef NANO_SMALL
historyheadtype search_history;
historyheadtype replace_history;
#endif

169
170
/* Regular expressions */

171
#ifdef HAVE_REGEX_H
172
173
174
regex_t search_regexp;		/* Global to store compiled search regexp */
regmatch_t regmatches[10];	/* Match positions for parenthetical
				   subexpressions, max of 10 */
Chris Allegretta's avatar
Chris Allegretta committed
175
#endif
176

177
bool curses_ended = FALSE;	/* Indicates to statusbar() to simply
178
179
180
				 * write to stderr, since endwin() has
				 * ended curses mode. */

181
size_t length_of_list(const shortcut *s)
182
{
183
    size_t i = 0;
184

185
    for (; s != NULL; s = s->next)
186
187
188
189
	i++;
    return i;
}

Chris Allegretta's avatar
Chris Allegretta committed
190
/* Initialize a struct *without* our lovely braces =( */
191
void sc_init_one(shortcut **shortcutage, int ctrlval, const char *desc,
192
#ifndef DISABLE_HELP
193
	const char *help,
194
#endif
195
	int metaval, int funcval, int miscval, int view, void
196
	(*func)(void))
Chris Allegretta's avatar
Chris Allegretta committed
197
{
198
199
200
    shortcut *s;

    if (*shortcutage == NULL) {
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
201
	*shortcutage = (shortcut *)nmalloc(sizeof(shortcut));
202
203
204
205
	s = *shortcutage;
    } else {
	for (s = *shortcutage; s->next != NULL; s = s->next)
	    ;
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
206
	s->next = (shortcut *)nmalloc(sizeof(shortcut));
207
208
209
	s = s->next; 
    }

210
    s->ctrlval = ctrlval;
211
    s->desc = _(desc);
212
#ifndef DISABLE_HELP
213
    s->help = _(help);
214
#endif
215
216
217
    s->metaval = metaval;
    s->funcval = funcval;
    s->miscval = miscval;
Chris Allegretta's avatar
Chris Allegretta committed
218
219
    s->viewok = view;
    s->func = func;
220
    s->next = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
221
222
}

223
void shortcut_init(int unjustify)
224
{
225
226
227
228
229
230
231
232
233
234
235
236
237
238
    const char *get_help_msg = N_("Get Help");
    const char *exit_msg = N_("Exit");
    const char *prev_page_msg = N_("Prev Page");
    const char *next_page_msg = N_("Next Page");
    const char *replace_msg = N_("Replace");
    const char *go_to_line_msg = N_("Go To Line");
    const char *cancel_msg = N_("Cancel");
    const char *first_line_msg = N_("First Line");
    const char *last_line_msg = N_("Last Line");
#ifndef NANO_SMALL
    const char *case_sens_msg = N_("Case Sens");
    const char *direction_msg = N_("Direction");
#ifdef HAVE_REGEX_H
    const char *regexp_msg = N_("Regexp");
239
#endif
240
241
242
243
    const char *history_msg = N_("History");
#endif /* !NANO_SMALL */
#ifndef DISABLE_BROWSER
    const char *to_files_msg = N_("To Files");
244
#endif
245

246
247
248
#ifndef DISABLE_HELP
    const char *nano_help_msg = N_("Invoke the help menu");
    const char *nano_exit_msg =
249
#ifdef ENABLE_MULTIBUFFER
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
	N_("Close currently loaded file/Exit from nano")
#else
   	N_("Exit from nano")
#endif
	;
    const char *nano_writeout_msg = N_("Write the current file to disk");
    const char *nano_justify_msg = N_("Justify the current paragraph");
    const char *nano_insert_msg =
	N_("Insert another file into the current one");
    const char *nano_whereis_msg = N_("Search for text within the editor");
    const char *nano_prevpage_msg = N_("Move to the previous screen");
    const char *nano_nextpage_msg = N_("Move to the next screen");
    const char *nano_cut_msg =
	N_("Cut the current line and store it in the cutbuffer");
    const char *nano_uncut_msg =
	N_("Uncut from the cutbuffer into the current line");
    const char *nano_cursorpos_msg = N_("Show the position of the cursor");
    const char *nano_spell_msg = N_("Invoke the spell checker, if available");
    const char *nano_goto_msg = N_("Go to a specific line number");
    const char *nano_replace_msg = N_("Replace text within the editor");
    const char *nano_prevline_msg = N_("Move to the previous line");
    const char *nano_nextline_msg = N_("Move to the next line");
    const char *nano_forward_msg = N_("Move forward one character");
    const char *nano_back_msg = N_("Move back one character");
    const char *nano_home_msg = N_("Move to the beginning of the current line");
    const char *nano_end_msg = N_("Move to the end of the current line");
    const char *nano_refresh_msg = N_("Refresh (redraw) the current screen");
    const char *nano_mark_msg = N_("Mark text at the current cursor location");
    const char *nano_delete_msg = N_("Delete the character under the cursor");
    const char *nano_backspace_msg =
	N_("Delete the character to the left of the cursor");
    const char *nano_tab_msg = N_("Insert a tab character");
    const char *nano_enter_msg =
	N_("Insert a carriage return at the cursor position");
284
#ifndef NANO_SMALL
285
286
    const char *nano_nextword_msg = N_("Move forward one word");
    const char *nano_prevword_msg = N_("Move backward one word");
287
#endif
288
    const char *nano_verbatim_msg = N_("Insert character(s) verbatim");
289
#ifdef ENABLE_MULTIBUFFER
290
291
292
    const char *nano_openprev_msg = N_("Switch to previous file buffer");
    const char *nano_opennext_msg = N_("Switch to next file buffer");
#endif
293
294
#ifndef NANO_SMALL
#ifdef HAVE_REGEX_H
295
296
297
    const char *nano_bracket_msg = N_("Find other bracket");
#endif
    const char *nano_whereis_next_msg = N_("Repeat last search");
298
#endif
299
300
301
    const char *nano_cancel_msg = N_("Cancel the current function");
    const char *nano_firstline_msg = N_("Go to the first line of the file");
    const char *nano_lastline_msg = N_("Go to the last line of the file");
302
#ifndef DISABLE_JUSTIFY
303
304
305
306
307
    const char *nano_parabegin_msg =
	N_("Go to the beginning of the current paragraph");
    const char *nano_paraend_msg =
	N_("Go to the end of the current paragraph");
    const char *nano_fulljustify_msg = N_("Justify the entire file");
308
#endif
309
310
311
312
313
314
315
#ifndef NANO_SMALL
    const char *nano_case_msg =
	N_("Make the current search/replace case (in)sensitive");
    const char *nano_reverse_msg =
	N_("Make the current search/replace go backwards");
#ifdef HAVE_REGEX_H
    const char *nano_regexp_msg = N_("Use regular expressions");
316
#endif
317
318
    const char *nano_editstr_msg =
	N_("Edit the previous search/replace strings");
319
#endif /* !NANO_SMALL */
320

321
322
#ifndef DISABLE_BROWSER
    const char *nano_tofiles_msg = N_("Go to file browser");
Chris Allegretta's avatar
Chris Allegretta committed
323
#endif
324
325
326
#ifndef NANO_SMALL
    const char *nano_dos_msg = N_("Write file out in DOS format");
    const char *nano_mac_msg = N_("Write file out in Mac format");
327
#endif
328
329
330
331
332
    const char *nano_append_msg = N_("Append to the current file");
    const char *nano_prepend_msg = N_("Prepend to the current file");
#ifndef NANO_SMALL
    const char *nano_backup_msg = N_("Back up original file when saving");
    const char *nano_execute_msg = N_("Execute external command");
333
#endif
334
335
336
337
#if defined(ENABLE_MULTIBUFFER) && !defined(NANO_SMALL)
    const char *nano_multibuffer_msg = N_("Insert into new buffer");
#endif
#ifndef DISABLE_BROWSER
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
338
339
    const char *nano_exitbrowser_msg = N_("Exit from the file browser");
    const char *nano_gotodir_msg = N_("Go to directory");
Chris Allegretta's avatar
Chris Allegretta committed
340
#endif
341
#endif /* !DISABLE_HELP */
Chris Allegretta's avatar
Chris Allegretta committed
342

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
343
344
345
/* The following macro is to be used in calling sc_init_one().  The
 * point is that sc_init_one() takes 9 arguments, unless DISABLE_HELP is
 * defined, when the 4th one should not be there. */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
346
#ifndef DISABLE_HELP
347
#  define IFHELP(help, nextvar) help, nextvar
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
348
349
#else
#  define IFHELP(help, nextvar) nextvar
350
#endif
351

352
353
    free_shortcutage(&main_list);

354
    /* Translators: try to keep this string under 10 characters long */
355
356
357
    sc_init_one(&main_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
358
359
360
361
362
363
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
364

365
#ifdef ENABLE_MULTIBUFFER
366
    if (open_files != NULL && (open_files->prev != NULL || open_files->next != NULL))
367
    /* Translators: try to keep this string under 10 characters long */
368
	sc_init_one(&main_list, NANO_EXIT_KEY, N_("Close"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
369
370
		IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
		NANO_NO_KEY, VIEW, do_exit);
371
372
    else
#endif
373
    /* Translators: try to keep this string under 10 characters long */
374
	sc_init_one(&main_list, NANO_EXIT_KEY, exit_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
375
376
		IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
		NANO_NO_KEY, VIEW, do_exit);
Chris Allegretta's avatar
Chris Allegretta committed
377

378
    /* Translators: try to keep this string under 10 characters long */
379
380
381
    sc_init_one(&main_list, NANO_WRITEOUT_KEY, N_("WriteOut"),
	IFHELP(nano_writeout_msg, NANO_NO_KEY), NANO_WRITEOUT_FKEY,
	NANO_NO_KEY, NOVIEW, do_writeout_void);
Chris Allegretta's avatar
Chris Allegretta committed
382

383
    /* Translators: try to keep this string under 10 characters long */
384
385
386
    sc_init_one(&main_list, NANO_JUSTIFY_KEY, N_("Justify"),
	IFHELP(nano_justify_msg, NANO_NO_KEY),
	NANO_JUSTIFY_FKEY, NANO_NO_KEY, NOVIEW,
387
#ifndef DISABLE_JUSTIFY
388
		do_justify_void
389
390
391
392
#else
		nano_disabled_msg
#endif
		);
393

394
395
396
397
398
    /* We allow inserting files in view mode if multibuffers are
     * available, so that we can view multiple files. */
    /* If we're using restricted mode, inserting files is disabled since
     * it allows reading from or writing to files not specified on the
     * command line. */
399
    /* Translators: try to keep this string under 10 characters long */
400
401
402
    sc_init_one(&main_list, NANO_INSERTFILE_KEY, N_("Read File"),
	IFHELP(nano_insert_msg, NANO_NO_KEY), NANO_INSERTFILE_FKEY,
	NANO_NO_KEY,
403
#ifdef ENABLE_MULTIBUFFER
404
		VIEW
405
#else
406
		NOVIEW
407
#endif
408
		, !ISSET(RESTRICTED) ? do_insertfile_void : nano_disabled_msg);
Chris Allegretta's avatar
Chris Allegretta committed
409

410
    /* Translators: try to keep this string under 10 characters long */
411
412
413
    sc_init_one(&main_list, NANO_WHEREIS_KEY, N_("Where Is"),
	IFHELP(nano_whereis_msg, NANO_NO_KEY), NANO_WHEREIS_FKEY,
	NANO_NO_KEY, VIEW, do_search);
Chris Allegretta's avatar
Chris Allegretta committed
414

415
    /* Translators: try to keep this string under 10 characters long */
416
417
418
    sc_init_one(&main_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
	NANO_NO_KEY, VIEW, do_page_up);
Chris Allegretta's avatar
Chris Allegretta committed
419

420
    /* Translators: try to keep this string under 10 characters long */
421
422
423
    sc_init_one(&main_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
	NANO_NO_KEY, VIEW, do_page_down);
Chris Allegretta's avatar
Chris Allegretta committed
424

425
    /* Translators: try to keep this string under 10 characters long */
426
427
428
    sc_init_one(&main_list, NANO_CUT_KEY, N_("Cut Text"),
	IFHELP(nano_cut_msg, NANO_NO_KEY), NANO_CUT_FKEY,
	NANO_NO_KEY, NOVIEW, do_cut_text);
Chris Allegretta's avatar
Chris Allegretta committed
429

430
    if (unjustify)
431
    /* Translators: try to keep this string under 10 characters long */
432
433
	sc_init_one(&main_list, NANO_UNJUSTIFY_KEY, N_("UnJustify"),
		IFHELP(NULL, NANO_NO_KEY), NANO_UNJUSTIFY_FKEY,
434
		NANO_NO_KEY, NOVIEW, 0);
435
    else
436
    /* Translators: try to keep this string under 10 characters long */
437
	sc_init_one(&main_list, NANO_UNCUT_KEY, N_("UnCut Txt"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
438
439
		IFHELP(nano_uncut_msg, NANO_NO_KEY), NANO_UNCUT_FKEY,
		NANO_NO_KEY, NOVIEW, do_uncut_text);
Chris Allegretta's avatar
Chris Allegretta committed
440

441
    /* Translators: try to keep this string under 10 characters long */
442
443
444
    sc_init_one(&main_list, NANO_CURSORPOS_KEY, N_("Cur Pos"),
	IFHELP(nano_cursorpos_msg, NANO_NO_KEY), NANO_CURSORPOS_FKEY,
	NANO_NO_KEY, VIEW, do_cursorpos_void);
Chris Allegretta's avatar
Chris Allegretta committed
445

446
447
448
    /* If we're using restricted mode, spell checking is disabled
     * because it allows reading from or writing to files not specified
     * on the command line. */
449
    /* Translators: try to keep this string under 10 characters long */
450
    sc_init_one(&main_list, NANO_SPELL_KEY, N_("To Spell"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
451
		IFHELP(nano_spell_msg, NANO_NO_KEY), NANO_SPELL_FKEY,
452
453
454
455
456
		NANO_NO_KEY, NOVIEW,
#ifndef DISABLE_SPELLER
		!ISSET(RESTRICTED) ? do_spell :
#endif
		nano_disabled_msg);
457

458
459
460
    sc_init_one(&main_list, NANO_GOTO_KEY, go_to_line_msg,
	IFHELP(nano_goto_msg, NANO_ALT_GOTO_KEY), NANO_GOTO_FKEY,
	NANO_NO_KEY, VIEW, do_gotoline_void);
461

462
463
464
    sc_init_one(&main_list, NANO_REPLACE_KEY, replace_msg,
	IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY), NANO_REPLACE_FKEY,
	NANO_NO_KEY, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
465

466
467
468
    sc_init_one(&main_list, NANO_PREVLINE_KEY, N_("Prev Line"),
	IFHELP(nano_prevline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_up);
Chris Allegretta's avatar
Chris Allegretta committed
469

470
471
472
    sc_init_one(&main_list, NANO_NEXTLINE_KEY, N_("Next Line"),
	IFHELP(nano_nextline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_down);
Chris Allegretta's avatar
Chris Allegretta committed
473

474
475
476
    sc_init_one(&main_list, NANO_FORWARD_KEY, N_("Forward"),
	IFHELP(nano_forward_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_right_void);
Chris Allegretta's avatar
Chris Allegretta committed
477

478
479
480
    sc_init_one(&main_list, NANO_BACK_KEY, N_("Back"),
	IFHELP(nano_back_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_left_void);
Chris Allegretta's avatar
Chris Allegretta committed
481

482
483
484
    sc_init_one(&main_list, NANO_HOME_KEY, N_("Home"),
	IFHELP(nano_home_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_home);
Chris Allegretta's avatar
Chris Allegretta committed
485

486
487
488
    sc_init_one(&main_list, NANO_END_KEY, N_("End"),
	IFHELP(nano_end_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_end);
Chris Allegretta's avatar
Chris Allegretta committed
489

490
491
492
    sc_init_one(&main_list, NANO_REFRESH_KEY, N_("Refresh"),
	IFHELP(nano_refresh_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, total_refresh);
Chris Allegretta's avatar
Chris Allegretta committed
493

494
495
496
    sc_init_one(&main_list, NANO_MARK_KEY, N_("Mark Text"),
	IFHELP(nano_mark_msg, NANO_ALT_MARK_KEY),
	NANO_NO_KEY, NANO_NO_KEY, NOVIEW,
497
498
499
500
501
502
#ifndef NANO_SMALL
		do_mark
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
503

504
505
506
    sc_init_one(&main_list, NANO_DELETE_KEY, N_("Delete"),
	IFHELP(nano_delete_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_delete);
Chris Allegretta's avatar
Chris Allegretta committed
507

508
509
510
    sc_init_one(&main_list, NANO_BACKSPACE_KEY, N_("Backspace"),
	IFHELP(nano_backspace_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_backspace);
Chris Allegretta's avatar
Chris Allegretta committed
511

512
513
514
    sc_init_one(&main_list, NANO_TAB_KEY, N_("Tab"),
	IFHELP(nano_tab_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_tab);
Chris Allegretta's avatar
Chris Allegretta committed
515

516
517
518
    sc_init_one(&main_list, NANO_ENTER_KEY, N_("Enter"),
	IFHELP(nano_enter_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_enter);
519

520
#ifndef NANO_SMALL
521
522
523
    sc_init_one(&main_list, NANO_NEXTWORD_KEY, N_("Next Word"),
	IFHELP(nano_nextword_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_next_word);
524

525
526
527
    sc_init_one(&main_list, NANO_NO_KEY, N_("Prev Word"),
	IFHELP(nano_prevword_msg, NANO_PREVWORD_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_prev_word);
528
#endif
529

530
531
532
    sc_init_one(&main_list, NANO_NO_KEY, N_("Verbatim Input"),
	IFHELP(nano_verbatim_msg, NANO_VERBATIM_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_verbatim_input);
533

534
#ifdef ENABLE_MULTIBUFFER
535
536
537
    sc_init_one(&main_list, NANO_NO_KEY, N_("Previous File"),
	IFHELP(nano_openprev_msg, NANO_OPENPREV_KEY), NANO_NO_KEY,
	NANO_OPENPREV_ALTKEY, VIEW, open_prevfile_void);
538

539
540
541
    sc_init_one(&main_list, NANO_NO_KEY, N_("Next File"),
	IFHELP(nano_opennext_msg, NANO_OPENNEXT_KEY), NANO_NO_KEY,
	NANO_OPENNEXT_ALTKEY, VIEW, open_nextfile_void);
542
#endif
543

544
545
#ifndef NANO_SMALL
#ifdef HAVE_REGEX_H
546
547
548
    sc_init_one(&main_list, NANO_NO_KEY, N_("Find Other Bracket"),
	IFHELP(nano_bracket_msg, NANO_BRACKET_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_find_bracket);
549
550
#endif

551
552
553
    sc_init_one(&main_list, NANO_NO_KEY, N_("Where Is Next"),
	IFHELP(nano_whereis_next_msg, NANO_WHEREIS_NEXT_KEY),
	NANO_NO_KEY, NANO_NO_KEY, VIEW, do_research);
554
#endif
555

556
    free_shortcutage(&whereis_list);
557

558
559
560
    sc_init_one(&whereis_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
561
562
563
564
565
566
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
567

568
    /* Translators: try to keep this string under 10 characters long */
569
570
571
    sc_init_one(&whereis_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
572

573
    /* Translators: try to keep this string under 10 characters long */
574
575
576
    sc_init_one(&whereis_list, NANO_FIRSTLINE_KEY, first_line_msg,
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_FIRSTLINE_FKEY,
	NANO_NO_KEY, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
577

578
    /* Translators: try to keep this string under 10 characters long */
579
580
581
    sc_init_one(&whereis_list, NANO_LASTLINE_KEY, last_line_msg,
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_LASTLINE_FKEY,
	NANO_NO_KEY, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
582

583
    /* Translators: try to keep this string under 10 characters long */
584
585
586
    sc_init_one(&whereis_list, NANO_OTHERSEARCH_KEY, replace_msg,
	IFHELP(nano_replace_msg, NANO_NO_KEY), NANO_REPLACE_FKEY,
	NANO_NO_KEY, VIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
587

588
    /* Translators: try to keep this string under 10 characters long */
589
590
591
    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, go_to_line_msg,
	IFHELP(nano_goto_msg, NANO_NO_KEY), NANO_GOTO_FKEY,
	NANO_NO_KEY, VIEW, do_gotoline_void);
592

593
594
#ifndef DISABLE_JUSTIFY
    /* Translators: try to keep this string under 10 characters long */
595
596
597
    sc_init_one(&whereis_list, NANO_PARABEGIN_KEY, N_("Beg of Par"),
	IFHELP(nano_parabegin_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_para_begin);
598
599

    /* Translators: try to keep this string under 10 characters long */
600
601
602
    sc_init_one(&whereis_list, NANO_PARAEND_KEY, N_("End of Par"),
	IFHELP(nano_paraend_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_para_end);
603
604

    /* Translators: try to keep this string under 10 characters long */
605
606
607
    sc_init_one(&whereis_list, NANO_FULLJUSTIFY_KEY, N_("FullJstify"),
	IFHELP(nano_fulljustify_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, NOVIEW, do_full_justify);
608
609
#endif

610
#ifndef NANO_SMALL
611
    /* Translators: try to keep this string under 10 characters long */
612
613
614
    sc_init_one(&whereis_list, NANO_NO_KEY, case_sens_msg,
	IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
615

616
    /* Translators: try to keep this string under 10 characters long */
617
618
619
    sc_init_one(&whereis_list, NANO_NO_KEY, direction_msg,
	IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
620

621
#ifdef HAVE_REGEX_H
622
    /* Translators: try to keep this string under 10 characters long */
623
624
625
    sc_init_one(&whereis_list, NANO_NO_KEY, regexp_msg,
	IFHELP(nano_regexp_msg, TOGGLE_REGEXP_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
626
#endif
627
628

#ifndef NANO_SMALL
629
    /* Translators: try to keep this string under 10 characters long */
630
631
632
    sc_init_one(&whereis_list, NANO_HISTORY_KEY, history_msg,
	IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
633
634
#endif

635
#endif /* !NANO_SMALL */
636

637
    free_shortcutage(&replace_list);
638

639
640
641
    sc_init_one(&replace_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
642
643
644
645
646
647
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
648

649
650
651
    sc_init_one(&replace_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
652

653
654
655
    sc_init_one(&replace_list, NANO_FIRSTLINE_KEY, first_line_msg,
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_FIRSTLINE_FKEY,
	NANO_NO_KEY, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
656

657
658
659
    sc_init_one(&replace_list, NANO_LASTLINE_KEY, last_line_msg,
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_LASTLINE_FKEY,
	NANO_NO_KEY, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
660

661
    /* Translators: try to keep this string under 12 characters long */
662
663
664
    sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, N_("No Replace"),
	IFHELP(nano_whereis_msg, NANO_NO_KEY), NANO_REPLACE_FKEY,
	NANO_NO_KEY, VIEW, do_search);
Chris Allegretta's avatar
Chris Allegretta committed
665

666
667
668
    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY, go_to_line_msg,
	IFHELP(nano_goto_msg, NANO_NO_KEY), NANO_GOTO_FKEY,
	NANO_NO_KEY, VIEW, do_gotoline_void);
669

670
#ifndef NANO_SMALL
671
672
673
    sc_init_one(&replace_list, NANO_NO_KEY, case_sens_msg,
	IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
674

675
676
677
    sc_init_one(&replace_list, NANO_NO_KEY, direction_msg,
	IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
678

679
#ifdef HAVE_REGEX_H
680
681
682
    sc_init_one(&replace_list, NANO_NO_KEY, regexp_msg,
	IFHELP(nano_regexp_msg, TOGGLE_REGEXP_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
683
#endif
684

685
686
687
    sc_init_one(&replace_list, NANO_HISTORY_KEY, history_msg,
	IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
688
#endif /* !NANO_SMALL */
689

690
    free_shortcutage(&replace_list_2);
691

692
693
694
    sc_init_one(&replace_list_2, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
695
696
697
698
699
700
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
701

702
703
704
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
705

706
707
708
    sc_init_one(&replace_list_2, NANO_FIRSTLINE_KEY, first_line_msg,
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_first_line);
709

710
711
712
    sc_init_one(&replace_list_2, NANO_LASTLINE_KEY, last_line_msg,
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_last_line);
713

714
#ifndef NANO_SMALL
715
716
717
    sc_init_one(&replace_list_2, NANO_HISTORY_KEY, history_msg,
	IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
718
719
#endif

720
    free_shortcutage(&goto_list);
Chris Allegretta's avatar
Chris Allegretta committed
721

722
723
724
    sc_init_one(&goto_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
725
726
727
728
729
730
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
731

732
733
734
    sc_init_one(&goto_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
735

736
737
738
    sc_init_one(&goto_list, NANO_FIRSTLINE_KEY, first_line_msg,
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
739

740
741
742
    sc_init_one(&goto_list, NANO_LASTLINE_KEY, last_line_msg,
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
743

Chris Allegretta's avatar
Chris Allegretta committed
744
#ifndef DISABLE_HELP
745
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
746

747
748
749
    sc_init_one(&help_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
750

751
752
753
    sc_init_one(&help_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
	NANO_NO_KEY, VIEW, 0);
754

755
756
757
    sc_init_one(&help_list, NANO_PREVLINE_KEY, N_("Prev Line"),
	IFHELP(nano_prevline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
758

759
760
761
    sc_init_one(&help_list, NANO_NEXTLINE_KEY, N_("Next Line"),
	IFHELP(nano_nextline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
762

763
764
765
    sc_init_one(&help_list, NANO_EXIT_KEY, exit_msg,
	IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
766
#endif
Chris Allegretta's avatar
Chris Allegretta committed
767

768
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
769

770
771
772
    sc_init_one(&writefile_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
773
774
775
776
777
778
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
779

780
781
782
783
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);

784
#ifndef DISABLE_BROWSER
785
786
    /* If we're using restricted mode, the file browser is disabled.
     * It's useless since inserting files is disabled. */
787
    /* Translators: try to keep this string under 16 characters long */
788
    if (!ISSET(RESTRICTED))
789
	sc_init_one(&writefile_list, NANO_TOFILES_KEY, to_files_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
790
791
		IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
792
#endif
Chris Allegretta's avatar
Chris Allegretta committed
793

794
#ifndef NANO_SMALL
795
796
797
798
799
800
    /* If we're using restricted mode, the DOS format, Mac format,
     * append, prepend, and backup toggles are disabled.  The first and
     * second are useless since inserting files is disabled, the third
     * and fourth are disabled because they allow writing to files not
     * specified on the command line, and the fifth is useless since
     * backups are disabled. */
801
    /* Translators: try to keep this string under 16 characters long */
802
    if (!ISSET(RESTRICTED))
803
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("DOS Format"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
804
805
		IFHELP(nano_dos_msg, TOGGLE_DOS_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
806

807
    /* Translators: try to keep this string under 16 characters long */
808
    if (!ISSET(RESTRICTED))
809
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Mac Format"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
810
811
		IFHELP(nano_mac_msg, TOGGLE_MAC_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
812
813
#endif

814
    /* Translators: try to keep this string under 16 characters long */
815
    if (!ISSET(RESTRICTED))
816
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Append"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
817
818
		IFHELP(nano_append_msg, NANO_APPEND_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
819

820
    /* Translators: try to keep this string under 16 characters long */
821
    if (!ISSET(RESTRICTED))
822
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Prepend"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
823
824
		IFHELP(nano_prepend_msg, NANO_PREPEND_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
825

826
#ifndef NANO_SMALL
827
    /* Translators: try to keep this string under 16 characters long */
828
    if (!ISSET(RESTRICTED))
829
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Backup File"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
830
831
		IFHELP(nano_backup_msg, TOGGLE_BACKUP_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
832
833
#endif

834
    free_shortcutage(&insertfile_list);
835

836
837
838
    sc_init_one(&insertfile_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
839
840
841
842
843
844
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
845

846
    sc_init_one(&insertfile_list, NANO_CANCEL_KEY, cancel_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
847
848
		IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
		NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
849

850
#ifndef DISABLE_BROWSER
851
852
    /* If we're using restricted mode, the file browser is disabled.
     * It's useless since inserting files is disabled. */
853
    if (!ISSET(RESTRICTED))
854
	sc_init_one(&insertfile_list, NANO_TOFILES_KEY, to_files_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
855
856
		IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
857
#endif
858

859
#ifndef NANO_SMALL
860
861
    /* If we're using restricted mode, command execution is disabled.
     * It's useless since inserting files is disabled. */
862
    /* Translators: try to keep this string under 22 characters long */
863
    if (!ISSET(RESTRICTED))
864
	sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, N_("Execute Command"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
865
866
		IFHELP(nano_execute_msg, NANO_NO_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
867

868
#ifdef ENABLE_MULTIBUFFER
869
870
    /* If we're using restricted mode, the multibuffer toggle is
     * disabled.  It's useless since inserting files is disabled. */
871
    /* Translators: try to keep this string under 22 characters long */
872
873
    if (!ISSET(RESTRICTED))
	sc_init_one(&insertfile_list, NANO_NO_KEY, _("New Buffer"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
874
875
		IFHELP(nano_multibuffer_msg, TOGGLE_MULTIBUFFER_KEY), NANO_NO_KEY,
		NANO_NO_KEY, NOVIEW, 0);
876
#endif
877
#endif
878

Chris Allegretta's avatar
Chris Allegretta committed
879
#ifndef DISABLE_SPELLER
880
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
881

882
883
884
    sc_init_one(&spell_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
885
886
887
888
889
890
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
891

892
893
894
    sc_init_one(&spell_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
895
#endif
Chris Allegretta's avatar
Chris Allegretta committed
896

897
#ifndef NANO_SMALL
898
    free_shortcutage(&extcmd_list);
Chris Allegretta's avatar
Chris Allegretta committed
899

900
901
902
    sc_init_one(&extcmd_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
903
904
905
906
907
908
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
909

910
911
912
    sc_init_one(&extcmd_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
913
#endif
914

915
#ifndef DISABLE_BROWSER
916
    free_shortcutage(&browser_list);
917

918
919
920
    sc_init_one(&browser_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
921
922
923
924
925
926
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
927

928
    sc_init_one(&browser_list, NANO_EXIT_KEY, exit_msg,
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
929
	IFHELP(nano_exitbrowser_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
930
	NANO_NO_KEY, VIEW, 0);
931

932
933
934
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
935

936
937
938
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
939

940
    /* Translators: try to keep this string under 22 characters long */
941
    sc_init_one(&browser_list, NANO_GOTO_KEY, N_("Go To Dir"),
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
942
	IFHELP(nano_gotodir_msg, NANO_ALT_GOTO_KEY), NANO_GOTO_FKEY,
943
	NANO_NO_KEY, VIEW, 0);
Rocco Corsi's avatar
   
Rocco Corsi committed
944

945
    free_shortcutage(&gotodir_list);
946

947
948
949
    sc_init_one(&gotodir_list, NANO_HELP_KEY, get_help_msg,
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
950
951
952
953
954
955
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
956

957
958
959
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, 0);
Chris Allegretta's avatar
Chris Allegretta committed
960
961
#endif

962
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || !defined(DISABLE_MOUSE)
963
964
    currshortcut = main_list;
#endif
965
#ifndef NANO_SMALL
966
    toggle_init();
967
#endif
968
}
969

970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
/* Deallocate the given shortcut. */
void free_shortcutage(shortcut **shortcutage)
{
    assert(shortcutage != NULL);
    while (*shortcutage != NULL) {
	shortcut *ps = *shortcutage;
	*shortcutage = (*shortcutage)->next;
	free(ps);
    }
}

#ifndef NANO_SMALL
/* Create one new toggle structure, at the end of the toggles linked
 * list. */
void toggle_init_one(int val, const char *desc, long flag)
{
    toggle *u;

    if (toggles == NULL) {
989
	toggles = (toggle *)nmalloc(sizeof(toggle));
990
991
992
993
	u = toggles;
    } else {
	for (u = toggles; u->next != NULL; u = u->next)
	    ;
994
	u->next = (toggle *)nmalloc(sizeof(toggle));
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
	u = u->next;
    }

    u->val = val;
    u->desc = _(desc);
    u->flag = flag;
    u->next = NULL;
}

void toggle_init(void)
{
    /* There is no need to reinitialize the toggles.  They can't
     * change. */
    if (toggles != NULL)
	return;

    toggle_init_one(TOGGLE_NOHELP_KEY, N_("Help mode"), NO_HELP);
#ifdef ENABLE_MULTIBUFFER
    /* If we're using restricted mode, the multibuffer toggle is
     * disabled.  It's useless since inserting files is disabled. */
    if (!ISSET(RESTRICTED))
	toggle_init_one(TOGGLE_MULTIBUFFER_KEY, N_("Multiple file buffers"),
		MULTIBUFFER);
#endif
    toggle_init_one(TOGGLE_CONST_KEY, N_("Constant cursor position"),
	CONSTUPDATE);
    toggle_init_one(TOGGLE_AUTOINDENT_KEY, N_("Auto indent"), AUTOINDENT);
#ifndef DISABLE_WRAPPING
    toggle_init_one(TOGGLE_WRAP_KEY, N_("Auto line wrap"), NO_WRAP);
#endif
    toggle_init_one(TOGGLE_CUTTOEND_KEY, N_("Cut to end"), CUT_TO_END);
    /* If we're using restricted mode, the suspend toggle is disabled.
     * It's useless since suspending is disabled. */
    if (!ISSET(RESTRICTED))
	toggle_init_one(TOGGLE_SUSPEND_KEY, N_("Suspend"), SUSPEND);
#ifndef DISABLE_MOUSE
    toggle_init_one(TOGGLE_MOUSE_KEY, N_("Mouse support"), USE_MOUSE);
#endif
    /* If we're using restricted mode, the no-conversion, DOS format,
     * Mac format, and backup toggles are disabled.  The first, second,
     * and third are useless since inserting files is disabled, and the
     * fourth is useless since backups are disabled. */
    if (!ISSET(RESTRICTED)) {
	toggle_init_one(TOGGLE_NOCONVERT_KEY,
		N_("No conversion from DOS/Mac format"), NO_CONVERT);
	toggle_init_one(TOGGLE_DOS_KEY, N_("Writing file in DOS format"),
		DOS_FILE);
	toggle_init_one(TOGGLE_MAC_KEY, N_("Writing file in Mac format"),
		MAC_FILE);
1044
	toggle_init_one(TOGGLE_BACKUP_KEY, N_("Backup files"), BACKUP_FILE);
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
    }
    toggle_init_one(TOGGLE_SMOOTH_KEY, N_("Smooth scrolling"), SMOOTHSCROLL);
    toggle_init_one(TOGGLE_SMARTHOME_KEY, N_("Smart home key"), SMART_HOME);
#ifdef ENABLE_COLOR
    toggle_init_one(TOGGLE_SYNTAX_KEY, N_("Color syntax highlighting"),
	COLOR_SYNTAX);
#endif
#ifdef ENABLE_NANORC
    toggle_init_one(TOGGLE_WHITESPACE_KEY, N_("Whitespace display"),
	WHITESPACE_DISPLAY);
#endif
}

#ifdef DEBUG
/* Deallocate all of the toggles. */
void free_toggles(void)
{
    while (toggles != NULL) {
	toggle *pt = toggles;	/* Think "previous toggle". */

	toggles = toggles->next;
	free(pt);
    }
}
#endif
#endif /* !NANO_SMALL */

1072
1073
1074
/* This function is called just before calling exit().  Practically, the
 * only effect is to cause a segmentation fault if the various data
 * structures got bolloxed earlier.  Thus, we don't bother having this
Chris Allegretta's avatar
Chris Allegretta committed
1075
 * function unless debugging is turned on. */
1076
#ifdef DEBUG
1077
/* Added by SPK for memory cleanup; gracefully return our malloc()s. */
Chris Allegretta's avatar
Chris Allegretta committed
1078
void thanks_for_all_the_fish(void)
1079
{
1080
1081
1082
1083
    delwin(topwin);
    delwin(edit);
    delwin(bottomwin);

Chris Allegretta's avatar
Chris Allegretta committed
1084
1085
1086
#ifndef DISABLE_JUSTIFY
    if (quotestr != NULL)
	free(quotestr);
1087
1088
1089
1090
#ifdef HAVE_REGEX_H
    regfree(&quotereg);
    free(quoteerr);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1091
#endif
1092
1093
1094
1095
#ifndef NANO_SMALL
    if (backup_dir != NULL)
        free(backup_dir);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1096
#ifndef DISABLE_OPERATINGDIR
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
    if (operating_dir != NULL)
	free(operating_dir);
    if (full_operating_dir != NULL)
	free(full_operating_dir);
#endif
    if (last_search != NULL)
	free(last_search);
    if (last_replace != NULL)
	free(last_replace);
    if (hblank != NULL)
	free(hblank);
#ifndef DISABLE_SPELLER
    if (alt_speller != NULL)
	free(alt_speller);
#endif
1112
#ifndef DISABLE_HELP
1113
1114
    if (help_text != NULL)
	free(help_text);
1115
#endif
1116
1117
1118
1119
1120
    if (filename != NULL)
	free(filename);
    if (answer != NULL)
	free(answer);
    if (cutbuffer != NULL)
Chris Allegretta's avatar
Chris Allegretta committed
1121
	free_filestruct(cutbuffer);
1122
1123
1124
1125
1126

    free_shortcutage(&main_list);
    free_shortcutage(&whereis_list);
    free_shortcutage(&replace_list);
    free_shortcutage(&replace_list_2);
Chris Allegretta's avatar
Chris Allegretta committed
1127
    free_shortcutage(&goto_list);
1128
1129
    free_shortcutage(&writefile_list);
    free_shortcutage(&insertfile_list);
Chris Allegretta's avatar
Chris Allegretta committed
1130
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
1131
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
1132
1133
#endif
#ifndef DISABLE_SPELLER
1134
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
1135
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1136
1137
1138
#ifndef NANO_SMALL
    free_shortcutage(&extcmd_list);
#endif
1139
1140
#ifndef DISABLE_BROWSER
    free_shortcutage(&browser_list);
Chris Allegretta's avatar
Chris Allegretta committed
1141
    free_shortcutage(&gotodir_list);
1142
1143
1144
1145
1146
1147
1148
#endif

#ifndef NANO_SMALL
    free_toggles();
#endif

#ifdef ENABLE_MULTIBUFFER
1149
    if (open_files != NULL) {
1150
	/* We free the memory associated with each open file. */
1151
1152
	while (open_files->prev != NULL)
	    open_files = open_files->prev;
Chris Allegretta's avatar
Chris Allegretta committed
1153
	free_openfilestruct(open_files);
1154
    }
1155
#else
1156
    free_filestruct(fileage);
1157
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168

#ifdef ENABLE_COLOR
    free(syntaxstr);
    while (syntaxes != NULL) {
	syntaxtype *bill = syntaxes;

	free(syntaxes->desc);
	while (syntaxes->extensions != NULL) {
	    exttype *bob = syntaxes->extensions;

	    syntaxes->extensions = bob->next;
Chris Allegretta's avatar
Chris Allegretta committed
1169
	    regfree(&bob->val);
Chris Allegretta's avatar
Chris Allegretta committed
1170
1171
1172
1173
1174
1175
	    free(bob);
	}
	while (syntaxes->color != NULL) {
	    colortype *bob = syntaxes->color;

	    syntaxes->color = bob->next;
Chris Allegretta's avatar
Chris Allegretta committed
1176
1177
	    regfree(&bob->start);
	    if (bob->end != NULL)
1178
1179
		regfree(bob->end);
	    free(bob->end);
Chris Allegretta's avatar
Chris Allegretta committed
1180
1181
1182
1183
1184
1185
	    free(bob);
	}
	syntaxes = syntaxes->next;
	free(bill);
    }
#endif /* ENABLE_COLOR */
1186
1187
1188
1189
1190
#ifndef NANO_SMALL
    /* free history lists */
    free_history(&search_history);
    free_history(&replace_history);
#endif
1191
}
1192
#endif /* DEBUG */