global.c 40.6 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-2005 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
 *   any later version.                                                   *
 *                                                                        *
11
12
13
14
 *   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.                             *
Chris Allegretta's avatar
Chris Allegretta committed
15
16
17
 *                                                                        *
 *   You should have received a copy of the GNU General Public License    *
 *   along with this program; if not, write to the Free Software          *
18
19
 *   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA            *
 *   02110-1301, USA.                                                     *
Chris Allegretta's avatar
Chris Allegretta committed
20
21
22
 *                                                                        *
 **************************************************************************/

23
24
25
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
26

Chris Allegretta's avatar
Chris Allegretta committed
27
28
#include "proto.h"

Chris Allegretta's avatar
Chris Allegretta committed
29
/* Global variables */
30
#ifndef DISABLE_WRAPJUSTIFY
31
32
ssize_t fill = 0;		/* The column where we will wrap
				 * lines. */
33
ssize_t wrap_at = -CHARS_FROM_EOL;
34
35
36
37
				/* The position where we will wrap
				 * lines.  fill is equal to this if it's
				 * greater than zero, and equal to
				 * (COLS + this) if it isn't. */
38
39
#endif

Chris Allegretta's avatar
Chris Allegretta committed
40
41
42
char *last_search = NULL;	/* Last string we searched for */
char *last_replace = NULL;	/* Last replacement string */

43
long flags = 0;			/* Our flag containing many options */
44
WINDOW *topwin;			/* Top subwindow */
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
45
WINDOW *edit;			/* The file portion of the editor */
46
WINDOW *bottomwin;		/* Bottom subwindow */
47

Chris Allegretta's avatar
Chris Allegretta committed
48
49
50
int editwinrows = 0;		/* How many rows long is the edit
				   window? */
filestruct *cutbuffer = NULL;	/* A place to store cut text */
51
52
53
#ifndef DISABLE_JUSTIFY
filestruct *jusbuffer = NULL;	/* A place to store unjustified text */
#endif
54
55
56
partition *filepart = NULL;	/* A place to store a portion of the
				   file struct */

57
58
openfilestruct *openfile = NULL;
				/* The list of open file buffers */
59

60
61
62
63
#if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
char *whitespace = NULL;	/* Characters used when displaying
				   the first characters of tabs and
				   spaces. */
64
int whitespace_len[2];		/* The length of the characters. */
65
66
#endif

67
#ifndef DISABLE_JUSTIFY
68
69
70
71
72
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
73
74
char *quotestr = NULL;		/* Quote string.  The default value is
				   set in main(). */
75
76
77
78
79
80
81
#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
82
#endif
83

84
85
86
87
#ifndef NANO_SMALL
char *backup_dir = NULL;	/* Backup directory. */
#endif

Chris Allegretta's avatar
Chris Allegretta committed
88
char *answer = NULL;		/* Answer str to many questions */
Chris Allegretta's avatar
Chris Allegretta committed
89

90
91
ssize_t tabsize = -1;		/* Our internal tabsize variable.  The
				   default value is set in main(). */
92

Chris Allegretta's avatar
Chris Allegretta committed
93
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
94
char *help_text;		/* The text in the help window */
Chris Allegretta's avatar
Chris Allegretta committed
95
#endif
Chris Allegretta's avatar
Chris Allegretta committed
96

97
#ifndef DISABLE_OPERATINGDIR
98
99
char *operating_dir = NULL;	/* Operating directory, which we can't */
char *full_operating_dir = NULL;/* go higher than */
100
101
#endif

102
#ifndef DISABLE_SPELLER
103
char *alt_speller = NULL;		/* Alternative spell command */
104
105
#endif

106
107
108
shortcut *main_list = NULL;
shortcut *whereis_list = NULL;
shortcut *replace_list = NULL;
109
shortcut *replace_list_2 = NULL; 	/* 2nd half of replace dialog */
110
shortcut *gotoline_list = NULL;
111
112
shortcut *writefile_list = NULL;
shortcut *insertfile_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
113
#ifndef DISABLE_HELP
114
shortcut *help_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
115
116
#endif
#ifndef DISABLE_SPELLER
117
shortcut *spell_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
118
#endif
Chris Allegretta's avatar
Chris Allegretta committed
119
#ifndef NANO_SMALL
120
shortcut *extcmd_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
121
#endif
122
#ifndef DISABLE_BROWSER
123
shortcut *browser_list = NULL;
124
shortcut *gotodir_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
125
#endif
126

127
#ifdef ENABLE_COLOR
128
129
syntaxtype *syntaxes = NULL;
char *syntaxstr = NULL;
130
131
#endif

Chris Allegretta's avatar
Chris Allegretta committed
132
const shortcut *currshortcut;	/* Current shortcut list we're using */
133

134
#ifndef NANO_SMALL
135
toggle *toggles = NULL;
136
#endif
Chris Allegretta's avatar
Chris Allegretta committed
137

138
#ifndef NANO_SMALL
139
140
141
142
143
144
filestruct *search_history = NULL;
filestruct *searchage = NULL;
filestruct *searchbot = NULL;
filestruct *replace_history = NULL;
filestruct *replaceage = NULL;
filestruct *replacebot = NULL;
145
146
#endif

147
/* Regular expressions */
148
#ifdef HAVE_REGEX_H
149
150
151
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
152
#endif
153

154
bool curses_ended = FALSE;	/* Indicates to statusbar() to simply
155
156
157
				 * write to stderr, since endwin() has
				 * ended curses mode. */

158
159
char *homedir = NULL;		/* $HOME or from /etc/passwd. */

