global.c 41.7 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

27
#include <stdlib.h>
28
#include <assert.h>
Chris Allegretta's avatar
Chris Allegretta committed
29
30
#include "proto.h"

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

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

Chris Allegretta's avatar
Chris Allegretta committed
39
40
41
42
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? */

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

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

Chris Allegretta's avatar
Chris Allegretta committed
53
54
55
int editwinrows = 0;		/* How many rows long is the edit
				   window? */
filestruct *current;		/* Current buffer pointer */
56
57
58
59
size_t current_x = 0;		/* Current x-coordinate in the edit
				   window */
int current_y = 0;		/* Current y-coordinate in the edit
				   window */
Chris Allegretta's avatar
Chris Allegretta committed
60
61
62
63
64
65
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 */
66
67
68
#ifndef DISABLE_JUSTIFY
filestruct *jusbuffer = NULL;	/* A place to store unjustified text */
#endif
69
70
71
partition *filepart = NULL;	/* A place to store a portion of the
				   file struct */

72
#ifdef ENABLE_MULTIBUFFER
73
74
openfilestruct *open_files = NULL;	/* The list of open file
					   buffers */
75
76
#endif

77
78
79
80
#if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
char *whitespace = NULL;	/* Characters used when displaying
				   the first characters of tabs and
				   spaces. */
81
int whitespace_len[2];		/* The length of the characters. */
82
83
#endif

84
#ifndef DISABLE_JUSTIFY
85
86
87
88
89
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
90
91
char *quotestr = NULL;		/* Quote string.  The default value is
				   set in main(). */
92
93
94
95
96
97
98
#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
99
#endif
100

101
102
103
104
#ifndef NANO_SMALL
char *backup_dir = NULL;	/* Backup directory. */
#endif

Chris Allegretta's avatar
Chris Allegretta committed
105
char *answer = NULL;		/* Answer str to many questions */
Chris Allegretta's avatar
Chris Allegretta committed
106
int totlines = 0;		/* Total number of lines in the file */
107
108
size_t totsize = 0;		/* Total number of characters in the
				   file */
109
size_t placewewant = 0;		/* The column we'd like the cursor
Chris Allegretta's avatar
Chris Allegretta committed
110
111
112
				   to jump to when we go to the
				   next or previous line */

113
114
ssize_t tabsize = -1;		/* Our internal tabsize variable.  The
				   default value is set in main(). */
115

Chris Allegretta's avatar
Chris Allegretta committed
116
char *hblank = NULL;		/* A horizontal blank line */
Chris Allegretta's avatar
Chris Allegretta committed
117
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
118
char *help_text;		/* The text in the help window */
Chris Allegretta's avatar
Chris Allegretta committed
119
#endif
Chris Allegretta's avatar
Chris Allegretta committed
120
121
122

/* More stuff for the marker select */

Chris Allegretta's avatar
Chris Allegretta committed
123
#ifndef NANO_SMALL
124
filestruct *mark_beginbuf;	/* The begin marker buffer */
125
size_t mark_beginx;		/* X value in the string to start */
Chris Allegretta's avatar
Chris Allegretta committed
126
#endif
Chris Allegretta's avatar
Chris Allegretta committed
127

128
#ifndef DISABLE_OPERATINGDIR
129
130
char *operating_dir = NULL;	/* Operating directory, which we can't */
char *full_operating_dir = NULL;/* go higher than */
131
132
#endif

133
#ifndef DISABLE_SPELLER
134
char *alt_speller = NULL;		/* Alternative spell command */
135
136
#endif

137
138
139
shortcut *main_list = NULL;
shortcut *whereis_list = NULL;
shortcut *replace_list = NULL;
140
shortcut *replace_list_2 = NULL; 	/* 2nd half of replace dialog */
141
shortcut *gotoline_list = NULL;
142
143
shortcut *writefile_list = NULL;
shortcut *insertfile_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
144
#ifndef DISABLE_HELP
145
shortcut *help_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
146
147
#endif
#ifndef DISABLE_SPELLER
148
shortcut *spell_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
149
#endif
Chris Allegretta's avatar
Chris Allegretta committed
150
#ifndef NANO_SMALL
151
shortcut *extcmd_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
152
#endif
153
#ifndef DISABLE_BROWSER
154
shortcut *browser_list = NULL;
155
shortcut *gotodir_list = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
156
#endif
157

158
#ifdef ENABLE_COLOR
159
160
161
const colortype *colorstrings = NULL;
syntaxtype *syntaxes = NULL;
char *syntaxstr = NULL;
162
163
#endif

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

