Hi, This patch enables function "do_edit_at_line" to set line numer also for external edit. All UNIX editing programs accept passing "+<lineno>" parameter for line number so I changed mc to use this feauture. To do this all execute functions were modified to accept third argument of run program (for "+<number>" argument).
It is very usefule when I use "Find File" dialog to find files and then vim (my favourite editor) to edit found files (yes, I like also mcedit very much, but...). If you think that something should be changed to apply it please let me know. Thanks, -- Filip Kalinski <[EMAIL PROTECTED]>
diff -ur mc-2002-12-27-14/src/cmd.c mc-2002-12-27-14.new/src/cmd.c --- mc-2002-12-27-14/src/cmd.c 2002-12-26 03:20:05.000000000 +0100 +++ mc-2002-12-27-14.new/src/cmd.c 2002-12-27 19:48:09.000000000 +0100 @@ -89,7 +89,7 @@ * Errors are reported to the user. */ static void -execute_with_vfs_arg (const char *command, const char *filename) +execute_with_vfs_arg (const char *command, const char *filename, const char *arg) { char *localcopy; char *fn; @@ -98,7 +98,7 @@ /* Simplest case, this file is local */ if (vfs_file_is_local (filename)) { - execute_internal (command, filename); + execute_internal (command, filename, arg); return; } @@ -121,7 +121,7 @@ fn = g_strdup (filename); mc_stat (localcopy, &st); mtime = st.st_mtime; - execute_internal (command, localcopy); + execute_internal (command, localcopy, arg); mc_stat (localcopy, &st); mc_ungetlocalcopy (fn, localcopy, mtime != st.st_mtime); g_free (fn); @@ -182,7 +182,7 @@ if (!viewer) viewer = "view"; } - execute_with_vfs_arg (viewer, filename); + execute_with_vfs_arg (viewer, filename, NULL); } return move_dir; } @@ -310,9 +310,16 @@ g_free (command); } +/* + * line number -1 means to not pass line numer to editor program + * (useful for e.g. vim which saves last edit position and we don't want + * to pass it over) + */ void do_edit_at_line (const char *what, int start_line) { static char *editor = 0; + /* should not ovrflow for 64-bit numbers */ + char num[24]; #ifdef USE_INTERNAL_EDIT if (use_internal_edit){ @@ -327,7 +334,19 @@ if (!editor) editor = get_default_editor (); } - execute_with_vfs_arg (editor, what); + + /* + * format "+<number> <file>" is accepted by editors: vi (and clones), + * joe, emacs, xemacs, nedit, pico, nano, jed. + * It is safe to assume that any other editor also accepts this format. + */ + if (start_line >= 0) + { + sprintf (num, "+%d", start_line); + execute_with_vfs_arg (editor, num, what); + } else + execute_with_vfs_arg (editor, what, NULL); + update_panels (UP_OPTIMIZE, UP_KEEPSEL); repaint_screen (); } @@ -335,7 +354,14 @@ static void do_edit (const char *what) { - do_edit_at_line (what, 0); +#ifdef USE_INTERNAL_EDIT + if (use_internal_edit) + { + do_edit_at_line (what, 0); + return; + } +#endif + do_edit_at_line (what, -1); } void @@ -1010,7 +1036,7 @@ _("Type `exit' to return to the Midnight Commander")); fprintf (stderr, "\n\r\n\r"); - my_system (EXECUTE_AS_SHELL, shell, NULL); + my_system (EXECUTE_AS_SHELL, shell, NULL, NULL); } else get_key_code (0); } diff -ur mc-2002-12-27-14/src/command.c mc-2002-12-27-14.new/src/command.c --- mc-2002-12-27-14/src/command.c 2002-11-14 08:27:08.000000000 +0100 +++ mc-2002-12-27-14.new/src/command.c 2002-12-27 19:09:48.000000000 +0100 @@ -220,7 +220,7 @@ old_dlg = current_dlg; current_dlg = 0; new_input (cmdline); - execute (command); + execute (command, NULL); g_free (command); #ifdef HAVE_SUBSHELL_SUPPORT diff -ur mc-2002-12-27-14/src/ext.c mc-2002-12-27-14.new/src/ext.c --- mc-2002-12-27-14/src/ext.c 2002-11-14 08:27:08.000000000 +0100 +++ mc-2002-12-27-14.new/src/ext.c 2002-12-27 19:09:48.000000000 +0100 @@ -265,7 +265,7 @@ q[1] = 0; do_cd (p, cd_parse_command); } else { - shell_execute (cmd, EXECUTE_INTERNAL); + shell_execute (EXECUTE_INTERNAL, cmd, NULL); if (console_flag) { handle_console (CONSOLE_SAVE); if (output_lines && keybar_visible) { diff -ur mc-2002-12-27-14/src/main.c mc-2002-12-27-14.new/src/main.c --- mc-2002-12-27-14/src/main.c 2002-12-26 17:38:37.000000000 +0100 +++ mc-2002-12-27-14.new/src/main.c 2002-12-27 19:09:48.000000000 +0100 @@ -488,13 +488,14 @@ void exec_shell (void) { - do_execute (shell, 0, 0); + do_execute (0, shell, NULL, NULL); } void -do_execute (const char *shell, const char *command, int flags) +do_execute (int flags, const char *shell, const char *command, const char *arg) { #ifdef HAVE_SUBSHELL_SUPPORT + char *full_cmd = NULL; char *new_dir = NULL; #endif /* HAVE_SUBSHELL_SUPPORT */ @@ -518,15 +519,17 @@ if (use_subshell && !(flags & EXECUTE_INTERNAL)) { do_update_prompt (); + full_cmd = g_strconcat (command, arg, NULL); /* We don't care if it died, higher level takes care of this */ #ifdef USE_VFS - invoke_subshell (command, VISIBLY, old_vfs_dir ? 0 : &new_dir); + invoke_subshell (full_cmd, VISIBLY, old_vfs_dir ? 0 : &new_dir); #else - invoke_subshell (command, VISIBLY, &new_dir); + invoke_subshell (full_cmd, VISIBLY, &new_dir); #endif /* !USE_VFS */ + g_free (full_cmd); } else #endif /* HAVE_SUBSHELL_SUPPORT */ - my_system (flags, shell, command); + my_system (flags, shell, command, arg); if (!(flags & EXECUTE_INTERNAL)) { if ((pause_after_run == pause_always @@ -573,26 +576,32 @@ use_dash (TRUE); } +void +execute_internal (const char *shell, const char *command, const char *arg) +{ + do_execute (EXECUTE_INTERNAL, shell, command, arg); +} + /* Executes a command */ void -shell_execute (char *command, int flags) +shell_execute (int flags, const char *command, const char *arg) { #ifdef HAVE_SUBSHELL_SUPPORT if (use_subshell) if (subshell_state == INACTIVE || force_subshell_execution) - do_execute (shell, command, flags | EXECUTE_AS_SHELL); + do_execute (flags | EXECUTE_AS_SHELL, shell, command, arg); else message (1, MSG_ERROR, _(" The shell is already running a command ")); else #endif /* HAVE_SUBSHELL_SUPPORT */ - do_execute (shell, command, flags | EXECUTE_AS_SHELL); + do_execute (flags | EXECUTE_AS_SHELL, shell, command, arg); } void -execute (char *command) +execute (const char *command, const char *arg) { - shell_execute (command, 0); + shell_execute (0, command, arg); } void diff -ur mc-2002-12-27-14/src/main.h mc-2002-12-27-14.new/src/main.h --- mc-2002-12-27-14/src/main.h 2002-12-26 17:20:51.000000000 +0100 +++ mc-2002-12-27-14.new/src/main.h 2002-12-27 19:09:48.000000000 +0100 @@ -21,12 +21,12 @@ extern volatile int quit; /* Execute functions: the base and the routines that use it */ -void do_execute (const char *shell, const char *command, int internal_command); -#define execute_internal(command,args) do_execute (command, args, 1) +void do_execute (int internal_command, const char *shell, const char *command, const +char *arg); +void execute_internal (const char *shell, const char *command, const char *arg); /* Execute functions that use the shell to execute */ -void shell_execute (char *command, int flags); -void execute (char *command); +void shell_execute (int flags, const char *command, const char *arg); +void execute (const char *command, const char *arg); /* This one executes a shell */ void exec_shell (void); diff -ur mc-2002-12-27-14/src/screen.c mc-2002-12-27-14.new/src/screen.c --- mc-2002-12-27-14/src/screen.c 2002-12-26 17:20:51.000000000 +0100 +++ mc-2002-12-27-14.new/src/screen.c 2002-12-27 19:09:48.000000000 +0100 @@ -1950,7 +1950,7 @@ (_(" The Midnight Commander "), _(" Do you really want to execute? "), 0, 2, _("&Yes"), _("&No")) == 0)) - execute (cmd); + execute (cmd, NULL); g_free (cmd); } #ifdef USE_VFS diff -ur mc-2002-12-27-14/src/user.c mc-2002-12-27-14.new/src/user.c --- mc-2002-12-27-14/src/user.c 2002-11-29 05:57:26.000000000 +0100 +++ mc-2002-12-27-14.new/src/user.c 2002-12-27 19:09:48.000000000 +0100 @@ -630,7 +630,7 @@ } fclose (cmd_file); chmod (file_name, S_IRWXU); - execute (file_name); + execute (file_name, NULL); unlink (file_name); g_free (file_name); } diff -ur mc-2002-12-27-14/src/util.h mc-2002-12-27-14.new/src/util.h --- mc-2002-12-27-14/src/util.h 2002-12-26 14:07:10.000000000 +0100 +++ mc-2002-12-27-14.new/src/util.h 2002-12-27 19:09:48.000000000 +0100 @@ -75,7 +75,7 @@ /* Process spawning */ #define EXECUTE_INTERNAL 1 #define EXECUTE_AS_SHELL 4 -int my_system (int flags, const char *shell, const char *command); +int my_system (int flags, const char *shell, const char *command, const char *arg); void save_stop_handler (void); extern struct sigaction startup_handler; diff -ur mc-2002-12-27-14/src/utilunix.c mc-2002-12-27-14.new/src/utilunix.c --- mc-2002-12-27-14/src/utilunix.c 2002-12-26 16:10:06.000000000 +0100 +++ mc-2002-12-27-14.new/src/utilunix.c 2002-12-27 19:09:48.000000000 +0100 @@ -207,7 +207,7 @@ sigaction (SIGTSTP, NULL, &startup_handler); } -int my_system (int flags, const char *shell, const char *command) +int my_system (int flags, const char *shell, const char *command, const char *arg) { struct sigaction ignore, save_intr, save_quit, save_stop; pid_t pid; @@ -235,9 +235,9 @@ signal (SIGCHLD, SIG_DFL); if (flags & EXECUTE_AS_SHELL) - execl (shell, shell, "-c", command, NULL); + execl (shell, shell, "-c", command, arg, NULL); else - execlp (shell, shell, command, NULL); + execlp (shell, shell, command, arg, NULL); _exit (127); /* Exec error */ } else { diff -ur mc-2002-12-27-14/vfs/extfs.c mc-2002-12-27-14.new/vfs/extfs.c --- mc-2002-12-27-14/vfs/extfs.c 2002-12-25 23:53:37.000000000 +0100 +++ mc-2002-12-27-14.new/vfs/extfs.c 2002-12-27 19:09:48.000000000 +0100 @@ -603,7 +603,7 @@ g_free (archive_name); open_error_pipe (); - retval = my_system (EXECUTE_AS_SHELL, shell, cmd); + retval = my_system (EXECUTE_AS_SHELL, shell, cmd, NULL); g_free (cmd); close_error_pipe (1, NULL); return retval; @@ -628,7 +628,7 @@ g_free (mc_extfsdir); g_free (archive_name); g_free (q); - shell_execute (cmd, 0); + shell_execute (0, cmd, NULL); g_free (cmd); } diff -ur mc-2002-12-27-14/vfs/sfs.c mc-2002-12-27-14.new/vfs/sfs.c --- mc-2002-12-27-14/vfs/sfs.c 2002-12-06 04:34:23.000000000 +0100 +++ mc-2002-12-27-14.new/vfs/sfs.c 2002-12-27 19:09:48.000000000 +0100 @@ -93,7 +93,7 @@ g_free (name); open_error_pipe (); - if (my_system (EXECUTE_AS_SHELL, "/bin/sh", pad)) { + if (my_system (EXECUTE_AS_SHELL, "/bin/sh", pad, NULL)) { close_error_pipe (1, NULL); return -1; }