160
size_t length_of_list(const shortcut *s)
161
{
162
    size_t i = 0;
163

164
    for (; s != NULL; s = s->next)
165
166
167
168
	i++;
    return i;
}

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
169
170
/* Create a new shortcut structure, at the end of the shortcuts linked
 * list. */
171
void sc_init_one(shortcut **shortcutage, int ctrlval, const char *desc,
172
#ifndef DISABLE_HELP
173
	const char *help,
174
#endif
175
	int metaval, int funcval, int miscval, bool view, void
176
	(*func)(void))
Chris Allegretta's avatar
Chris Allegretta committed
177
{
178
179
180
    shortcut *s;

    if (*shortcutage == NULL) {
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
181
	*shortcutage = (shortcut *)nmalloc(sizeof(shortcut));
182
183
184
185
	s = *shortcutage;
    } else {
	for (s = *shortcutage; s->next != NULL; s = s->next)
	    ;
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
186
	s->next = (shortcut *)nmalloc(sizeof(shortcut));
187
188
189
	s = s->next; 
    }

190
    s->ctrlval = ctrlval;
191
    s->desc = _(desc);
192
#ifndef DISABLE_HELP
193
    s->help = _(help);
194
#endif
195
196
197
    s->metaval = metaval;
    s->funcval = funcval;
    s->miscval = miscval;
Chris Allegretta's avatar
Chris Allegretta committed
198
199
    s->viewok = view;
    s->func = func;
200
    s->next = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
201
202
}