166
#ifndef NANO_SMALL
167
toggle *toggles = NULL;
168
#endif
Chris Allegretta's avatar
Chris Allegretta committed
169

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
170
#if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
171
172
173
174
175
176
filestruct *search_history = NULL;
filestruct *searchage = NULL;
filestruct *searchbot = NULL;
filestruct *replace_history = NULL;
filestruct *replaceage = NULL;
filestruct *replacebot = NULL;
177
178
#endif

179
/* Regular expressions */
180
#ifdef HAVE_REGEX_H
181
182
183
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
184
#endif
185

186
bool curses_ended = FALSE;	/* Indicates to statusbar() to simply
187
188
189
				 * write to stderr, since endwin() has
				 * ended curses mode. */

190
191
char *homedir = NULL;		/* $HOME or from /etc/passwd. */

192
size_t length_of_list(const shortcut *s)
193
{
194
    size_t i = 0;
195

196
    for (; s != NULL; s = s->next)
197
198
199
200
	i++;
    return i;
}

Chris Allegretta's avatar
Chris Allegretta committed
201
/* Initialize a struct *without* our lovely braces =( */
202
void sc_init_one(shortcut **shortcutage, int ctrlval, const char *desc,
203
#ifndef DISABLE_HELP
204
	const char *help,
205
#endif
206
	int metaval, int funcval, int miscval, bool view, void
207
	(*func)(void))
Chris Allegretta's avatar
Chris Allegretta committed
208
{
209
210
211
    shortcut *s;

    if (*shortcutage == NULL) {
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
212
	*shortcutage = (shortcut *)nmalloc(sizeof(shortcut));
213
214
215
216
	s = *shortcutage;
    } else {
	for (s = *shortcutage; s->next != NULL; s = s->next)
	    ;
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
217
	s->next = (shortcut *)nmalloc(sizeof(shortcut));
218
219
220
	s = s->next; 
    }

221
    s->ctrlval = ctrlval;
222
    s->desc = _(desc);
223
#ifndef DISABLE_HELP
224
    s->help = _(help);
225
#endif
226
227
228
    s->metaval = metaval;
    s->funcval = funcval;
    s->miscval = miscval;
Chris Allegretta's avatar
Chris Allegretta committed
229
230
    s->viewok = view;
    s->func = func;
231
    s->next = NULL;
Chris Allegretta's avatar
Chris Allegretta committed
232
233
}

