External command code and fix for BUG #70
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1136 35c25a1d-7b9e-4130-9fde-d3aeb78583b8master
parent
7fa082dc90
commit
52c5a6ea48
1
BUGS
1
BUGS
|
@ -131,6 +131,7 @@
|
||||||
Trevor Cordes) (68) [FIXED].
|
Trevor Cordes) (68) [FIXED].
|
||||||
- Home and End control keys (^A, ^E) do not always work in filename
|
- Home and End control keys (^A, ^E) do not always work in filename
|
||||||
prompt (bug found by Ian Turner) (69) [1.0 series only] [FIXED].
|
prompt (bug found by Ian Turner) (69) [1.0 series only] [FIXED].
|
||||||
|
- Trying to insert a file of 0 bytes will hang nano (70) [FIXED].
|
||||||
** Open BUGS **
|
** Open BUGS **
|
||||||
|
|
||||||
$Id$
|
$Id$
|
||||||
|
|
|
@ -2,9 +2,14 @@ CVS code -
|
||||||
- General
|
- General
|
||||||
- Type misalignments and mem leaks in renumber_all, do_justify
|
- Type misalignments and mem leaks in renumber_all, do_justify
|
||||||
and do_spell (Rocco & Steven Kneizys).
|
and do_spell (Rocco & Steven Kneizys).
|
||||||
|
- New "External Command" code, originally by Dwayne Rightler.
|
||||||
|
New function files.c:open_pipe(), changes to do_insertfile(),
|
||||||
|
new list extcmd_list, cmd is ^X after ^R by default.
|
||||||
- files.c:
|
- files.c:
|
||||||
check_writable_directory()
|
check_writable_directory()
|
||||||
- Stat full_path, not path (Steven Kneizys).
|
- Stat full_path, not path (Steven Kneizys).
|
||||||
|
read_file()
|
||||||
|
- Abort if we read a file of 0 lines (num_lines == 0), fixes BUG #70.
|
||||||
- nano.c:
|
- nano.c:
|
||||||
help_init()
|
help_init()
|
||||||
- Capitalize Meta altkeys.
|
- Capitalize Meta altkeys.
|
||||||
|
|
68
files.c
68
files.c
|
@ -241,7 +241,15 @@ int read_file(int fd, char *filename, int quiet)
|
||||||
num_lines++;
|
num_lines++;
|
||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
}
|
}
|
||||||
/* Did we even GET a file? */
|
|
||||||
|
/* Did we try to insert a file of 0 bytes? */
|
||||||
|
if (num_lines == 0)
|
||||||
|
{
|
||||||
|
statusbar(_("Read %d lines"), 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Did we even GET a file if we don't already have one? */
|
||||||
if (totsize == 0 || fileptr == NULL) {
|
if (totsize == 0 || fileptr == NULL) {
|
||||||
new_file();
|
new_file();
|
||||||
statusbar(_("Read %d lines"), num_lines);
|
statusbar(_("Read %d lines"), num_lines);
|
||||||
|
@ -280,6 +288,45 @@ int read_file(int fd, char *filename, int quiet)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef NANO_SMALL
|
||||||
|
int open_pipe(char *command)
|
||||||
|
{
|
||||||
|
int forkpid, fd;
|
||||||
|
char *pipefile, *execute;
|
||||||
|
|
||||||
|
execute = charalloc(strlen(command) + 24);
|
||||||
|
if ((pipefile = safe_tempnam(0, "nano.")) == NULL) {
|
||||||
|
statusbar(_("Could not create a temporary filename: %s"),
|
||||||
|
strerror(errno));
|
||||||
|
free(execute);
|
||||||
|
free(pipefile);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(execute,"%s 2>&1 > %s",command,pipefile);
|
||||||
|
umask(0);
|
||||||
|
mkfifo(pipefile,0700);
|
||||||
|
forkpid = fork();
|
||||||
|
if (forkpid == -1) {
|
||||||
|
statusbar(_("Could not fork"));
|
||||||
|
free(execute);
|
||||||
|
free(pipefile);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (forkpid == 0) {
|
||||||
|
execl("/bin/sh","/bin/sh","-c",execute,0);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
fd = open(pipefile,O_RDONLY);
|
||||||
|
read_file(fd,"stdin",0);
|
||||||
|
unlink(pipefile);
|
||||||
|
free(execute);
|
||||||
|
free(pipefile);
|
||||||
|
set_modified();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* NANO_SMALL */
|
||||||
|
|
||||||
/* Open the file (and decide if it exists) */
|
/* Open the file (and decide if it exists) */
|
||||||
int open_file(char *filename, int insert, int quiet)
|
int open_file(char *filename, int insert, int quiet)
|
||||||
{
|
{
|
||||||
|
@ -427,7 +474,24 @@ int do_insertfile(int loading_file)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
i = open_file(realname, 1, loading_file);
|
#ifndef NANO_SMALL
|
||||||
|
if (i == NANO_EXTCMD_KEY) {
|
||||||
|
i = statusq(1, extcmd_list, "", _("Command to execute "));
|
||||||
|
if (i == -1) {
|
||||||
|
statusbar(_("Cancelled"));
|
||||||
|
UNSET(KEEP_CUTBUFFER);
|
||||||
|
display_main_list();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (answer != NULL) {
|
||||||
|
i = open_pipe(answer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* NANO_SMALL */
|
||||||
|
{
|
||||||
|
i = open_file(realname, 1, loading_file);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_MULTIBUFFER
|
#ifdef ENABLE_MULTIBUFFER
|
||||||
if (loading_file)
|
if (loading_file)
|
||||||
|
|
15
global.c
15
global.c
|
@ -99,6 +99,7 @@ shortcut *writefile_list = NULL;
|
||||||
shortcut *insertfile_list = NULL;
|
shortcut *insertfile_list = NULL;
|
||||||
shortcut *help_list = NULL;
|
shortcut *help_list = NULL;
|
||||||
shortcut *spell_list = NULL;
|
shortcut *spell_list = NULL;
|
||||||
|
shortcut *extcmd_list = NULL;
|
||||||
#ifndef DISABLE_BROWSER
|
#ifndef DISABLE_BROWSER
|
||||||
shortcut *browser_list = NULL;
|
shortcut *browser_list = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
@ -268,7 +269,7 @@ void shortcut_init(int unjustify)
|
||||||
|
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
char *nano_tofiles_msg = "", *nano_gotodir_msg = "", *nano_case_msg =
|
char *nano_tofiles_msg = "", *nano_gotodir_msg = "", *nano_case_msg =
|
||||||
"", *nano_reverse_msg = "";
|
"", *nano_reverse_msg = "", *nano_execute_msg = "";
|
||||||
char *nano_dos_msg = "", *nano_mac_msg = "";
|
char *nano_dos_msg = "", *nano_mac_msg = "";
|
||||||
|
|
||||||
#ifdef HAVE_REGEX_H
|
#ifdef HAVE_REGEX_H
|
||||||
|
@ -317,6 +318,7 @@ void shortcut_init(int unjustify)
|
||||||
nano_case_msg =
|
nano_case_msg =
|
||||||
_("Make the current search or replace case (in)sensitive");
|
_("Make the current search or replace case (in)sensitive");
|
||||||
nano_tofiles_msg = _("Go to file browser");
|
nano_tofiles_msg = _("Go to file browser");
|
||||||
|
nano_execute_msg = _("Execute external command");
|
||||||
nano_gotodir_msg = _("Goto Directory");
|
nano_gotodir_msg = _("Goto Directory");
|
||||||
nano_cancel_msg = _("Cancel the current function");
|
nano_cancel_msg = _("Cancel the current function");
|
||||||
nano_append_msg = _("Append to the current file");
|
nano_append_msg = _("Append to the current file");
|
||||||
|
@ -638,6 +640,10 @@ void shortcut_init(int unjustify)
|
||||||
sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
|
sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
|
||||||
nano_tofiles_msg, 0, 0, 0, NOVIEW, 0);
|
nano_tofiles_msg, 0, 0, 0, NOVIEW, 0);
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef NANO_SMALL
|
||||||
|
sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"),
|
||||||
|
nano_execute_msg, 0, 0, 0, NOVIEW, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
sc_init_one(&spell_list, NANO_HELP_KEY,
|
sc_init_one(&spell_list, NANO_HELP_KEY,
|
||||||
_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);
|
_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);
|
||||||
|
@ -645,6 +651,13 @@ void shortcut_init(int unjustify)
|
||||||
sc_init_one(&spell_list, NANO_CANCEL_KEY, _("Cancel"),
|
sc_init_one(&spell_list, NANO_CANCEL_KEY, _("Cancel"),
|
||||||
nano_cancel_msg, 0, 0, 0, VIEW, 0);
|
nano_cancel_msg, 0, 0, 0, VIEW, 0);
|
||||||
|
|
||||||
|
#ifndef NANO_SMALL
|
||||||
|
sc_init_one(&extcmd_list, NANO_HELP_KEY,
|
||||||
|
_("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);
|
||||||
|
|
||||||
|
sc_init_one(&extcmd_list, NANO_CANCEL_KEY, _("Cancel"),
|
||||||
|
nano_cancel_msg, 0, 0, 0, VIEW, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef DISABLE_BROWSER
|
#ifndef DISABLE_BROWSER
|
||||||
|
|
||||||
|
|
8
nano.c
8
nano.c
|
@ -2504,6 +2504,14 @@ void help_init(void)
|
||||||
"instance of the given misspelled word in the "
|
"instance of the given misspelled word in the "
|
||||||
"current file.\n\n The following other functions are "
|
"current file.\n\n The following other functions are "
|
||||||
"available in Spell Check mode:\n\n");
|
"available in Spell Check mode:\n\n");
|
||||||
|
#ifndef NANO_SMALL
|
||||||
|
else if (currshortcut == extcmd_list)
|
||||||
|
ptr = _("External Command Help Text\n\n "
|
||||||
|
"This menu allows you to insert the output of a command "
|
||||||
|
"run by the shell into the current buffer (or a new "
|
||||||
|
"buffer in multibuffer mode).\n\n The following keys are "
|
||||||
|
"available in this mode:\n\n");
|
||||||
|
#endif
|
||||||
else /* Default to the main help list */
|
else /* Default to the main help list */
|
||||||
ptr = help_text_init;
|
ptr = help_text_init;
|
||||||
|
|
||||||
|
|
1
nano.h
1
nano.h
|
@ -289,6 +289,7 @@ know what you're doing */
|
||||||
#define NANO_OPENPREV_ALTKEY NANO_ALT_COMMA
|
#define NANO_OPENPREV_ALTKEY NANO_ALT_COMMA
|
||||||
#define NANO_OPENNEXT_ALTKEY NANO_ALT_PERIOD
|
#define NANO_OPENNEXT_ALTKEY NANO_ALT_PERIOD
|
||||||
#define NANO_BRACKET_KEY NANO_ALT_BRACKET
|
#define NANO_BRACKET_KEY NANO_ALT_BRACKET
|
||||||
|
#define NANO_EXTCMD_KEY NANO_CONTROL_X
|
||||||
|
|
||||||
#define TOGGLE_CONST_KEY NANO_ALT_C
|
#define TOGGLE_CONST_KEY NANO_ALT_C
|
||||||
#define TOGGLE_AUTOINDENT_KEY NANO_ALT_I
|
#define TOGGLE_AUTOINDENT_KEY NANO_ALT_I
|
||||||
|
|
2
proto.h
2
proto.h
|
@ -72,7 +72,7 @@ extern shortcut *shortcut_list;
|
||||||
extern shortcut *main_list, *whereis_list;
|
extern shortcut *main_list, *whereis_list;
|
||||||
extern shortcut *replace_list, *goto_list;
|
extern shortcut *replace_list, *goto_list;
|
||||||
extern shortcut *writefile_list, *insertfile_list;
|
extern shortcut *writefile_list, *insertfile_list;
|
||||||
extern shortcut *spell_list, *replace_list_2;
|
extern shortcut *spell_list, *replace_list_2, *extcmd_list;
|
||||||
extern shortcut *help_list;
|
extern shortcut *help_list;
|
||||||
#ifndef DISABLE_BROWSER
|
#ifndef DISABLE_BROWSER
|
||||||
extern shortcut *browser_list, *gotodir_list;
|
extern shortcut *browser_list, *gotodir_list;
|
||||||
|
|
Loading…
Reference in New Issue