203
void shortcut_init(bool unjustify)
204
{
205
206
207
208
209
210
211
212
213
    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");
214
    const char *refresh_msg = N_("Refresh");
215
216
217
#ifndef NANO_SMALL
    const char *cut_till_end_msg = N_("CutTillEnd");
#endif
218
219
220
221
222
#ifndef DISABLE_JUSTIFY
    const char *beg_of_par_msg = N_("Beg of Par");
    const char *end_of_par_msg = N_("End of Par");
    const char *fulljstify_msg = N_("FullJstify");
#endif
223
224
#ifndef NANO_SMALL
    const char *case_sens_msg = N_("Case Sens");
225
    const char *backwards_msg = N_("Backwards");
226
#endif
227
228
#ifdef HAVE_REGEX_H
    const char *regexp_msg = N_("Regexp");
229
#endif
230
#ifndef NANO_SMALL
231
    const char *history_msg = N_("History");
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
232
#ifdef ENABLE_MULTIBUFFER
233
    const char *new_buffer_msg = N_("New Buffer");
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
234
#endif
235
#endif
236
237
#ifndef DISABLE_BROWSER
    const char *to_files_msg = N_("To Files");
238
#endif
239
240
241
#ifndef DISABLE_HELP
    const char *nano_help_msg = N_("Invoke the help menu");
    const char *nano_exit_msg =
242
#ifdef ENABLE_MULTIBUFFER
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
243
	N_("Close the current file buffer/Exit from nano")
244
245
246
247
#else
   	N_("Exit from nano")
#endif
	;
248
249
    const char *nano_writeout_msg =
	N_("Write the current file to disk");
250
251
252
    const char *nano_justify_msg = N_("Justify the current paragraph");
    const char *nano_insert_msg =
	N_("Insert another file into the current one");
253
254
    const char *nano_whereis_msg =
	N_("Search for text within the editor");
255
256
257
258
259
260
    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");
261
262
263
264
    const char *nano_cursorpos_msg =
	N_("Show the position of the cursor");
    const char *nano_spell_msg =
	N_("Invoke the spell checker, if available");
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
265
    const char *nano_gotoline_msg = N_("Go to line and column number");
266
    const char *nano_replace_msg = N_("Replace text within the editor");
267
#ifndef NANO_SMALL
268
269
    const char *nano_mark_msg = N_("Mark text at the cursor position");
    const char *nano_whereis_next_msg = N_("Repeat last search");
270
#endif
271
272
273
274
    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");
275
276
277
278
279
280
281
282
    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_delete_msg =
	N_("Delete the character under the cursor");
283
284
    const char *nano_backspace_msg =
	N_("Delete the character to the left of the cursor");
285
286
    const char *nano_tab_msg =
	N_("Insert a tab character at the cursor position");
287
288
    const char *nano_enter_msg =
	N_("Insert a carriage return at the cursor position");
289
#ifndef NANO_SMALL
290
291
    const char *nano_nextword_msg = N_("Move forward one word");
    const char *nano_prevword_msg = N_("Move backward one word");
292
    const char *nano_wordcount_msg =
293
	N_("Count the number of words, lines, and characters");
294
#endif
295
296
297
298
299
300
#ifndef DISABLE_JUSTIFY
    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");
#endif
301
#ifdef ENABLE_MULTIBUFFER
302
    const char *nano_prevfile_msg =
303
	N_("Switch to the previous file buffer");
304
    const char *nano_nextfile_msg =
305
	N_("Switch to the next file buffer");
306
307
#endif
    const char *nano_verbatim_msg = N_("Insert character(s) verbatim");
308
309
310
311
#ifndef NANO_SMALL
    const char *nano_cut_till_end_msg =
	N_("Cut from the cursor position to the end of the file");
#endif
312
313
#ifndef DISABLE_JUSTIFY
    const char *nano_fulljustify_msg = N_("Justify the entire file");
314
#endif
315
#if !defined(NANO_SMALL) && defined(HAVE_REGEX_H)
316
    const char *nano_bracket_msg = N_("Find other bracket");
317
#endif
318
    const char *nano_cancel_msg = N_("Cancel the current function");
319
320
321
322
    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");
323
324
325
326
327
#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");
328
#endif
329
330
#ifdef HAVE_REGEX_H
    const char *nano_regexp_msg = N_("Use regular expressions");
331
#endif
332
#ifndef NANO_SMALL
333
334
    const char *nano_history_msg =
	N_("Edit the previous search/replace strings");
335
#endif
336
337
#ifndef DISABLE_BROWSER
    const char *nano_tofiles_msg = N_("Go to file browser");
Chris Allegretta's avatar
Chris Allegretta committed
338
#endif
339
340
341
#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");
342
#endif
343
344
345
    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
346
347
    const char *nano_backup_msg =
	N_("Back up original file when saving");
348
    const char *nano_execute_msg = N_("Execute external command");
349
#endif
350
#if !defined(NANO_SMALL) && defined(ENABLE_MULTIBUFFER)
351
352
353
    const char *nano_multibuffer_msg = N_("Insert into new buffer");
#endif
#ifndef DISABLE_BROWSER
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
354
355
    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
356
#endif
357
#endif /* !DISABLE_HELP */
Chris Allegretta's avatar
Chris Allegretta committed
358

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
359
360
361
/* 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
362
#ifndef DISABLE_HELP
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
363
#define IFHELP(help, nextvar) help, nextvar
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
364
#else
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
365
#define IFHELP(help, nextvar) nextvar
366
#endif
367

368
369
    free_shortcutage(&main_list);

370
    /* Translators: try to keep this string under 10 characters long */
371
372
373
    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,
374
375
376
377
378
379
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
380

381
    /* Translators: try to keep this string under 10 characters long */
382
383
    sc_init_one(&main_list, NANO_EXIT_KEY,
#ifdef ENABLE_MULTIBUFFER
384
385
	openfile != NULL && openfile != openfile->next ?
	N_("Close") :
386
#endif
387
388
	exit_msg, IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
	NANO_NO_KEY, VIEW, do_exit);
Chris Allegretta's avatar
Chris Allegretta committed
389

390
    /* Translators: try to keep this string under 10 characters long */
391
392
393
    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
394

395
    /* Translators: try to keep this string under 10 characters long */
396
397
398
    sc_init_one(&main_list, NANO_JUSTIFY_KEY, N_("Justify"),
	IFHELP(nano_justify_msg, NANO_NO_KEY),
	NANO_JUSTIFY_FKEY, NANO_NO_KEY, NOVIEW,
399
#ifndef DISABLE_JUSTIFY
400
		do_justify_void
401
402
403
404
#else
		nano_disabled_msg
#endif
		);
405

406
407
408
409
410
    /* 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. */
411
    /* Translators: try to keep this string under 10 characters long */
412
413
414
    sc_init_one(&main_list, NANO_INSERTFILE_KEY, N_("Read File"),
	IFHELP(nano_insert_msg, NANO_NO_KEY), NANO_INSERTFILE_FKEY,
	NANO_NO_KEY,
415
#ifdef ENABLE_MULTIBUFFER
416
		VIEW
417
#else
418
		NOVIEW
419
#endif
420
421
		, !ISSET(RESTRICTED) ? do_insertfile_void :
		nano_disabled_msg);
Chris Allegretta's avatar
Chris Allegretta committed
422

423
    /* Translators: try to keep this string under 10 characters long */
424
425
426
    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
427

428
    /* Translators: try to keep this string under 10 characters long */
429
430
431
    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
432

433
    /* Translators: try to keep this string under 10 characters long */
434
435
436
    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
437

438
    /* Translators: try to keep this string under 10 characters long */
439
440
441
    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
442

443
    if (unjustify)
444
    /* Translators: try to keep this string under 10 characters long */
445
446
	sc_init_one(&main_list, NANO_UNJUSTIFY_KEY, N_("UnJustify"),
		IFHELP(NULL, NANO_NO_KEY), NANO_UNJUSTIFY_FKEY,
447
		NANO_NO_KEY, NOVIEW, NULL);
448
    else
449
    /* Translators: try to keep this string under 10 characters long */
450
	sc_init_one(&main_list, NANO_UNCUT_KEY, N_("UnCut Txt"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
451
452
		IFHELP(nano_uncut_msg, NANO_NO_KEY), NANO_UNCUT_FKEY,
		NANO_NO_KEY, NOVIEW, do_uncut_text);
Chris Allegretta's avatar
Chris Allegretta committed
453

454
    /* Translators: try to keep this string under 10 characters long */
455
456
457
    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
458

459
460
461
    /* 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. */
462
    /* Translators: try to keep this string under 10 characters long */
463
    sc_init_one(&main_list, NANO_SPELL_KEY, N_("To Spell"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
464
		IFHELP(nano_spell_msg, NANO_NO_KEY), NANO_SPELL_FKEY,
465
466
467
468
469
		NANO_NO_KEY, NOVIEW,
#ifndef DISABLE_SPELLER
		!ISSET(RESTRICTED) ? do_spell :
#endif
		nano_disabled_msg);
470

471
    sc_init_one(&main_list, NANO_GOTOLINE_KEY, go_to_line_msg,
472
	IFHELP(nano_gotoline_msg, NANO_GOTOLINE_ALTKEY),
473
474
	NANO_GOTOLINE_FKEY, NANO_NO_KEY, VIEW,
	do_gotolinecolumn_void);
475

476
    sc_init_one(&main_list, NANO_REPLACE_KEY, replace_msg,
477
478
	IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY),
	NANO_REPLACE_FKEY, NANO_NO_KEY, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
479

480
#ifndef NANO_SMALL
481
482
    sc_init_one(&main_list, NANO_MARK_KEY, N_("Mark Text"),
	IFHELP(nano_mark_msg, NANO_MARK_ALTKEY), NANO_MARK_FKEY,
483
	NANO_NO_KEY, VIEW, do_mark);
484
485
486

    sc_init_one(&main_list, NANO_NO_KEY, N_("Where Is Next"),
	IFHELP(nano_whereis_next_msg, NANO_WHEREIS_NEXT_KEY),
487
	NANO_WHEREIS_NEXT_FKEY, NANO_NO_KEY, VIEW, do_research);
488
489
#endif

490
491
492
    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
493

494
495
496
    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
497

498
499
500
    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
501

502
503
504
    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
505

506
507
508
    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
509

510
511
512
    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
513

514
    sc_init_one(&main_list, NANO_REFRESH_KEY, refresh_msg,
515
516
	IFHELP(nano_refresh_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, total_refresh);
Chris Allegretta's avatar
Chris Allegretta committed
517

518
519
520
    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
521

522
523
524
    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
525

526
527
528
    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
529

530
531
532
    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);
533

534
#ifndef NANO_SMALL
535
536
    sc_init_one(&main_list, NANO_NEXTWORD_KEY, N_("Next Word"),
	IFHELP(nano_nextword_msg, NANO_NO_KEY), NANO_NO_KEY,
537
	NANO_NO_KEY, VIEW, do_next_word_void);
538

539
540
    sc_init_one(&main_list, NANO_NO_KEY, N_("Prev Word"),
	IFHELP(nano_prevword_msg, NANO_PREVWORD_KEY), NANO_NO_KEY,
541
	NANO_NO_KEY, VIEW, do_prev_word_void);
542
543
544

    sc_init_one(&main_list, NANO_NO_KEY, N_("Word Count"),
	IFHELP(nano_wordcount_msg, NANO_WORDCOUNT_KEY), NANO_NO_KEY,
545
	NANO_NO_KEY, VIEW, do_wordlinechar_count);
546
#endif
547

548
549
550
551
#ifndef DISABLE_JUSTIFY
    /* Translators: try to keep this string under 10 characters long */
    sc_init_one(&main_list, NANO_NO_KEY, beg_of_par_msg,
	IFHELP(nano_parabegin_msg, NANO_PARABEGIN_ALTKEY1), NANO_NO_KEY,
552
	NANO_PARABEGIN_ALTKEY2, VIEW, do_para_begin_void);
553
554
555
556

    /* Translators: try to keep this string under 10 characters long */
    sc_init_one(&main_list, NANO_NO_KEY, end_of_par_msg,
	IFHELP(nano_paraend_msg, NANO_PARAEND_ALTKEY1), NANO_NO_KEY,
557
	NANO_PARAEND_ALTKEY2, VIEW, do_para_end_void);
558
#endif
559

560
#ifdef ENABLE_MULTIBUFFER
561
    sc_init_one(&main_list, NANO_NO_KEY, N_("Previous File"),
562
563
	IFHELP(nano_prevfile_msg, NANO_PREVFILE_KEY), NANO_NO_KEY,
	NANO_PREVFILE_ALTKEY, VIEW, switch_to_prev_buffer_void);
564

565
    sc_init_one(&main_list, NANO_NO_KEY, N_("Next File"),
566
567
	IFHELP(nano_nextfile_msg, NANO_NEXTFILE_KEY), NANO_NO_KEY,
	NANO_NEXTFILE_ALTKEY, VIEW, switch_to_next_buffer_void);
568
#endif
569

570
571
572
573
    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);

574
575
576
577
578
579
580
#ifndef NANO_SMALL
    /* Translators: try to keep this string under 10 characters long */
    sc_init_one(&main_list, NANO_NO_KEY, cut_till_end_msg,
	IFHELP(nano_cut_till_end_msg, NANO_CUTTILLEND_ALTKEY),
	NANO_NO_KEY, NANO_NO_KEY, NOVIEW, do_cut_till_end);
#endif

581
582
583
#ifndef DISABLE_JUSTIFY
    /* Translators: try to keep this string under 10 characters long */
    sc_init_one(&main_list, NANO_NO_KEY, fulljstify_msg,
584
585
	IFHELP(nano_fulljustify_msg, NANO_FULLJUSTIFY_ALTKEY),
	NANO_NO_KEY, NANO_NO_KEY, NOVIEW, do_full_justify);
586
587
#endif

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
588
#if !defined(NANO_SMALL) && defined(HAVE_REGEX_H)
589
590
591
    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);
592
593
#endif

594
    free_shortcutage(&whereis_list);
595

596
597
598
    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,
599
600
601
602
603
604
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
605

606
    /* Translators: try to keep this string under 10 characters long */
607
608
    sc_init_one(&whereis_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
609
	NANO_NO_KEY, VIEW, NULL);
610

611
    /* Translators: try to keep this string under 10 characters long */
612
613
614
    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
615

616
    /* Translators: try to keep this string under 10 characters long */
617
618
619
    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
620

621
    /* Translators: try to keep this string under 10 characters long */
622
    sc_init_one(&whereis_list, NANO_TOOTHERSEARCH_KEY, replace_msg,
623
	IFHELP(nano_replace_msg, NANO_NO_KEY), NANO_REPLACE_FKEY,
624
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
625

626
    /* Translators: try to keep this string under 10 characters long */
627
628
    sc_init_one(&whereis_list, NANO_TOGOTOLINE_KEY, go_to_line_msg,
	IFHELP(nano_gotoline_msg, NANO_NO_KEY), NANO_GOTOLINE_FKEY,
629
	NANO_NO_KEY, VIEW, NULL);
630

631
632
#ifndef DISABLE_JUSTIFY
    /* Translators: try to keep this string under 10 characters long */
633
    sc_init_one(&whereis_list, NANO_PARABEGIN_KEY, beg_of_par_msg,
634
	IFHELP(nano_parabegin_msg, NANO_PARABEGIN_ALTKEY1), NANO_NO_KEY,
635
	NANO_PARABEGIN_ALTKEY2, VIEW, do_para_begin_void);
636
637

    /* Translators: try to keep this string under 10 characters long */
638
    sc_init_one(&whereis_list, NANO_PARAEND_KEY, end_of_par_msg,
639
	IFHELP(nano_paraend_msg, NANO_PARAEND_ALTKEY1), NANO_NO_KEY,
640
	NANO_PARAEND_ALTKEY2, VIEW, do_para_end_void);
641
642
#endif

643
#ifndef NANO_SMALL
644
    /* Translators: try to keep this string under 10 characters long */
645
646
    sc_init_one(&whereis_list, NANO_NO_KEY, case_sens_msg,
	IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY,
647
	NANO_NO_KEY, VIEW, NULL);
648

649
    /* Translators: try to keep this string under 10 characters long */
650
    sc_init_one(&whereis_list, NANO_NO_KEY, backwards_msg,
651
	IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY,
652
	NANO_NO_KEY, VIEW, NULL);
653
#endif
Chris Allegretta's avatar
Chris Allegretta committed
654

655
#ifdef HAVE_REGEX_H
656
    /* Translators: try to keep this string under 10 characters long */
657
    sc_init_one(&whereis_list, NANO_NO_KEY, regexp_msg,
658
	IFHELP(nano_regexp_msg, NANO_REGEXP_KEY), NANO_NO_KEY,
659
	NANO_NO_KEY, VIEW, NULL);
660
#endif
661

662
#ifndef NANO_SMALL
663
    /* Translators: try to keep this string under 10 characters long */
664
665
    sc_init_one(&whereis_list, NANO_PREVLINE_KEY, history_msg,
	IFHELP(nano_history_msg, NANO_NO_KEY), NANO_NO_KEY,
666
	NANO_NO_KEY, VIEW, NULL);
667
668
669
670
671

    /* Translators: try to keep this string under 10 characters long */
    sc_init_one(&whereis_list, NANO_CUTTILLEND_KEY, cut_till_end_msg,
	IFHELP(nano_cut_till_end_msg, NANO_CUTTILLEND_ALTKEY),
	NANO_NO_KEY, NANO_NO_KEY, NOVIEW, do_cut_till_end);
672
#endif
673
674
675
676
677
678
679

#ifndef DISABLE_JUSTIFY
    /* Translators: try to keep this string under 10 characters long */
    sc_init_one(&whereis_list, NANO_FULLJUSTIFY_KEY, fulljstify_msg,
	IFHELP(nano_fulljustify_msg, NANO_FULLJUSTIFY_ALTKEY),
	NANO_NO_KEY, NANO_NO_KEY, NOVIEW, do_full_justify);
#endif
680

681
    free_shortcutage(&replace_list);
682

683
684
685
    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,
686
687
688
689
690
691
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
692

693
694
    sc_init_one(&replace_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
695
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
696

697
698
699
    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
700

701
702
703
    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
704

705
    /* Translators: try to keep this string under 12 characters long */
706
    sc_init_one(&replace_list, NANO_TOOTHERSEARCH_KEY, N_("No Replace"),
707
	IFHELP(nano_whereis_msg, NANO_NO_KEY), NANO_REPLACE_FKEY,
708
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
709

710
711
    sc_init_one(&replace_list, NANO_TOGOTOLINE_KEY, go_to_line_msg,
	IFHELP(nano_gotoline_msg, NANO_NO_KEY), NANO_GOTOLINE_FKEY,
712
	NANO_NO_KEY, VIEW, NULL);
713

714
#ifndef NANO_SMALL
715
716
    sc_init_one(&replace_list, NANO_NO_KEY, case_sens_msg,
	IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY,
717
	NANO_NO_KEY, VIEW, NULL);
718

719
    sc_init_one(&replace_list, NANO_NO_KEY, backwards_msg,
720
	IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY,
721
	NANO_NO_KEY, VIEW, NULL);
722
#endif
723

724
#ifdef HAVE_REGEX_H
725
    sc_init_one(&replace_list, NANO_NO_KEY, regexp_msg,
726
	IFHELP(nano_regexp_msg, NANO_REGEXP_KEY), NANO_NO_KEY,
727
	NANO_NO_KEY, VIEW, NULL);
728
#endif
729

730
#ifndef NANO_SMALL
731
732
    sc_init_one(&replace_list, NANO_PREVLINE_KEY, history_msg,
	IFHELP(nano_history_msg, NANO_NO_KEY), NANO_NO_KEY,
733
	NANO_NO_KEY, VIEW, NULL);
734
#endif
735

736
    free_shortcutage(&replace_list_2);
737

738
739
740
    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,
741
742
743
744
745
746
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
747

748
749
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
750
	NANO_NO_KEY, VIEW, NULL);
751

752
753
754
    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);
755

756
757
758
    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);
759

760
#ifndef NANO_SMALL
761
762
    sc_init_one(&replace_list_2, NANO_PREVLINE_KEY, history_msg,
	IFHELP(nano_history_msg, NANO_NO_KEY), NANO_NO_KEY,
763
	NANO_NO_KEY, VIEW, NULL);
764
765
#endif

766
    free_shortcutage(&gotoline_list);
Chris Allegretta's avatar
Chris Allegretta committed
767

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

778
    sc_init_one(&gotoline_list, NANO_CANCEL_KEY, cancel_msg,
779
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
780
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
781

782
    sc_init_one(&gotoline_list, NANO_FIRSTLINE_KEY, first_line_msg,
783
784
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
785

786
    sc_init_one(&gotoline_list, NANO_LASTLINE_KEY, last_line_msg,
787
788
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
789

790
791
    sc_init_one(&gotoline_list, NANO_TOOTHERWHEREIS_KEY,
	N_("Go To Text"), IFHELP(nano_whereis_msg, NANO_NO_KEY),
792
	NANO_NO_KEY, NANO_NO_KEY, VIEW, NULL);
793

Chris Allegretta's avatar
Chris Allegretta committed
794
#ifndef DISABLE_HELP
795
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
796

797
    sc_init_one(&help_list, NANO_REFRESH_KEY, refresh_msg,
798
799
800
801
802
803
804
	IFHELP(nano_refresh_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, NULL);

    sc_init_one(&help_list, NANO_EXIT_KEY, exit_msg,
	IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
	NANO_NO_KEY, VIEW, NULL);

805
806
    sc_init_one(&help_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
807
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
808

809
810
    sc_init_one(&help_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
811
	NANO_NO_KEY, VIEW, NULL);
812

813
814
    sc_init_one(&help_list, NANO_PREVLINE_KEY, N_("Prev Line"),
	IFHELP(nano_prevline_msg, NANO_NO_KEY), NANO_NO_KEY,
815
	NANO_NO_KEY, VIEW, NULL);
816

817
818
    sc_init_one(&help_list, NANO_NEXTLINE_KEY, N_("Next Line"),
	IFHELP(nano_nextline_msg, NANO_NO_KEY), NANO_NO_KEY,
819
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
820
#endif
Chris Allegretta's avatar
Chris Allegretta committed
821

822
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
823

824
825
826
    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,
827
828
829
830
831
832
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
833

834
835
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
836
	NANO_NO_KEY, VIEW, NULL);
837

838
#ifndef DISABLE_BROWSER
839
840
    /* If we're using restricted mode, the file browser is disabled.
     * It's useless since inserting files is disabled. */
841
    /* Translators: try to keep this string under 16 characters long */
842
    if (!ISSET(RESTRICTED))
843
	sc_init_one(&writefile_list, NANO_TOFILES_KEY, to_files_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
844
		IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY,
845
		NANO_NO_KEY, NOVIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
846
#endif
Chris Allegretta's avatar
Chris Allegretta committed
847

848
#ifndef NANO_SMALL
849
850
851
852
853
854
    /* 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. */
855
    /* Translators: try to keep this string under 16 characters long */
856
    if (!ISSET(RESTRICTED))
857
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("DOS Format"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
858
		IFHELP(nano_dos_msg, TOGGLE_DOS_KEY), NANO_NO_KEY,
859
		NANO_NO_KEY, NOVIEW, NULL);
860

861
    /* Translators: try to keep this string under 16 characters long */
862
    if (!ISSET(RESTRICTED))
863
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Mac Format"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
864
		IFHELP(nano_mac_msg, TOGGLE_MAC_KEY), NANO_NO_KEY,
865
		NANO_NO_KEY, NOVIEW, NULL);
866
867
#endif

868
    /* Translators: try to keep this string under 16 characters long */
869
    if (!ISSET(RESTRICTED))
870
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Append"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
871
		IFHELP(nano_append_msg, NANO_APPEND_KEY), NANO_NO_KEY,
872
		NANO_NO_KEY, NOVIEW, NULL);
873

874
    /* Translators: try to keep this string under 16 characters long */
875
    if (!ISSET(RESTRICTED))
876
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Prepend"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
877
		IFHELP(nano_prepend_msg, NANO_PREPEND_KEY), NANO_NO_KEY,
878
		NANO_NO_KEY, NOVIEW, NULL);
879

880
#ifndef NANO_SMALL
881
    /* Translators: try to keep this string under 16 characters long */
882
    if (!ISSET(RESTRICTED))
883
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Backup File"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
884
		IFHELP(nano_backup_msg, TOGGLE_BACKUP_KEY), NANO_NO_KEY,
885
		NANO_NO_KEY, NOVIEW, NULL);
886
887
#endif

888
    free_shortcutage(&insertfile_list);
889

890
891
892
    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,
893
894
895
896
897
898
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
899

900
    sc_init_one(&insertfile_list, NANO_CANCEL_KEY, cancel_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
901
		IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
902
		NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
903

904
#ifndef DISABLE_BROWSER
905
906
    /* If we're using restricted mode, the file browser is disabled.
     * It's useless since inserting files is disabled. */
907
    if (!ISSET(RESTRICTED))
908
	sc_init_one(&insertfile_list, NANO_TOFILES_KEY, to_files_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
909
		IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY,
910
		NANO_NO_KEY, NOVIEW, NULL);
911
#endif
912

913
#ifndef NANO_SMALL
914
915
    /* If we're using restricted mode, command execution is disabled.
     * It's useless since inserting files is disabled. */
916
    /* Translators: try to keep this string under 22 characters long */
917
    if (!ISSET(RESTRICTED))
918
919
	sc_init_one(&insertfile_list, NANO_TOOTHERINSERT_KEY,
		N_("Execute Command"), IFHELP(nano_execute_msg,
920
		NANO_NO_KEY), NANO_NO_KEY, NANO_NO_KEY, NOVIEW, NULL);
921

922
#ifdef ENABLE_MULTIBUFFER
923
924
    /* If we're using restricted mode, the multibuffer toggle is
     * disabled.  It's useless since inserting files is disabled. */
925
    /* Translators: try to keep this string under 22 characters long */
926
    if (!ISSET(RESTRICTED))
927
	sc_init_one(&insertfile_list, NANO_NO_KEY, new_buffer_msg,
928
		IFHELP(nano_multibuffer_msg, TOGGLE_MULTIBUFFER_KEY),
929
		NANO_NO_KEY, NANO_NO_KEY, NOVIEW, NULL);
930
#endif
931
#endif
932

Chris Allegretta's avatar
Chris Allegretta committed
933
#ifndef DISABLE_SPELLER
934
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
935

936
937
938
    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,
939
940
941
942
943
944
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
945

946
947
    sc_init_one(&spell_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
948
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
949
#endif
Chris Allegretta's avatar
Chris Allegretta committed
950

951
#ifndef NANO_SMALL
952
    free_shortcutage(&extcmd_list);
Chris Allegretta's avatar
Chris Allegretta committed
953

954
955
956
    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,
957
958
959
960
961
962
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
963

964
965
    sc_init_one(&extcmd_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
966
	NANO_NO_KEY, VIEW, NULL);
967

968
969
    sc_init_one(&extcmd_list, NANO_TOOTHERINSERT_KEY, N_("Insert File"),
	IFHELP(nano_insert_msg, NANO_NO_KEY), NANO_NO_KEY,
970
	NANO_NO_KEY, VIEW, NULL);
971

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
972
#ifdef ENABLE_MULTIBUFFER
973
    sc_init_one(&extcmd_list, NANO_NO_KEY, new_buffer_msg,
974
	IFHELP(nano_multibuffer_msg, TOGGLE_MULTIBUFFER_KEY),
975
	NANO_NO_KEY, NANO_NO_KEY, NOVIEW, NULL);
976
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
977
#endif
978

979
#ifndef DISABLE_BROWSER
980
    free_shortcutage(&browser_list);
981

982
983
984
    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,
985
986
987
988
989
990
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
991

992
    sc_init_one(&browser_list, NANO_EXIT_KEY, exit_msg,
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
993
	IFHELP(nano_exitbrowser_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
994
	NANO_NO_KEY, VIEW, NULL);
995

996
997
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
998
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
999

1000
1001
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
1002
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
1003

1004
    /* Translators: try to keep this string under 22 characters long */
1005
    sc_init_one(&browser_list, NANO_GOTOLINE_KEY, N_("Go To Dir"),
1006
	IFHELP(nano_gotodir_msg, NANO_GOTOLINE_ALTKEY),
1007
	NANO_GOTOLINE_FKEY, NANO_NO_KEY, VIEW, NULL);
Rocco Corsi's avatar
   
Rocco Corsi committed
1008

1009
    free_shortcutage(&gotodir_list);
1010

1011
1012
1013
    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,
1014
1015
1016
1017
1018
1019
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
1020

1021
1022
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
1023
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
1024
1025
#endif

1026
    currshortcut = main_list;
1027

1028
#ifndef NANO_SMALL
1029
    toggle_init();
1030
#endif
1031
}
1032

1033
1034
1035
1036
/* Deallocate the given shortcut. */
void free_shortcutage(shortcut **shortcutage)
{
    assert(shortcutage != NULL);
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
1037

1038
1039
1040
1041
1042
1043
1044
1045
    while (*shortcutage != NULL) {
	shortcut *ps = *shortcutage;
	*shortcutage = (*shortcutage)->next;
	free(ps);
    }
}

#ifndef NANO_SMALL
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
1046
/* Create a new toggle structure, at the end of the toggles linked
1047
1048
1049
1050
1051
1052
 * list. */
void toggle_init_one(int val, const char *desc, long flag)
{
    toggle *u;

    if (toggles == NULL) {
1053
	toggles = (toggle *)nmalloc(sizeof(toggle));
1054
1055
1056
1057
	u = toggles;
    } else {
	for (u = toggles; u->next != NULL; u = u->next)
	    ;
1058
	u->next = (toggle *)nmalloc(sizeof(toggle));
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
	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);
1076
1077
    toggle_init_one(TOGGLE_MORESPACE_KEY,
	N_("Use of more space for editing"), MORE_SPACE);
1078
1079
1080
1081
#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))
1082
1083
	toggle_init_one(TOGGLE_MULTIBUFFER_KEY,
		N_("Multiple file buffers"), MULTIBUFFER);
1084
#endif
1085
    toggle_init_one(TOGGLE_CUTTOEND_KEY, N_("Cut to end"), CUT_TO_END);
1086
#ifndef DISABLE_WRAPPING
1087
1088
    toggle_init_one(TOGGLE_WRAP_KEY, N_("Long line wrapping"),
	NO_WRAP);
1089
#endif
1090
1091
1092
#ifndef DISABLE_MOUSE
    toggle_init_one(TOGGLE_MOUSE_KEY, N_("Mouse support"), USE_MOUSE);
#endif
1093
1094
1095
1096
    /* 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);
1097
1098
1099
1100
1101
1102
    toggle_init_one(TOGGLE_CONST_KEY,
	N_("Constant cursor position display"), CONST_UPDATE);
    toggle_init_one(TOGGLE_AUTOINDENT_KEY, N_("Auto indent"),
	AUTOINDENT);
    toggle_init_one(TOGGLE_TABSTOSPACES_KEY,
	N_("Conversion of typed tabs to spaces"), TABS_TO_SPACES);
1103
1104
1105
    /* If we're using restricted mode, the DOS/Mac conversion toggle is
     * disabled.  It's useless since inserting files is disabled. */
    if (!ISSET(RESTRICTED))
1106
1107
	toggle_init_one(TOGGLE_NOCONVERT_KEY,
		N_("No conversion from DOS/Mac format"), NO_CONVERT);
1108
1109
1110
    /* If we're using restricted mode, the backup toggle is disabled.
     * It's useless since backups are disabled. */
    if (!ISSET(RESTRICTED))
1111
1112
1113
	toggle_init_one(TOGGLE_BACKUP_KEY, N_("Backup files"),
		BACKUP_FILE);
    toggle_init_one(TOGGLE_SMOOTH_KEY, N_("Smooth scrolling"),
1114
	SMOOTH_SCROLL);
1115
1116
    toggle_init_one(TOGGLE_SMARTHOME_KEY, N_("Smart home key"),
	SMART_HOME);
1117
1118
#ifdef ENABLE_COLOR
    toggle_init_one(TOGGLE_SYNTAX_KEY, N_("Color syntax highlighting"),
1119
	NO_COLOR_SYNTAX);
1120
1121
1122
1123
1124
1125
1126
1127
#endif
#ifdef ENABLE_NANORC
    toggle_init_one(TOGGLE_WHITESPACE_KEY, N_("Whitespace display"),
	WHITESPACE_DISPLAY);
#endif
}
#endif /* !NANO_SMALL */

1128
1129
1130
/* 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
1131
 * function unless debugging is turned on. */
1132
#ifdef DEBUG
1133
/* Added by SPK for memory cleanup; gracefully return our malloc()s. */
Chris Allegretta's avatar
Chris Allegretta committed
1134
void thanks_for_all_the_fish(void)
1135
{
1136
1137
1138
1139
    delwin(topwin);
    delwin(edit);
    delwin(bottomwin);

Chris Allegretta's avatar
Chris Allegretta committed
1140
1141
1142
#ifndef DISABLE_JUSTIFY
    if (quotestr != NULL)
	free(quotestr);
1143
1144
#ifdef HAVE_REGEX_H
    regfree(&quotereg);
1145
1146
    if (quoteerr != NULL)
	free(quoteerr);
1147
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1148
#endif
1149
1150
1151
1152
#ifndef NANO_SMALL
    if (backup_dir != NULL)
        free(backup_dir);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1153
#ifndef DISABLE_OPERATINGDIR
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
    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);
#ifndef DISABLE_SPELLER
    if (alt_speller != NULL)
	free(alt_speller);
#endif
1167
#ifndef DISABLE_HELP
1168
1169
    if (help_text != NULL)
	free(help_text);
1170
#endif
1171
1172
1173
    if (answer != NULL)
	free(answer);
    if (cutbuffer != NULL)
Chris Allegretta's avatar
Chris Allegretta committed
1174
	free_filestruct(cutbuffer);
1175
1176
1177
1178
#ifndef DISABLE_JUSTIFY
    if (jusbuffer != NULL)
	free_filestruct(jusbuffer);
#endif
1179
1180
1181
1182
    free_shortcutage(&main_list);
    free_shortcutage(&whereis_list);
    free_shortcutage(&replace_list);
    free_shortcutage(&replace_list_2);
1183
    free_shortcutage(&gotoline_list);
1184
1185
    free_shortcutage(&writefile_list);
    free_shortcutage(&insertfile_list);
Chris Allegretta's avatar
Chris Allegretta committed
1186
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
1187
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
1188
1189
#endif
#ifndef DISABLE_SPELLER
1190
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
1191
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1192
1193
1194
#ifndef NANO_SMALL
    free_shortcutage(&extcmd_list);
#endif
1195
1196
#ifndef DISABLE_BROWSER
    free_shortcutage(&browser_list);
Chris Allegretta's avatar
Chris Allegretta committed
1197
    free_shortcutage(&gotodir_list);
1198
1199
#endif
#ifndef NANO_SMALL
1200
    /* Free the memory associated with each toggle. */
1201
1202
    while (toggles != NULL) {
	toggle *t = toggles;
1203

1204
1205
1206
1207
	toggles = toggles->next;
	free(t);
    }
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
1208
    /* Free the memory associated with each open file buffer. */
1209
    if (openfile != NULL)
1210
	free_openfilestruct(openfile);
Chris Allegretta's avatar
Chris Allegretta committed
1211
#ifdef ENABLE_COLOR
1212
1213
    if (syntaxstr != NULL)
	free(syntaxstr);
Chris Allegretta's avatar
Chris Allegretta committed
1214
1215
1216
1217
1218
1219
1220
1221
    while (syntaxes != NULL) {
	syntaxtype *bill = syntaxes;

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

	    syntaxes->extensions = bob->next;
1222
1223
1224
	    free(bob->ext_regex);
	    regfree(bob->ext);
	    free(bob->ext);
Chris Allegretta's avatar
Chris Allegretta committed
1225
1226
1227
1228
1229
1230
	    free(bob);
	}
	while (syntaxes->color != NULL) {
	    colortype *bob = syntaxes->color;

	    syntaxes->color = bob->next;
1231
	    free(bob->start_regex);
1232
1233
1234
1235
	    if (bob->start != NULL) {
		regfree(bob->start);
		free(bob->start);
	    }
1236
1237
	    if (bob->end_regex != NULL)
		free(bob->end_regex);
1238
	    if (bob->end != NULL) {
1239
		regfree(bob->end);
1240
1241
		free(bob->end);
	    }
Chris Allegretta's avatar
Chris Allegretta committed
1242
1243
1244
1245
1246
1247
	    free(bob);
	}
	syntaxes = syntaxes->next;
	free(bill);
    }
#endif /* ENABLE_COLOR */
1248
#ifndef NANO_SMALL
1249
    /* Free the search and replace history lists. */
1250
1251
1252
1253
    if (searchage != NULL)
	free_filestruct(searchage);
    if (replaceage != NULL)
	free_filestruct(replaceage);
1254
#endif
1255
#ifdef ENABLE_NANORC
1256
1257
    if (homedir != NULL)
	free(homedir);
1258
#endif
1259
}
1260
#endif /* DEBUG */