234
void shortcut_init(bool unjustify)
235
{
236
237
238
239
240
241
242
243
244
    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");
245
246
247
#ifndef NANO_SMALL
    const char *cut_till_end_msg = N_("CutTillEnd");
#endif
248
249
250
251
252
#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
253
254
255
256
257
#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");
258
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
259
#ifdef ENABLE_NANORC
260
    const char *history_msg = N_("History");
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
261
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
262
#ifdef ENABLE_MULTIBUFFER
263
    const char *new_buffer_msg = N_("New Buffer");
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
264
#endif
265
266
267
#endif /* !NANO_SMALL */
#ifndef DISABLE_BROWSER
    const char *to_files_msg = N_("To Files");
268
#endif
269

270
271
272
#ifndef DISABLE_HELP
    const char *nano_help_msg = N_("Invoke the help menu");
    const char *nano_exit_msg =
273
#ifdef ENABLE_MULTIBUFFER
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
	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");
292
293
    const char *nano_gotoline_msg =
	N_("Go to a specific line number and column number");
294
    const char *nano_replace_msg = N_("Replace text within the editor");
295
#ifndef NANO_SMALL
296
297
    const char *nano_mark_msg = N_("Mark text at the cursor position");
    const char *nano_whereis_next_msg = N_("Repeat last search");
298
#endif
299
300
301
302
303
304
305
306
307
308
    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_delete_msg = N_("Delete the character under the cursor");
    const char *nano_backspace_msg =
	N_("Delete the character to the left of the cursor");
309
310
    const char *nano_tab_msg =
	N_("Insert a tab character at the cursor position");
311
312
    const char *nano_enter_msg =
	N_("Insert a carriage return at the cursor position");
313
#ifndef NANO_SMALL
314
315
    const char *nano_nextword_msg = N_("Move forward one word");
    const char *nano_prevword_msg = N_("Move backward one word");
316
#endif
317
318
319
320
321
322
#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
323
#ifdef ENABLE_MULTIBUFFER
324
325
326
327
    const char *nano_openprev_msg = N_("Switch to the previous file buffer");
    const char *nano_opennext_msg = N_("Switch to the next file buffer");
#endif
    const char *nano_verbatim_msg = N_("Insert character(s) verbatim");
328
329
330
331
#ifndef NANO_SMALL
    const char *nano_cut_till_end_msg =
	N_("Cut from the cursor position to the end of the file");
#endif
332
333
#ifndef DISABLE_JUSTIFY
    const char *nano_fulljustify_msg = N_("Justify the entire file");
334
#endif
335
#if !defined(NANO_SMALL) && defined(HAVE_REGEX_H)
336
    const char *nano_bracket_msg = N_("Find other bracket");
337
#endif
338
339
340
341
342
343
344
345
346
347
    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");
#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");
348
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
349
#ifdef ENABLE_NANORC
350
351
352
    const char *nano_history_msg =
	N_("Edit the previous search/replace strings");
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
353
#endif /* !NANO_SMALL */
354

355
356
#ifndef DISABLE_BROWSER
    const char *nano_tofiles_msg = N_("Go to file browser");
Chris Allegretta's avatar
Chris Allegretta committed
357
#endif
358
359
360
#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");
361
#endif
362
363
364
365
366
    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");
367
#endif
368
#if !defined(NANO_SMALL) && defined(ENABLE_MULTIBUFFER)
369
370
371
    const char *nano_multibuffer_msg = N_("Insert into new buffer");
#endif
#ifndef DISABLE_BROWSER
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
372
373
    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
374
#endif
375
#endif /* !DISABLE_HELP */
Chris Allegretta's avatar
Chris Allegretta committed
376

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
377
378
379
/* 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
380
#ifndef DISABLE_HELP
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
381
#define IFHELP(help, nextvar) help, nextvar
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
382
#else
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
383
#define IFHELP(help, nextvar) nextvar
384
#endif
385

386
387
    free_shortcutage(&main_list);

388
    /* Translators: try to keep this string under 10 characters long */
389
390
391
    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,
392
393
394
395
396
397
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
398

399
    /* Translators: try to keep this string under 10 characters long */
400
401
402
403
    sc_init_one(&main_list, NANO_EXIT_KEY,
#ifdef ENABLE_MULTIBUFFER
	open_files != NULL && open_files != open_files->next ?
	N_("Close") :
404
#endif
405
406
	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
407

408
    /* Translators: try to keep this string under 10 characters long */
409
410
411
    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
412

413
    /* Translators: try to keep this string under 10 characters long */
414
415
416
    sc_init_one(&main_list, NANO_JUSTIFY_KEY, N_("Justify"),
	IFHELP(nano_justify_msg, NANO_NO_KEY),
	NANO_JUSTIFY_FKEY, NANO_NO_KEY, NOVIEW,
417
#ifndef DISABLE_JUSTIFY
418
		do_justify_void
419
420
421
422
#else
		nano_disabled_msg
#endif
		);
423

424
425
426
427
428
    /* 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. */
429
    /* Translators: try to keep this string under 10 characters long */
430
431
432
    sc_init_one(&main_list, NANO_INSERTFILE_KEY, N_("Read File"),
	IFHELP(nano_insert_msg, NANO_NO_KEY), NANO_INSERTFILE_FKEY,
	NANO_NO_KEY,
433
#ifdef ENABLE_MULTIBUFFER
434
		VIEW
435
#else
436
		NOVIEW
437
#endif
438
439
		, !ISSET(RESTRICTED) ? do_insertfile_void :
		nano_disabled_msg);
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_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
445

446
    /* Translators: try to keep this string under 10 characters long */
447
448
449
    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
450

451
    /* Translators: try to keep this string under 10 characters long */
452
453
454
    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
455

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

461
    if (unjustify)
462
    /* Translators: try to keep this string under 10 characters long */
463
464
	sc_init_one(&main_list, NANO_UNJUSTIFY_KEY, N_("UnJustify"),
		IFHELP(NULL, NANO_NO_KEY), NANO_UNJUSTIFY_FKEY,
465
		NANO_NO_KEY, NOVIEW, NULL);
466
    else
467
    /* Translators: try to keep this string under 10 characters long */
468
	sc_init_one(&main_list, NANO_UNCUT_KEY, N_("UnCut Txt"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
469
470
		IFHELP(nano_uncut_msg, NANO_NO_KEY), NANO_UNCUT_FKEY,
		NANO_NO_KEY, NOVIEW, do_uncut_text);
Chris Allegretta's avatar
Chris Allegretta committed
471

472
    /* Translators: try to keep this string under 10 characters long */
473
474
475
    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
476

477
478
479
    /* 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. */
480
    /* Translators: try to keep this string under 10 characters long */
481
    sc_init_one(&main_list, NANO_SPELL_KEY, N_("To Spell"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
482
		IFHELP(nano_spell_msg, NANO_NO_KEY), NANO_SPELL_FKEY,
483
484
485
486
487
		NANO_NO_KEY, NOVIEW,
#ifndef DISABLE_SPELLER
		!ISSET(RESTRICTED) ? do_spell :
#endif
		nano_disabled_msg);
488

489
    sc_init_one(&main_list, NANO_GOTOLINE_KEY, go_to_line_msg,
490
	IFHELP(nano_gotoline_msg, NANO_GOTOLINE_ALTKEY),
491
492
	NANO_GOTOLINE_FKEY, NANO_NO_KEY, VIEW,
	do_gotolinecolumn_void);
493

494
    sc_init_one(&main_list, NANO_REPLACE_KEY, replace_msg,
495
496
	IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY),
	NANO_REPLACE_FKEY, NANO_NO_KEY, NOVIEW, do_replace);
Chris Allegretta's avatar
Chris Allegretta committed
497

498
#ifndef NANO_SMALL
499
500
    sc_init_one(&main_list, NANO_MARK_KEY, N_("Mark Text"),
	IFHELP(nano_mark_msg, NANO_MARK_ALTKEY), NANO_MARK_FKEY,
501
	NANO_NO_KEY, NOVIEW, do_mark);
502
503
504

    sc_init_one(&main_list, NANO_NO_KEY, N_("Where Is Next"),
	IFHELP(nano_whereis_next_msg, NANO_WHEREIS_NEXT_KEY),
505
	NANO_WHEREIS_NEXT_FKEY, NANO_NO_KEY, VIEW, do_research);
506
507
#endif

508
509
510
    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
511

512
513
514
    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
515

516
517
518
    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
519

520
521
522
    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
523

524
525
526
    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
527

528
529
530
    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
531

532
533
534
    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
535

536
537
538
    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
539

540
541
542
    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
543

544
545
546
    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
547

548
549
550
    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);
551

552
#ifndef NANO_SMALL
553
554
555
    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);
556

557
558
559
    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);
560
#endif
561

562
563
564
565
#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,
566
	NANO_PARABEGIN_ALTKEY2, VIEW, do_para_begin_void);
567
568
569
570

    /* 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,
571
	NANO_PARAEND_ALTKEY2, VIEW, do_para_end_void);
572
#endif
573

574
#ifdef ENABLE_MULTIBUFFER
575
576
577
    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);
578

579
580
581
    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);
582
#endif
583

584
585
586
587
    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);

588
589
590
591
592
593
594
#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

595
596
597
#ifndef DISABLE_JUSTIFY
    /* Translators: try to keep this string under 10 characters long */
    sc_init_one(&main_list, NANO_NO_KEY, fulljstify_msg,
598
599
	IFHELP(nano_fulljustify_msg, NANO_FULLJUSTIFY_ALTKEY),
	NANO_NO_KEY, NANO_NO_KEY, NOVIEW, do_full_justify);
600
601
#endif

602
#if !defined(NANO_SMALL) && defined(HAVE_REGEX_H)
603
604
605
    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);
606
607
#endif

608
    free_shortcutage(&whereis_list);
609

610
611
612
    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,
613
614
615
616
617
618
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
619

620
    /* Translators: try to keep this string under 10 characters long */
621
622
    sc_init_one(&whereis_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
623
	NANO_NO_KEY, VIEW, NULL);
624

625
    /* Translators: try to keep this string under 10 characters long */
626
627
628
    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
629

630
    /* Translators: try to keep this string under 10 characters long */
631
632
633
    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
634

635
    /* Translators: try to keep this string under 10 characters long */
636
    sc_init_one(&whereis_list, NANO_TOOTHERSEARCH_KEY, replace_msg,
637
	IFHELP(nano_replace_msg, NANO_NO_KEY), NANO_REPLACE_FKEY,
638
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
639

640
    /* Translators: try to keep this string under 10 characters long */
641
642
    sc_init_one(&whereis_list, NANO_TOGOTOLINE_KEY, go_to_line_msg,
	IFHELP(nano_gotoline_msg, NANO_NO_KEY), NANO_GOTOLINE_FKEY,
643
	NANO_NO_KEY, VIEW, NULL);
644

645
646
#ifndef DISABLE_JUSTIFY
    /* Translators: try to keep this string under 10 characters long */
647
    sc_init_one(&whereis_list, NANO_PARABEGIN_KEY, beg_of_par_msg,
648
	IFHELP(nano_parabegin_msg, NANO_PARABEGIN_ALTKEY1), NANO_NO_KEY,
649
	NANO_PARABEGIN_ALTKEY2, VIEW, do_para_begin_void);
650
651

    /* Translators: try to keep this string under 10 characters long */
652
    sc_init_one(&whereis_list, NANO_PARAEND_KEY, end_of_par_msg,
653
	IFHELP(nano_paraend_msg, NANO_PARAEND_ALTKEY1), NANO_NO_KEY,
654
	NANO_PARAEND_ALTKEY2, VIEW, do_para_end_void);
655
656
#endif

657
#ifndef NANO_SMALL
658
    /* Translators: try to keep this string under 10 characters long */
659
660
    sc_init_one(&whereis_list, NANO_NO_KEY, case_sens_msg,
	IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY,
661
	NANO_NO_KEY, VIEW, NULL);
662

663
    /* Translators: try to keep this string under 10 characters long */
664
665
    sc_init_one(&whereis_list, NANO_NO_KEY, direction_msg,
	IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY,
666
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
667

668
#ifdef HAVE_REGEX_H
669
    /* Translators: try to keep this string under 10 characters long */
670
671
    sc_init_one(&whereis_list, NANO_NO_KEY, regexp_msg,
	IFHELP(nano_regexp_msg, TOGGLE_REGEXP_KEY), NANO_NO_KEY,
672
	NANO_NO_KEY, VIEW, NULL);
673
#endif
674

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
675
#ifdef ENABLE_NANORC
676
    /* Translators: try to keep this string under 10 characters long */
677
678
    sc_init_one(&whereis_list, NANO_PREVLINE_KEY, history_msg,
	IFHELP(nano_history_msg, NANO_NO_KEY), NANO_NO_KEY,
679
	NANO_NO_KEY, VIEW, NULL);
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
680
#endif
681
682
683
684
685

    /* 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);
686
#endif /* !NANO_SMALL */
687
688
689
690
691
692
693

#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
694

695
    free_shortcutage(&replace_list);
696

697
698
699
    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,
700
701
702
703
704
705
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
706

707
708
    sc_init_one(&replace_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
709
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
710

711
712
713
    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
714

715
716
717
    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
718

719
    /* Translators: try to keep this string under 12 characters long */
720
    sc_init_one(&replace_list, NANO_TOOTHERSEARCH_KEY, N_("No Replace"),
721
	IFHELP(nano_whereis_msg, NANO_NO_KEY), NANO_REPLACE_FKEY,
722
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
723

724
725
    sc_init_one(&replace_list, NANO_TOGOTOLINE_KEY, go_to_line_msg,
	IFHELP(nano_gotoline_msg, NANO_NO_KEY), NANO_GOTOLINE_FKEY,
726
	NANO_NO_KEY, VIEW, NULL);
727

728
#ifndef NANO_SMALL
729
730
    sc_init_one(&replace_list, NANO_NO_KEY, case_sens_msg,
	IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY,
731
	NANO_NO_KEY, VIEW, NULL);
732

733
734
    sc_init_one(&replace_list, NANO_NO_KEY, direction_msg,
	IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY,
735
	NANO_NO_KEY, VIEW, NULL);
736

737
#ifdef HAVE_REGEX_H
738
739
    sc_init_one(&replace_list, NANO_NO_KEY, regexp_msg,
	IFHELP(nano_regexp_msg, TOGGLE_REGEXP_KEY), NANO_NO_KEY,
740
	NANO_NO_KEY, VIEW, NULL);
741
#endif
742

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
743
#ifndef ENABLE_NANORC
744
745
    sc_init_one(&replace_list, NANO_PREVLINE_KEY, history_msg,
	IFHELP(nano_history_msg, NANO_NO_KEY), NANO_NO_KEY,
746
	NANO_NO_KEY, VIEW, NULL);
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
747
#endif
748
#endif /* !NANO_SMALL */
749

750
    free_shortcutage(&replace_list_2);
751

752
753
754
    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,
755
756
757
758
759
760
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
761

762
763
    sc_init_one(&replace_list_2, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
764
	NANO_NO_KEY, VIEW, NULL);
765

766
767
768
    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);
769

770
771
772
    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);
773

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
774
#if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
775
776
    sc_init_one(&replace_list_2, NANO_PREVLINE_KEY, history_msg,
	IFHELP(nano_history_msg, NANO_NO_KEY), NANO_NO_KEY,
777
	NANO_NO_KEY, VIEW, NULL);
778
779
#endif

780
    free_shortcutage(&gotoline_list);
Chris Allegretta's avatar
Chris Allegretta committed
781

782
    sc_init_one(&gotoline_list, NANO_HELP_KEY, get_help_msg,
783
784
	IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY,
	NANO_NO_KEY, VIEW,
785
786
787
788
789
790
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
791

792
    sc_init_one(&gotoline_list, NANO_CANCEL_KEY, cancel_msg,
793
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
794
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
795

796
    sc_init_one(&gotoline_list, NANO_FIRSTLINE_KEY, first_line_msg,
797
798
	IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_first_line);
Chris Allegretta's avatar
Chris Allegretta committed
799

800
    sc_init_one(&gotoline_list, NANO_LASTLINE_KEY, last_line_msg,
801
802
	IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, do_last_line);
Chris Allegretta's avatar
Chris Allegretta committed
803

804
805
    sc_init_one(&gotoline_list, NANO_TOOTHERWHEREIS_KEY,
	N_("Go To Text"), IFHELP(nano_whereis_msg, NANO_NO_KEY),
806
	NANO_NO_KEY, NANO_NO_KEY, VIEW, NULL);
807

Chris Allegretta's avatar
Chris Allegretta committed
808
#ifndef DISABLE_HELP
809
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
810

811
812
813
814
815
816
817
818
    sc_init_one(&help_list, NANO_REFRESH_KEY, N_("Refresh"),
	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);

819
820
    sc_init_one(&help_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
821
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
822

823
824
    sc_init_one(&help_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
825
	NANO_NO_KEY, VIEW, NULL);
826

827
828
    sc_init_one(&help_list, NANO_PREVLINE_KEY, N_("Prev Line"),
	IFHELP(nano_prevline_msg, NANO_NO_KEY), NANO_NO_KEY,
829
	NANO_NO_KEY, VIEW, NULL);
830

831
832
    sc_init_one(&help_list, NANO_NEXTLINE_KEY, N_("Next Line"),
	IFHELP(nano_nextline_msg, NANO_NO_KEY), NANO_NO_KEY,
833
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
834
#endif
Chris Allegretta's avatar
Chris Allegretta committed
835

836
    free_shortcutage(&writefile_list);
Chris Allegretta's avatar
Chris Allegretta committed
837

838
839
840
    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,
841
842
843
844
845
846
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
847

848
849
    sc_init_one(&writefile_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
850
	NANO_NO_KEY, VIEW, NULL);
851

852
#ifndef DISABLE_BROWSER
853
854
    /* If we're using restricted mode, the file browser is disabled.
     * It's useless since inserting files is disabled. */
855
    /* Translators: try to keep this string under 16 characters long */
856
    if (!ISSET(RESTRICTED))
857
	sc_init_one(&writefile_list, NANO_TOFILES_KEY, to_files_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
858
		IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY,
859
		NANO_NO_KEY, NOVIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
860
#endif
Chris Allegretta's avatar
Chris Allegretta committed
861

862
#ifndef NANO_SMALL
863
864
865
866
867
868
    /* 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. */
869
    /* Translators: try to keep this string under 16 characters long */
870
    if (!ISSET(RESTRICTED))
871
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("DOS Format"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
872
		IFHELP(nano_dos_msg, TOGGLE_DOS_KEY), NANO_NO_KEY,
873
		NANO_NO_KEY, NOVIEW, NULL);
874

875
    /* Translators: try to keep this string under 16 characters long */
876
    if (!ISSET(RESTRICTED))
877
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Mac Format"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
878
		IFHELP(nano_mac_msg, TOGGLE_MAC_KEY), NANO_NO_KEY,
879
		NANO_NO_KEY, NOVIEW, NULL);
880
881
#endif

882
    /* Translators: try to keep this string under 16 characters long */
883
    if (!ISSET(RESTRICTED))
884
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Append"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
885
		IFHELP(nano_append_msg, NANO_APPEND_KEY), NANO_NO_KEY,
886
		NANO_NO_KEY, NOVIEW, NULL);
887

888
    /* Translators: try to keep this string under 16 characters long */
889
    if (!ISSET(RESTRICTED))
890
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Prepend"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
891
		IFHELP(nano_prepend_msg, NANO_PREPEND_KEY), NANO_NO_KEY,
892
		NANO_NO_KEY, NOVIEW, NULL);
893

894
#ifndef NANO_SMALL
895
    /* Translators: try to keep this string under 16 characters long */
896
    if (!ISSET(RESTRICTED))
897
	sc_init_one(&writefile_list, NANO_NO_KEY, N_("Backup File"),
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
898
		IFHELP(nano_backup_msg, TOGGLE_BACKUP_KEY), NANO_NO_KEY,
899
		NANO_NO_KEY, NOVIEW, NULL);
900
901
#endif

902
    free_shortcutage(&insertfile_list);
903

904
905
906
    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,
907
908
909
910
911
912
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
913

914
    sc_init_one(&insertfile_list, NANO_CANCEL_KEY, cancel_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
915
		IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
916
		NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
917

918
#ifndef DISABLE_BROWSER
919
920
    /* If we're using restricted mode, the file browser is disabled.
     * It's useless since inserting files is disabled. */
921
    if (!ISSET(RESTRICTED))
922
	sc_init_one(&insertfile_list, NANO_TOFILES_KEY, to_files_msg,
David Lawrence Ramsey's avatar
   
David Lawrence Ramsey committed
923
		IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY,
924
		NANO_NO_KEY, NOVIEW, NULL);
925
#endif
926

927
#ifndef NANO_SMALL
928
929
    /* If we're using restricted mode, command execution is disabled.
     * It's useless since inserting files is disabled. */
930
    /* Translators: try to keep this string under 22 characters long */
931
    if (!ISSET(RESTRICTED))
932
933
	sc_init_one(&insertfile_list, NANO_TOOTHERINSERT_KEY,
		N_("Execute Command"), IFHELP(nano_execute_msg,
934
		NANO_NO_KEY), NANO_NO_KEY, NANO_NO_KEY, NOVIEW, NULL);
935

936
#ifdef ENABLE_MULTIBUFFER
937
938
    /* If we're using restricted mode, the multibuffer toggle is
     * disabled.  It's useless since inserting files is disabled. */
939
    /* Translators: try to keep this string under 22 characters long */
940
    if (!ISSET(RESTRICTED))
941
	sc_init_one(&insertfile_list, NANO_NO_KEY, new_buffer_msg,
942
		IFHELP(nano_multibuffer_msg, TOGGLE_MULTIBUFFER_KEY),
943
		NANO_NO_KEY, NANO_NO_KEY, NOVIEW, NULL);
944
#endif
945
#endif
946

Chris Allegretta's avatar
Chris Allegretta committed
947
#ifndef DISABLE_SPELLER
948
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
949

950
951
952
    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,
953
954
955
956
957
958
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
959

960
961
    sc_init_one(&spell_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
962
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
963
#endif
Chris Allegretta's avatar
Chris Allegretta committed
964

965
#ifndef NANO_SMALL
966
    free_shortcutage(&extcmd_list);
Chris Allegretta's avatar
Chris Allegretta committed
967

968
969
970
    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,
971
972
973
974
975
976
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
977

978
979
    sc_init_one(&extcmd_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
980
	NANO_NO_KEY, VIEW, NULL);
981

982
983
    sc_init_one(&extcmd_list, NANO_TOOTHERINSERT_KEY, N_("Insert File"),
	IFHELP(nano_insert_msg, NANO_NO_KEY), NANO_NO_KEY,
984
	NANO_NO_KEY, VIEW, NULL);
985

David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
986
#ifdef ENABLE_MULTIBUFFER
987
    sc_init_one(&extcmd_list, NANO_NO_KEY, new_buffer_msg,
988
	IFHELP(nano_multibuffer_msg, TOGGLE_MULTIBUFFER_KEY),
989
	NANO_NO_KEY, NANO_NO_KEY, NOVIEW, NULL);
990
#endif
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
991
#endif
992

993
#ifndef DISABLE_BROWSER
994
    free_shortcutage(&browser_list);
995

996
997
998
    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,
999
1000
1001
1002
1003
1004
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
1005

1006
    sc_init_one(&browser_list, NANO_EXIT_KEY, exit_msg,
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
1007
	IFHELP(nano_exitbrowser_msg, NANO_NO_KEY), NANO_EXIT_FKEY,
1008
	NANO_NO_KEY, VIEW, NULL);
1009

1010
1011
    sc_init_one(&browser_list, NANO_PREVPAGE_KEY, prev_page_msg,
	IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY,
1012
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
1013

1014
1015
    sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, next_page_msg,
	IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY,
1016
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
1017

1018
1019
1020
1021
    sc_init_one(&browser_list, NANO_REFRESH_KEY, N_("Refresh"),
	IFHELP(nano_refresh_msg, NANO_NO_KEY), NANO_NO_KEY,
	NANO_NO_KEY, VIEW, NULL);

1022
    /* Translators: try to keep this string under 22 characters long */
1023
    sc_init_one(&browser_list, NANO_GOTOLINE_KEY, N_("Go To Dir"),
1024
	IFHELP(nano_gotodir_msg, NANO_GOTOLINE_ALTKEY),
1025
	NANO_GOTOLINE_FKEY, NANO_NO_KEY, VIEW, NULL);
Rocco Corsi's avatar
   
Rocco Corsi committed
1026

1027
    free_shortcutage(&gotodir_list);
1028

1029
1030
1031
    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,
1032
1033
1034
1035
1036
1037
#ifndef DISABLE_HELP
		do_help
#else
		nano_disabled_msg
#endif
		);
Chris Allegretta's avatar
Chris Allegretta committed
1038

1039
1040
    sc_init_one(&gotodir_list, NANO_CANCEL_KEY, cancel_msg,
	IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY,
1041
	NANO_NO_KEY, VIEW, NULL);
Chris Allegretta's avatar
Chris Allegretta committed
1042
1043
#endif

1044
    currshortcut = main_list;
1045

1046
#ifndef NANO_SMALL
1047
    toggle_init();
1048
#endif
1049
}
1050

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

1142
1143
1144
/* 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
1145
 * function unless debugging is turned on. */
1146
#ifdef DEBUG
1147
/* Added by SPK for memory cleanup; gracefully return our malloc()s. */
Chris Allegretta's avatar
Chris Allegretta committed
1148
void thanks_for_all_the_fish(void)
1149
{
1150
1151
1152
1153
    delwin(topwin);
    delwin(edit);
    delwin(bottomwin);

Chris Allegretta's avatar
Chris Allegretta committed
1154
1155
1156
#ifndef DISABLE_JUSTIFY
    if (quotestr != NULL)
	free(quotestr);
1157
1158
#ifdef HAVE_REGEX_H
    regfree(&quotereg);
1159
1160
    if (quoteerr != NULL)
	free(quoteerr);
1161
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1162
#endif
1163
1164
1165
1166
#ifndef NANO_SMALL
    if (backup_dir != NULL)
        free(backup_dir);
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1167
#ifndef DISABLE_OPERATINGDIR
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
    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
1183
#ifndef DISABLE_HELP
1184
1185
    if (help_text != NULL)
	free(help_text);
1186
#endif
1187
1188
1189
1190
1191
    if (filename != NULL)
	free(filename);
    if (answer != NULL)
	free(answer);
    if (cutbuffer != NULL)
Chris Allegretta's avatar
Chris Allegretta committed
1192
	free_filestruct(cutbuffer);
1193
1194
1195
1196
#ifndef DISABLE_JUSTIFY
    if (jusbuffer != NULL)
	free_filestruct(jusbuffer);
#endif
1197
1198
1199
1200
    free_shortcutage(&main_list);
    free_shortcutage(&whereis_list);
    free_shortcutage(&replace_list);
    free_shortcutage(&replace_list_2);
1201
    free_shortcutage(&gotoline_list);
1202
1203
    free_shortcutage(&writefile_list);
    free_shortcutage(&insertfile_list);
Chris Allegretta's avatar
Chris Allegretta committed
1204
#ifndef DISABLE_HELP
Chris Allegretta's avatar
Chris Allegretta committed
1205
    free_shortcutage(&help_list);
Chris Allegretta's avatar
Chris Allegretta committed
1206
1207
#endif
#ifndef DISABLE_SPELLER
1208
    free_shortcutage(&spell_list);
Chris Allegretta's avatar
Chris Allegretta committed
1209
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1210
1211
1212
#ifndef NANO_SMALL
    free_shortcutage(&extcmd_list);
#endif
1213
1214
#ifndef DISABLE_BROWSER
    free_shortcutage(&browser_list);
Chris Allegretta's avatar
Chris Allegretta committed
1215
    free_shortcutage(&gotodir_list);
1216
1217
#endif
#ifndef NANO_SMALL
1218
    /* Free the memory associated with each toggle. */
1219
1220
    while (toggles != NULL) {
	toggle *t = toggles;
1221

1222
1223
1224
1225
	toggles = toggles->next;
	free(t);
    }
#endif
1226
#ifdef ENABLE_MULTIBUFFER
David Lawrence Ramsey's avatar
David Lawrence Ramsey committed
1227
    /* Free the memory associated with each open file buffer. */
1228
1229
1230
1231
1232
    if (open_files != NULL) {
	/* Make sure open_files->fileage is up to date, in case we've
	 * cut the top line of the file. */
	open_files->fileage = fileage;

Chris Allegretta's avatar
Chris Allegretta committed
1233
	free_openfilestruct(open_files);
1234
    }
1235
#else
1236
1237
    if (fileage != NULL)
	free_filestruct(fileage);
1238
#endif
Chris Allegretta's avatar
Chris Allegretta committed
1239
#ifdef ENABLE_COLOR
1240
1241
    if (syntaxstr != NULL)
	free(syntaxstr);
Chris Allegretta's avatar
Chris Allegretta committed
1242
1243
1244
1245
1246
1247
1248
1249
    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
1250
	    regfree(&bob->val);
Chris Allegretta's avatar
Chris Allegretta committed
1251
1252
1253
1254
1255
1256
	    free(bob);
	}
	while (syntaxes->color != NULL) {
	    colortype *bob = syntaxes->color;

	    syntaxes->color = bob->next;
Chris Allegretta's avatar
Chris Allegretta committed
1257
1258
	    regfree(&bob->start);
	    if (bob->end != NULL)
1259
1260
		regfree(bob->end);
	    free(bob->end);
Chris Allegretta's avatar
Chris Allegretta committed
1261
1262
1263
1264
1265
1266
	    free(bob);
	}
	syntaxes = syntaxes->next;
	free(bill);
    }
#endif /* ENABLE_COLOR */
1267
#ifndef NANO_SMALL
1268
    /* Free the search and replace history lists. */
1269
1270
1271
1272
    if (searchage != NULL)
	free_filestruct(searchage);
    if (replaceage != NULL)
	free_filestruct(replaceage);
1273
#endif
1274
#ifdef ENABLE_NANORC
1275
1276
    if (homedir != NULL)
	free(homedir);
1277
#endif
1278
}
1279
#endif /* DEBUG */