diff --git a/configure.in b/configure.in index 7ae46c4e6..433ec161d 100644 --- a/configure.in +++ b/configure.in @@ -170,7 +170,7 @@ dnl dnl Check availability of some functions dnl -AC_CHECK_FUNCS(strerror statfs getwd strcasecmp strncasecmp strcoll) +AC_CHECK_FUNCS(strerror statfs getwd strcasecmp strncasecmp strcoll strftime) AC_CHECK_FUNCS(strdup memmove pwdauth truncate initgroups putenv) AC_CHECK_FUNCS(memset memcpy tcsetattr tcgetattr cfgetospeed) AC_CHECK_FUNCS(sigaction sigemptyset sigprocmask sigaddset) diff --git a/doc/mc.1.in b/doc/mc.1.in index a121ee82e..0c230109d 100644 --- a/doc/mc.1.in +++ b/doc/mc.1.in @@ -1389,12 +1389,15 @@ Condition syntax: = Sub-condition is one of following: + y syntax of current file matching pattern? + for edit menu only. f current file matching pattern? F other file matching pattern? d current directory matching pattern? D other directory matching pattern? t current file of type? T other file of type? + x is it executable filename? ! negate the result of sub-condition .fi .PP @@ -1939,10 +1942,39 @@ a simple macro substitution takes place. .PP The macros are: .PP +.I "%i" +.IP +The indent of blank space, equal the cursor column +position. For edit menu only. +.PP +.I "%y" +.IP +The syntax type of current file. For edit menu only. +.PP +.I "%k" +.IP +The block file name. +.PP +.I "%e" +.IP +The error file name. +.PP +.I "%m" +.IP +The current menu name. +.PP .I "%f" .IP The current file name. .PP +.I "%x" +.IP +The extension of current file name. +.PP +.I "%b" +.IP +The current file name without extension. +.PP .I "%d" .IP The current directory name. diff --git a/doc/mc.sgml b/doc/mc.sgml index 66b218a50..15a82fcc2 100644 --- a/doc/mc.sgml +++ b/doc/mc.sgml @@ -1110,12 +1110,15 @@ Condition syntax: Sub-condition is one of following: +y syntax of current file matching pattern? + for edit menu only. f current file matching pattern F other file matching pattern d current directory matching pattern D other directory matching pattern t current file of type T other file of type +x is it executable filename ! negate the result of sub-condition @@ -1572,8 +1575,23 @@ line input, a simple macro substitution takes place. The macros are: +. +Possible to use only in mc.ext . + + * gnome-file-property-dialog.c (create_general_properties): Tag + the strftime format for translation to let the localization + efforts to localize the time display. + 2000-05-06 Jacob Berkman * gsession.c (session_set_restart): restart with priority 40 so we show diff --git a/gnome/gdesktop.c b/gnome/gdesktop.c index 34dec82e9..1bf720d85 100644 --- a/gnome/gdesktop.c +++ b/gnome/gdesktop.c @@ -42,6 +42,7 @@ struct layout_slot { /* Configuration options for the desktop */ + int desktop_use_shaped_icons = TRUE; int desktop_auto_placement = FALSE; int desktop_snap_icons = FALSE; @@ -68,6 +69,8 @@ char *desktop_directory; * array of slots. Each slot is an integer that specifies the number of icons * that belong to that slot. */ +static int layout_spacer_width; +static int layout_spacer_height; static int layout_screen_width; static int layout_screen_height; static int layout_cols; @@ -148,6 +151,22 @@ static DesktopIconInfo *desktop_icon_info_new (char *filename, char *url, char * static GHashTable *icon_hash; +/* Convenience function to figure out the (x, y) position from a slot */ +static void +get_pos_from_slot (int u, int v, int *x, int *y) +{ + int xx, yy; + + xx = (layout_spacer_width / 2) + + (u * (DESKTOP_SNAP_X + layout_spacer_width)); + + yy = (layout_spacer_height / 2) + + (v * (DESKTOP_SNAP_Y + layout_spacer_height)); + + *x = CLAMP (xx, 0, layout_screen_width); + *y = CLAMP (yy, 0, layout_screen_height); + +} /* Convenience function to figure out the slot corresponding to an (x, y) position */ static void @@ -155,8 +174,8 @@ get_slot_from_pos (int x, int y, int *u, int *v) { int uu, vv; - uu = (x + DESKTOP_SNAP_X / 2) / DESKTOP_SNAP_X; - vv = (y + DESKTOP_SNAP_Y / 2) / DESKTOP_SNAP_Y; + uu = x / (DESKTOP_SNAP_X + layout_spacer_width); + vv = y / (DESKTOP_SNAP_Y + layout_spacer_height); *u = CLAMP (uu, 0, layout_cols - 1); *v = CLAMP (vv, 0, layout_rows - 1); @@ -252,6 +271,8 @@ get_icon_auto_pos (int *x, int *y) int slot1; int slot; int sx, sy, ex, ey; + int u, v; + int xx, yy; #if 0 get_slot_from_pos (*x, *y, &sx, &sy); @@ -305,9 +326,14 @@ get_icon_auto_pos (int *x, int *y) slot = slot2; } #endif + u = slot / layout_rows; + v = slot % layout_rows; + + get_pos_from_slot(u, v, &xx, &yy); + + *x = xx; + *y = yy; - *x = (slot / layout_rows) * DESKTOP_SNAP_X; - *y = (slot % layout_rows) * DESKTOP_SNAP_Y; } /* Snaps the specified position to the icon grid. It looks for the closest free spot on the grid, @@ -321,6 +347,7 @@ get_icon_snap_pos (int *x, int *y) int u, v; int val, dist; int dx, dy; + int ux, vy; min = l_slots (0, 0).num_icons; min_x = min_y = 0; @@ -329,21 +356,22 @@ get_icon_snap_pos (int *x, int *y) for (u = 0; u < layout_cols; u++) for (v = 0; v < layout_rows; v++) { val = l_slots (u, v).num_icons; - - dx = *x - u * DESKTOP_SNAP_X; - dy = *y - v * DESKTOP_SNAP_Y; + get_pos_from_slot(u, v, &ux, &vy); + dx = *x - ux; + dy = *y - vy; dist = dx * dx + dy * dy; if ((val == min && dist < min_dist) || (val < min)) { min = val; min_dist = dist; - min_x = u; - min_y = v; + min_x = ux; + min_y = vy; } } - *x = min_x * DESKTOP_SNAP_X; - *y = min_y * DESKTOP_SNAP_Y; + *x = min_x; + *y = min_y; + } /* Removes an icon from the slot it is in, if any */ @@ -373,15 +401,16 @@ desktop_icon_info_place (DesktopIconInfo *dii, int xpos, int ypos) remove_from_slot (dii); - if (xpos < 0) - xpos = 0; - else if (xpos > layout_screen_width) - xpos = layout_screen_width - DESKTOP_SNAP_X; + if (xpos < (layout_spacer_width / 2)) + xpos = layout_spacer_width / 2; + else if (xpos > layout_screen_width - (DESKTOP_SNAP_X + (layout_spacer_width / 2))) + xpos = layout_screen_width - (DESKTOP_SNAP_X + (layout_spacer_width / 2)); + + if (ypos < (layout_spacer_height / 2)) + ypos = layout_spacer_height / 2; + else if (ypos > layout_screen_height - (DESKTOP_SNAP_Y + (layout_spacer_height / 2))) + ypos = layout_screen_height - (DESKTOP_SNAP_Y + (layout_spacer_height / 2)); - if (ypos < 0) - ypos = 0; - else if (ypos > layout_screen_height) - ypos = layout_screen_height - DESKTOP_SNAP_Y; /* Increase the number of icons in the corresponding slot */ @@ -507,6 +536,64 @@ typedef struct { char *caption; } file_and_url_t; +/* get_drop_grid generates a compact organization for icons that are dragged out + * of applications on to the desktop. + */ +GSList * +get_drop_grid (gint xpos, gint ypos, gint need_position_list_length, GSList *grid_list) +{ + gint i = 1; + gint my_bool = 0; + gint j; + gint k; + gint new_xpos; + gint new_ypos; + + /* Determine size of a square grid in which to put the dropped icons */ + while (!my_bool) { + if (need_position_list_length <= i * i) + my_bool = 1; + else + i++; + } + + /* Make sure no icons are off the side of the screen */ + if ((xpos + (i * DESKTOP_SNAP_X) + ((i - 1) * layout_spacer_width) + + (layout_spacer_width / 2)) > layout_screen_width) { + xpos = layout_screen_width - (layout_spacer_width / 2) - + (i * DESKTOP_SNAP_X) - ((i - 1) * layout_spacer_width); + } + if ((ypos + (i * DESKTOP_SNAP_Y) + ((i - 1) * layout_spacer_height) + + (layout_spacer_height / 2)) > layout_screen_height) { + ypos = layout_screen_height - (layout_spacer_height / 2) - + (i * DESKTOP_SNAP_Y) - ((i - 1) * layout_spacer_height); + } + if (xpos < layout_spacer_width / 2) { + xpos = layout_spacer_width / 2; + } + if (ypos < layout_spacer_height / 2) { + ypos = layout_spacer_height / 2; + } + + /* Now write the (x, y) coordinates of the dropped icons */ + for (j = 0; j < i; j++) { + for (k = 0; k < i; k++) { + new_xpos = xpos + k * (DESKTOP_SNAP_X + layout_spacer_width); + new_ypos = ypos + j * (DESKTOP_SNAP_Y + layout_spacer_height); + + if (desktop_snap_icons) { + get_icon_snap_pos (&new_xpos, &new_ypos); + } + + grid_list = g_slist_append (grid_list, (void *) new_xpos); grid_list = g_slist_append (grid_list, (void *) new_ypos); + } + } + + return grid_list; + +} + + /* Reloads the desktop icons efficiently. If there are "new" files for which no * icons have been created, then icons for them will be created started at the * specified position if user_pos is TRUE. If it is FALSE, the icons will be @@ -518,13 +605,16 @@ desktop_reload_icons (int user_pos, int xpos, int ypos) struct dirent *dirent; DIR *dir; char *full_name; - int have_pos, x, y, size; + /* int have_pos, x, y, size; */ + int x, y, size; DesktopIconInfo *dii; - GSList *need_position_list, *sl; + GSList *need_position_list, *sl, *drop_grid_list, *drop_gl_copy; GList *all_icons, *l; char *desktop_url, *caption; const char *mime; int orig_xpos, orig_ypos; + guint need_position_list_length; + file_and_url_t *fau; dir = mc_opendir (desktop_directory); if (!dir) { @@ -538,9 +628,9 @@ desktop_reload_icons (int user_pos, int xpos, int ypos) gnome_metadata_lock (); /* Read the directory. For each file for which we do have an existing - * icon, do nothing. Otherwise, if the file has its metadata for icon - * position set, create an icon for it. Otherwise, store it in a list - * of new icons for which positioning is pending. + * icon, do nothing. Otherwise, store it in a list + * of new icons for which positioning is pending. If we have metadata for + * the file but no icon, delete the metadata and treat the file as new. */ need_position_list = NULL; @@ -583,7 +673,6 @@ desktop_reload_icons (int user_pos, int xpos, int ypos) } full_name = g_concat_dir_and_file (desktop_directory, dirent->d_name); - have_pos = gmeta_get_icon_pos (full_name, &x, &y); if (gnome_metadata_get (full_name, "desktop-url", &size, &desktop_url) != 0) desktop_url = NULL; @@ -591,23 +680,16 @@ desktop_reload_icons (int user_pos, int xpos, int ypos) caption = NULL; gnome_metadata_get (full_name, "icon-caption", &size, &caption); - if (have_pos) { - dii = desktop_icon_info_new (dirent->d_name, desktop_url, caption, x, y); - gtk_widget_show (dii->dicon); - } else { - file_and_url_t *fau; + fau = g_new0 (file_and_url_t, 1); + fau->filename = g_strdup (dirent->d_name); - fau = g_new0 (file_and_url_t, 1); - fau->filename = g_strdup (dirent->d_name); + if (desktop_url) + fau->url = g_strdup (desktop_url); - if (desktop_url) - fau->url = g_strdup (desktop_url); + if (caption) + fau->caption = g_strdup (caption); - if (caption) - fau->caption = g_strdup (caption); - - need_position_list = g_slist_prepend (need_position_list, fau); - } + need_position_list = g_slist_prepend (need_position_list, fau); g_free (full_name); @@ -643,6 +725,15 @@ desktop_reload_icons (int user_pos, int xpos, int ypos) need_position_list = g_slist_reverse (need_position_list); + need_position_list_length = g_slist_length (need_position_list); + + /* Get a position list for the dragged icons, to nicely place multiple icon drops */ + if (user_pos && (need_position_list_length != 0)) { + drop_grid_list = NULL; + drop_grid_list = get_drop_grid (xpos, ypos, need_position_list_length, drop_grid_list); + drop_gl_copy = drop_grid_list; + } + orig_xpos = orig_ypos = 0; for (sl = need_position_list; sl; sl = sl->next) { @@ -650,19 +741,16 @@ desktop_reload_icons (int user_pos, int xpos, int ypos) fau = sl->data; - if (user_pos && sl == need_position_list) { - /* If we are on the first icon, place it "by hand". - * Else, use automatic placement based on the position - * of the first icon of the series. - */ + if (user_pos) { if (desktop_auto_placement) { xpos = ypos = 0; get_icon_auto_pos (&xpos, &ypos); - } else if (desktop_snap_icons) - get_icon_snap_pos (&xpos, &ypos); - - orig_xpos = xpos; - orig_ypos = ypos; + } else { /* Place the icons according to the position list obtained above */ + xpos = (int) drop_gl_copy->data; + drop_gl_copy = drop_gl_copy->next; + ypos = (int) drop_gl_copy->data; + drop_gl_copy = drop_gl_copy->next; + } } else { xpos = orig_xpos; ypos = orig_ypos; @@ -721,7 +809,12 @@ desktop_reload_icons (int user_pos, int xpos, int ypos) g_free (fau); } + if ((need_position_list_length != 0) && user_pos) { + g_slist_free (drop_grid_list); + } + g_slist_free (need_position_list); + gnome_metadata_unlock (); } @@ -2002,26 +2095,31 @@ static void drop_desktop_icons (GdkDragContext *context, GtkSelectionData *data, int x, int y) { DesktopIconInfo *source_dii, *dii; - int dx, dy; + int dx, dy, sl_x, sl_y, sl_max_x, sl_max_y, sl_min_x, sl_min_y; int i; GList *l; - GSList *sel_icons, *sl; + GSList *sel_icons, *sl, *sl2, *sl2_p; /* Find the icon that the user is dragging */ source_dii = find_icon_by_drag_context (context); + if (!source_dii) { g_warning ("Eeeeek, could not find the icon that started the drag!"); return; } + x -= dnd_press_x; + y -= dnd_press_y; + /* Compute the distance to move icons */ if (desktop_snap_icons) get_icon_snap_pos (&x, &y); - dx = x - source_dii->x - dnd_press_x; - dy = y - source_dii->y - dnd_press_y; + dx = x - source_dii->x; + dy = y - source_dii->y; + /* Build a list of selected icons */ @@ -2038,12 +2136,66 @@ drop_desktop_icons (GdkDragContext *context, GtkSelectionData *data, int x, int * icons in the proper place. */ - if (!desktop_auto_placement) + if (!desktop_auto_placement) { + sl2 = NULL; + sl2_p = NULL; + for (sl = sel_icons; sl; sl = sl->next) { + dii = sl->data; + sl2 = g_slist_prepend (sl2, (void *) (dii->x + dx)); + sl2 = g_slist_prepend (sl2, (void *) (dii->y + dy)); + } + + sl_max_x = 0; + sl_max_y = 0; + sl_min_x = INT_MAX; + sl_min_y = INT_MAX; + sl2_p = sl2; + + /* For multiple icon drags, get the min/max x and y coordinates */ + for (sl = sel_icons; sl; sl = sl->next) { + sl_y = (int) sl2_p->data; + sl2_p = sl2_p->next; + sl_x = (int) sl2_p->data; + sl2_p = sl2_p->next; + + if (sl_x > sl_max_x) { + sl_max_x = sl_x; + } + if (sl_x < sl_min_x) { + sl_min_x = sl_x; + } + if (sl_y > sl_max_y) { + sl_max_y = sl_y; + } + if (sl_x < sl_min_y) { + sl_min_y = sl_y; + } + } + + g_slist_free (sl2); + + /* Make sure that no icons are placed off the screen, and keep their relative positions */ + if (sl_max_x > layout_screen_width - (DESKTOP_SNAP_X + layout_spacer_width / 2)) { + dx -= (sl_max_x - (layout_screen_width - + (DESKTOP_SNAP_X + layout_spacer_width / 2))); + } + if (sl_max_y > layout_screen_height - (DESKTOP_SNAP_Y + layout_spacer_height / 2)) { + dy -= (sl_max_y - (layout_screen_height - + (DESKTOP_SNAP_Y + layout_spacer_width / 2))); + } + if (sl_min_x < layout_spacer_width / 2) { + dx += (layout_spacer_width / 2 - sl_min_x); + } + if (sl_min_y < layout_spacer_height / 2) { + dy += (layout_spacer_height / 2 - sl_min_y); + } + + /* Place the icons */ for (sl = sel_icons; sl; sl = sl->next) { dii = sl->data; desktop_icon_info_place (dii, dii->x + dx, dii->y + dy); } - + } /* Clean up */ g_slist_free (sel_icons); @@ -2202,8 +2354,14 @@ create_layout_info (void) { layout_screen_width = gdk_screen_width (); layout_screen_height = gdk_screen_height (); - layout_cols = (layout_screen_width + DESKTOP_SNAP_X - 1) / DESKTOP_SNAP_X; - layout_rows = (layout_screen_height + DESKTOP_SNAP_Y - 1) / DESKTOP_SNAP_Y; + layout_cols = layout_screen_width / DESKTOP_SNAP_X; + layout_rows = layout_screen_height / DESKTOP_SNAP_Y; + + /* Adjust icon size to spread the icons evenly across the screen */ + layout_spacer_width = (layout_screen_width / layout_cols) - DESKTOP_SNAP_X; + layout_spacer_height = (layout_screen_height / layout_rows) - DESKTOP_SNAP_Y; + + layout_slots = g_new0 (struct layout_slot, layout_cols * layout_rows); } @@ -2745,7 +2903,7 @@ desktop_popup (GdkEventButton *event) static void draw_rubberband (int x, int y) { - int x1, y1, x2, y2; + int x1, y1, x2, y2; if (click_start_x < x) { x1 = click_start_x; diff --git a/gnome/gnome-file-property-dialog.c b/gnome/gnome-file-property-dialog.c index db5851412..60dccf4ce 100644 --- a/gnome/gnome-file-property-dialog.c +++ b/gnome/gnome-file-property-dialog.c @@ -278,7 +278,7 @@ create_general_properties (GnomeFilePropertyDialog *fp_dlg) gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1); time = localtime (&(fp_dlg->st.st_ctime)); - strftime (buf, MC_MAXPATHLEN, "%a, %b %d %Y, %I:%M:%S %p", time); + strftime (buf, MC_MAXPATHLEN, _("%a, %b %d %Y, %I:%M:%S %p"), time); label = gtk_label_new (buf); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 0, 1); @@ -287,7 +287,7 @@ create_general_properties (GnomeFilePropertyDialog *fp_dlg) gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2); time = localtime (&(fp_dlg->st.st_mtime)); - strftime (buf, MC_MAXPATHLEN, "%a, %b %d %Y, %I:%M:%S %p", time); + strftime (buf, MC_MAXPATHLEN, _("%a, %b %d %Y, %I:%M:%S %p"), time); label = gtk_label_new (buf); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 1, 2); @@ -296,7 +296,7 @@ create_general_properties (GnomeFilePropertyDialog *fp_dlg) gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3); time = localtime (&(fp_dlg->st.st_atime)); - strftime (buf, MC_MAXPATHLEN, "%a, %b %d %Y, %I:%M:%S %p", time); + strftime (buf, MC_MAXPATHLEN, _("%a, %b %d %Y, %I:%M:%S %p"), time); label = gtk_label_new (buf); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 2, 3); diff --git a/gtkedit/edit.c b/gtkedit/edit.c index 4d462d95f..11aeb5d82 100644 --- a/gtkedit/edit.c +++ b/gtkedit/edit.c @@ -38,6 +38,10 @@ #include "mad.h" #endif +#include <../src/dialog.h> /* MSG_ERROR */ + +extern char *edit_one_file; + /* * * here's a quick sketch of the layout: (don't run this through indent.) @@ -2562,6 +2566,14 @@ int edit_execute_cmd (WEdit * edit, int command, int char_for_insertion) case CK_Match_Bracket: edit_goto_matching_bracket (edit); break; + case CK_User_Menu: + if (edit_one_file) { + message (1, MSG_ERROR, _("User menu avalaible only in mcedit invoked from mc")); + break; + } + else + user_menu (edit); + break; #ifdef MIDNIGHT case CK_Sort: edit_sort_cmd (edit); @@ -2714,3 +2726,61 @@ void edit_execute_macro (WEdit * edit, struct macro macro[], int n) edit_update_screen (edit); } +/* User edit menu, like user menu (F2) but only in editor. */ +void user_menu (WEdit *edit) +{ + FILE *fd; + int nomark; + struct stat status; + long start_mark, end_mark; + char *block_file = catstrs (home_dir, BLOCK_FILE, 0); + char *error_file = catstrs (home_dir, ERROR_FILE, 0); + int rc = 0; + + nomark = eval_marks (edit, &start_mark, &end_mark); + if (! nomark) /* remember marked or not */ + edit_save_block (edit, block_file = catstrs (home_dir, BLOCK_FILE, 0), + start_mark, end_mark); + + /* run shell scripts from menu */ + user_menu_cmd (edit); + + if (stat (error_file, &status) == 0) { + if (!status.st_size) { /* no error messages */ + if (stat (block_file, &status) == 0) + if (!status.st_size) + return; /* no block messages */ + if (! nomark) /* i.e. we have marked block */ + rc = edit_block_delete_cmd(edit); + if (!rc) { + edit_cursor_to_bol (edit); + edit_insert_file (edit, block_file); + edit_cursor_to_eol (edit); + if (fd = fopen (block_file, "w")) fclose(fd); + } + } else { /* it is error */ + edit_cursor_to_bol (edit); + edit_insert_file (edit, error_file); + if (fd = fopen (error_file, "w")) fclose(fd); + if (fd = fopen (block_file, "w")) fclose(fd); + } + } else { + edit_error_dialog (_(""), + get_sys_error (catstrs (_ ("Error trying to stat file:"), + error_file, 0))); + return; + } + edit_refresh_cmd (edit); + edit->force |= REDRAW_COMPLETELY; + return; +} + +void edit_init_file() +{ + FILE *f; + + if (f = fopen (catstrs (home_dir, ERROR_FILE, 0), "w")) fclose(f); + if (f = fopen (catstrs (home_dir, BLOCK_FILE, 0), "w")) fclose(f); + if (f = fopen (catstrs (home_dir, TEMP_FILE, 0) , "w")) fclose(f); + return; +} diff --git a/gtkedit/edit.h b/gtkedit/edit.h index d1d674411..c0984d82d 100644 --- a/gtkedit/edit.h +++ b/gtkedit/edit.h @@ -174,15 +174,6 @@ #define SEARCH_DIALOG_OPTION_BACKWARDS 8 #define SEARCH_DIALOG_OPTION_BOOKMARK 16 -#define SYNTAX_FILE "/.cedit/Syntax" -#define CLIP_FILE "/.cedit/cooledit.clip" -#define MACRO_FILE "/.cedit/cooledit.macros" -#define BLOCK_FILE "/.cedit/cooledit.block" -#define ERROR_FILE "/.cedit/cooledit.error" -#define TEMP_FILE "/.cedit/cooledit.temp" -#define SCRIPT_FILE "/.cedit/cooledit.script" -#define EDIT_DIR "/.cedit" - #define EDIT_KEY_EMULATION_NORMAL 0 #define EDIT_KEY_EMULATION_EMACS 1 @@ -225,10 +216,7 @@ #define EDIT_TOP_EXTREME option_edit_top_extreme #define EDIT_BOTTOM_EXTREME option_edit_bottom_extreme -#define MAX_MACRO_LENGTH 1024 - /*there are a maximum of ... */ -#define MAXBUFF 1024 /*... edit buffers, each of which is ... */ #define EDIT_BUF_SIZE 0x10000 /* ...bytes in size. */ @@ -265,26 +253,11 @@ #define TAB_SIZE option_tab_spacing #define HALF_TAB_SIZE ((int) option_tab_spacing / 2) -struct macro { - short command; - short ch; -}; - struct selection { unsigned char * text; int len; }; -struct syntax_rule { - unsigned short keyword; - unsigned char end; - unsigned char context; - unsigned char _context; -#define RULE_ON_LEFT_BORDER 1 -#define RULE_ON_RIGHT_BORDER 2 - unsigned char border; -}; - #define MAX_WORDS_PER_CONTEXT 1024 #define MAX_CONTEXTS 128 @@ -318,118 +291,7 @@ struct context_rule { struct key_word **keyword; }; -struct _syntax_marker { - long offset; - struct syntax_rule rule; - struct _syntax_marker *next; -}; - -struct _book_mark { - int line; /* line number */ -// #define BOOK_MARK_COLOR ((0 << 8) | 26) /* black on white */ -#define BOOK_MARK_COLOR ((25 << 8) | 5) -#define BOOK_MARK_FOUND_COLOR ((26 << 8) | 4) - int c; /* colour */ - struct _book_mark *next; - struct _book_mark *prev; -}; - -struct editor_widget { -#ifdef MIDNIGHT - Widget widget; -#elif defined(GTK) - GtkEdit *widget; -#else - struct cool_widget *widget; -#endif -#define from_here num_widget_lines - int num_widget_lines; - int num_widget_columns; - -#ifdef MIDNIGHT - int have_frame; -#else - int stopped; -#endif - - char *filename; /* Name of the file */ - char *dir; /* current directory */ - -/* dynamic buffers and cursor position for editor: */ - long curs1; /*position of the cursor from the beginning of the file. */ - long curs2; /*position from the end of the file */ - unsigned char *buffers1[MAXBUFF + 1]; /*all data up to curs1 */ - unsigned char *buffers2[MAXBUFF + 1]; /*all data from end of file down to curs2 */ - -/* search variables */ - long search_start; /* First character to start searching from */ - int found_len; /* Length of found string or 0 if none was found */ - long found_start; /* the found word from a search - start position */ - -/* display information */ - long last_byte; /* Last byte of file */ - long start_display; /* First char displayed */ - long start_col; /* First displayed column, negative */ - long max_column; /* The maximum cursor position ever reached used to calc hori scroll bar */ - long curs_row; /*row position of cursor on the screen */ - long curs_col; /*column position on screen */ - int force; /* how much of the screen do we redraw? */ - unsigned char overwrite; - unsigned char modified; /*has the file been changed?: 1 if char inserted or - deleted at all since last load or save */ - unsigned char screen_modified; /* has the file been changed since the last screen draw? */ -#if defined(MIDNIGHT) || defined(GTK) - int delete_file; /* has the file been created in edit_load_file? Delete - it at end of editing when it hasn't been modified - or saved */ -#endif - unsigned char highlight; - long prev_col; /*recent column position of the cursor - used when moving - up or down past lines that are shorter than the current line */ - long curs_line; /*line number of the cursor. */ - long start_line; /*line nummber of the top of the page */ - -/* file info */ - long total_lines; /*total lines in the file */ - long mark1; /*position of highlight start */ - long mark2; /*position of highlight end */ - int column1; /*position of column highlight start */ - int column2; /*position of column highlight end */ - long bracket; /*position of a matching bracket */ - -/* cache speedup for line lookups */ -#define N_LINE_CACHES 32 - int caches_valid; - int line_numbers[N_LINE_CACHES]; - long line_offsets[N_LINE_CACHES]; - - struct _book_mark *book_mark; - -/* undo stack and pointers */ - unsigned long stack_pointer; - long *undo_stack; - unsigned long stack_size; - unsigned long stack_size_mask; - unsigned long stack_bottom; - struct stat stat; - -/* syntax higlighting */ - struct _syntax_marker *syntax_marker; - struct context_rule **rules; - long last_get_rule; - struct syntax_rule rule; - char *syntax_type; /* description of syntax highlighting type being used */ - int explicit_syntax; /* have we forced the syntax hi. type in spite of the filename? */ - - int to_here; /* dummy marker */ - - -/* macro stuff */ - int macro_i; /* -1 if not recording index to macro[] otherwise */ - struct macro macro[MAX_MACRO_LENGTH]; -}; - -typedef struct editor_widget WEdit; +#include "edit-widget.h" #ifndef MIDNIGHT @@ -590,6 +452,8 @@ void book_mark_flush (WEdit * edit, int c); void book_mark_inc (WEdit * edit, int line); void book_mark_dec (WEdit * edit, int line); +void user_menu (WEdit *edit); + #ifdef MIDNIGHT diff --git a/gtkedit/editcmd.c b/gtkedit/editcmd.c index b3a06b7f5..6affb1adb 100644 --- a/gtkedit/editcmd.c +++ b/gtkedit/editcmd.c @@ -1122,6 +1122,7 @@ void edit_delete_column_of_text (WEdit * edit) } } +/* if success return 0 */ int edit_block_delete (WEdit * edit) { long count; @@ -2864,47 +2865,90 @@ void edit_block_process_cmd (WEdit * edit, const char *shell_cmd, int block) { long start_mark, end_mark; struct stat s; - char *f = NULL, *b = NULL; + char buf[BUFSIZ]; + FILE *script_home = NULL; + FILE *script_src = NULL; + FILE *block_file = NULL; - if (block) { + char *o = catstrs (mc_home, shell_cmd, 0); /* original source script */ + char *h = catstrs (home_dir, EDIT_DIR, shell_cmd, 0); /* home script */ + char *b = catstrs (home_dir, BLOCK_FILE, 0); /* block file */ + char *e = catstrs (home_dir, ERROR_FILE, 0); /* error file */ + + if (! (script_home = fopen (h, "r"))) { + if (! (script_home = fopen (h, "w"))) { + edit_error_dialog (_(""), + get_sys_error (catstrs (_ ("Error create script:"), h, 0))); + return; + } else { + if (! (script_src = fopen (o, "r"))) { + fclose (script_home); unlink (h); + edit_error_dialog (_(""), + get_sys_error (catstrs (_ ("Error read script:"), o, 0))); + return; + } else { + while (fgets(buf, sizeof(buf), script_src)) + fprintf(script_home, "%s",buf); + if (fclose(script_home)) { + edit_error_dialog (_(""), + get_sys_error (catstrs (_ ("Error close script:"), h, 0))); + return; + } else { + chmod (h, 0700); + edit_error_dialog (_(""), + get_sys_error (catstrs (_ ("Script created:"), h, 0))); + } + } + } + } + if (block) { /* for marked block run indent formatter */ if (eval_marks (edit, &start_mark, &end_mark)) { - edit_error_dialog (_(" Process block "), + edit_error_dialog (_("Process block"), /* Not essential to translate */ _(" You must first highlight a block of text. ")); return; } - edit_save_block (edit, b = catstrs (home_dir, BLOCK_FILE, 0), start_mark, end_mark); - my_system (0, shell, catstrs (home_dir, shell_cmd, 0)); - edit_refresh_cmd (edit); - } else { - my_system (0, shell, shell_cmd); - edit_refresh_cmd (edit); + edit_save_block (edit, b, start_mark, end_mark); + + /* run your script */ + my_system (EXECUTE_AS_SHELL, shell, + catstrs (home_dir, EDIT_DIR, shell_cmd, " ", + edit->filename, " ", home_dir, BLOCK_FILE, " ", + home_dir, ERROR_FILE, 0)); + + edit_refresh_cmd (edit); + + } else { /* for missing marked block run ... */ + my_system (0, shell, catstrs (EDIT_DIR, shell_cmd)); + edit_refresh_cmd (edit); } - edit->force |= REDRAW_COMPLETELY; - - f = catstrs (home_dir, ERROR_FILE, 0); - + + /* insert result block */ if (block) { - if (stat (f, &s) == 0) { + if (stat (e, &s) == 0) { if (!s.st_size) { /* no error messages */ if (edit_block_delete_cmd (edit)) return; edit_insert_file (edit, b); + if (block_file = fopen (b, "w")) fclose(block_file); return; } else { - edit_insert_file (edit, f); + edit_insert_file (edit, e); + if (block_file = fopen (b, "w")) fclose(block_file); return; } } else { /* Not essential to translate */ - edit_error_dialog (_(" Process block "), + edit_error_dialog (_(""), /* Not essential to translate */ - get_sys_error (_(" Error trying to stat file "))); + get_sys_error (catstrs (_ ("Error trying to stat file:"), e, 0))); edit->force |= REDRAW_COMPLETELY; + if (block_file = fopen (b, "w")) fclose(block_file); return; } } + return; } #endif diff --git a/gtkedit/editcmddef.h b/gtkedit/editcmddef.h index e886469b7..4aded1873 100644 --- a/gtkedit/editcmddef.h +++ b/gtkedit/editcmddef.h @@ -92,6 +92,7 @@ #define CK_Terminal 422 #define CK_Terminal_App 423 +#define CK_User_Menu 425 /* application control */ #define CK_Save_Desktop 451 #define CK_New_Window 452 diff --git a/gtkedit/editdraw.c b/gtkedit/editdraw.c index a68bed86c..90d640376 100644 --- a/gtkedit/editdraw.c +++ b/gtkedit/editdraw.c @@ -42,14 +42,25 @@ void status_string (WEdit * edit, char *s, int w, int fill, int font_width) #endif char t[160]; /* 160 just to be sure */ /* The field lengths just prevents the status line from shortening to much */ - sprintf (t, "[%c%c%c%c] %2ld:%3ld+%2ld=%3ld/%3ld - *%-4ld/%4ldb=%3d", - edit->mark1 != edit->mark2 ? ( column_highlighting ? 'C' : 'B') : '-', - edit->modified ? 'M' : '-', edit->macro_i < 0 ? '-' : 'R', - edit->overwrite == 0 ? '-' : 'O', - edit->curs_col / font_width, edit->start_line + 1, edit->curs_row, - edit->curs_line + 1, edit->total_lines + 1, edit->curs1, - edit->last_byte, edit->curs1 < edit->last_byte - ? edit_get_byte (edit, edit->curs1) : -1); +sprintf (t,"[%c%c%c%c] %2ld L:[%3ld+%2ld %3ld/%3ld] *(%-4ld/%4ldb)= %c %d %xH", + edit->mark1 != edit->mark2 ? ( column_highlighting ? 'C' : 'B') : '-', + edit->modified ? 'M' : '-', + edit->macro_i < 0 ? '-' : 'R', + edit->overwrite == 0 ? '-' : 'O', + edit->curs_col / font_width, + + edit->start_line + 1, + edit->curs_row, + edit->curs_line + 1, + edit->total_lines + 1, + + edit->curs1, + edit->last_byte, + + edit->curs1 < edit->last_byte ? edit_get_byte (edit, edit->curs1) : '?', + edit->curs1 < edit->last_byte ? edit_get_byte (edit, edit->curs1) : -1, + edit->curs1 < edit->last_byte ? edit_get_byte (edit, edit->curs1) : -1 + ); #ifdef MIDNIGHT sprintf (s, "%.*s", w + 1, t); i = strlen (s); diff --git a/gtkedit/editmenu.c b/gtkedit/editmenu.c index 9bab49d7b..4bc96f808 100644 --- a/gtkedit/editmenu.c +++ b/gtkedit/editmenu.c @@ -22,6 +22,7 @@ #include #include "edit.h" +#include "../src/user.h" #include "editcmddef.h" @@ -118,6 +119,9 @@ void menu_lit_cmd (void) { menu_key (XCTRL ('q')); } void menu_format_paragraph (void) { menu_cmd (CK_Paragraph_Format); } void edit_options_dialog (void); void menu_options (void) { edit_options_dialog (); } +void menu_user_menu_cmd (void) { menu_key (KEY_F (11)); } + +void edit_user_menu_cmd (void) { menu_edit_cmd (1); } static menu_entry FileMenu[] = { @@ -129,6 +133,9 @@ static menu_entry FileMenu[] = {' ', "", ' ', 0}, {' ', N_("&Insert file... F15"), 'I', menu_insert_file_cmd}, {' ', N_("copy to &File... C-f"), 'F', menu_cut_cmd}, + {' ', "", ' ', 0}, + {' ', N_("&User menu... F11"), 'U', menu_user_menu_cmd}, +/* {' ', N_("Menu edi&Tor edit "), 'T', edit_user_menu_cmd}, */ {' ', "", ' ', 0}, {' ', N_("a&Bout... "), 'B', edit_about_cmd}, {' ', "", ' ', 0}, @@ -145,6 +152,9 @@ static menu_entry FileMenuEmacs[] = {' ', "", ' ', 0}, {' ', N_("&Insert file... F15"), 'I', menu_insert_file_cmd}, {' ', N_("copy to &File... "), 'F', menu_cut_cmd}, + {' ', "", ' ', 0}, + {' ', N_("&User menu... F11"), 'U', menu_user_menu_cmd}, +/* {' ', N_("Menu edi&Tor edit "), 'T', edit_user_menu_cmd}, */ {' ', "", ' ', 0}, {' ', N_("a&Bout... "), 'B', edit_about_cmd}, {' ', "", ' ', 0}, @@ -218,7 +228,7 @@ static menu_entry CmdMenu[] = {' ', N_("format p&Aragraph M-p"), 'A', menu_format_paragraph}, {' ', N_("'ispell' s&Pell check C-p"), 'P', menu_ispell_cmd}, {' ', N_("sor&T... M-t"), 'T', menu_sort_cmd}, - {' ', N_("'indent' &C Formatter F19"), 'C', menu_c_form_cmd}, + {' ', N_("E&xternal Formatter F19"), 'C', menu_c_form_cmd}, {' ', N_("&Mail... "), 'M', menu_mail_cmd} }; @@ -241,7 +251,7 @@ static menu_entry CmdMenuEmacs[] = {' ', N_("format p&Aragraph M-p"), 'a', menu_format_paragraph}, {' ', N_("'ispell' s&Pell check M-$"), 'P', menu_ispell_cmd}, {' ', N_("sor&T... M-t"), 'T', menu_sort_cmd}, - {' ', N_("'indent' &C Formatter F19"), 'C', menu_c_form_cmd} + {' ', N_("E&xternal Formatter F19"), 'C', menu_c_form_cmd} }; extern void menu_save_mode_cmd (void); diff --git a/gtkedit/syntax.c b/gtkedit/syntax.c index afd055169..fedaa59b8 100644 --- a/gtkedit/syntax.c +++ b/gtkedit/syntax.c @@ -374,9 +374,12 @@ static void translate_rule_to_color (WEdit * edit, struct syntax_rule rule, int *fg = k->fg; } +extern int use_colors; + void edit_get_syntax_color (WEdit * edit, long byte_index, int *fg, int *bg) { - if (edit->rules && byte_index < edit->last_byte && option_syntax_highlighting) { + if (edit->rules && byte_index < edit->last_byte && + option_syntax_highlighting && use_colors) { translate_rule_to_color (edit, edit_get_rule (edit, byte_index), fg, bg); } else { #ifdef MIDNIGHT @@ -1501,11 +1504,6 @@ void edit_load_syntax (WEdit * edit, char **names, char *type) edit_free_syntax_rules (edit); -#ifdef MIDNIGHT - if (!SLtt_Use_Ansi_Colors || !use_colors) - return; -#endif - if (edit) { if (!edit->filename) return; diff --git a/lib/Makefile.in b/lib/Makefile.in index 6397a80b3..272bfbca3 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -14,7 +14,7 @@ INSTALL_DATA = @INSTALL_DATA@ LIBFILES_IN = mc.ext.in mc-gnome.ext.in LIBFILES_OUT = mc.ext mc-gnome.ext mc.csh mc.sh -LIBFILES_CONST = mc.hint mc.hint.es mc.hint.cs mc.hint.ru mc.lib mc.menu +LIBFILES_CONST = mc.hint mc.hint.es mc.hint.cs mc.hint.ru mc.lib mc.menu cedit.menu edit.indent.rc SUPPBIN_IN = mc.csh.in mc.sh.in SUPPBIN_OUT = mc.csh mc.sh DESKTOP_FILES = startup.links README.desktop diff --git a/lib/mc.menu b/lib/mc.menu index 36265ab8d..e0c7cc8db 100644 --- a/lib/mc.menu +++ b/lib/mc.menu @@ -335,3 +335,8 @@ C Convert gz<->bz2, tar.gz<->tar.bz2 & tgz->tar.bz2 fi shift done + ++ x /usr/bin/open | x /usr/local/bin/open & x /bin/sh +o Open next a free console + open -s -- sh + diff --git a/src/ChangeLog b/src/ChangeLog index 124fbcbb8..3571a6937 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,46 @@ +2000-05-04 Valery Kornienkov + + * src/user.c: Add macro %k it is block file name + Add macro %e it is error file name + Add macro %i it is cursor column indent of spaces, only for edit + Add macro %y, it is syntax of current file in editor, only for edit + Add condition y , it is syntax pattern of current file in edit + Add macro %x it is extension of current file + Add macro %m it is current menu filename + +2000-05-04 Valery Kornienkov + + * gtkedit/editcmd.c: Modify External Formatter (was C indent formatter) . + Autocreate a scripts in home, from templates /usr/lib/mc/edit.indent.rc, + edit.ispell.rc, etc. Remove leading and trailing spaces into _(""), + (the message of David H. Martin ) + +2000-05-05 Valery Kornienkov + + * src/user.c: Add condition (x filename) into mc.menu . + for "Open next a free console" and like. + +2000-05-04 Valery Kornienkov + + src/user.c: fix segfault in chunk_alloc of glibc, when into condition + of .mnu we have quoted space. (~.mc/menu: + f \.\ test$). + +2000-05-04 Valery Kornienkov + + * gtkedit/edit.c: + Add ability user edit menus: system: /usr/lib/mc/cedit.menu, + * gtkedit/editmenu.c: home: ~/.cedit.menu, local: .cedit.menu + Marked block is access now from an user edit menu + Access ~/.cedit/cooledit.block for insert to cursor place from + user edit menu. + Created system cedit.menu + +2000-05-04 Valery Kornienkov + + * gtkedit/editdraw.c: + Improved a status string of cool editor for best understand, + and to add char,hex view. + 2000-04-17 Andrew V. Samoilov * widget.c: (history_put): profile is free()d if chmod failed, diff --git a/src/cmd.c b/src/cmd.c index 2d1f0791c..b420609d7 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -79,9 +79,6 @@ #include "profile.h" #define MIDNIGHT -#ifdef USE_INTERNAL_EDIT - extern int edit (const char *file, int line); -#endif #include "../vfs/vfs.h" #define WANT_WIDGETS #include "main.h" /* global variables, global functions */ @@ -655,34 +652,36 @@ void ext_cmd (void) flush_extension_file (); } -void menu_edit_cmd (void) +/* where = 0 - do edit a file menu for mc */ +/* where = 1 - do edit a file menu for cool edit */ +void menu_edit_cmd (int where) { char *buffer; char *menufile; int dir = 0; dir = query_dialog ( - _("Menu file edit"), - _(" Which menu file will you edit? "), + _(" Menu edit "), + _(" Which menu file will you edit ? "), 0, geteuid() ? 2 : 3, _("&Local"), _("&Home"), _("&System Wide") ); - menufile = concat_dir_and_file(mc_home, MC_GLOBAL_MENU); + menufile = concat_dir_and_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); - switch (dir){ + switch (dir) { case 0: - buffer = g_strdup (MC_LOCAL_MENU); + buffer = g_strdup (where ? CEDIT_LOCAL_MENU : MC_LOCAL_MENU); check_for_default (menufile, buffer); break; case 1: - buffer = concat_dir_and_file (home_dir, MC_HOME_MENU); + buffer = concat_dir_and_file (home_dir, where ? CEDIT_HOME_MENU : MC_HOME_MENU); check_for_default (menufile, buffer); break; case 2: - buffer = concat_dir_and_file (mc_home, MC_GLOBAL_MENU); + buffer = concat_dir_and_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); break; default: @@ -1222,43 +1221,55 @@ void mkdir_panel_cmd (void) } /* partly taken from dcgettect.c, returns "" for C locale */ -static const char * -guess_message_value (void) +/* value should be gfreed by calling function */ +char *guess_message_value (unsigned want_info) { - const char *retval; - - /* The highest priority value is the `LANGUAGE' environment - variable. This is a GNU extension. */ - retval = getenv ("LANGUAGE"); - if (retval != NULL && retval[0] != '\0') - return retval; - - /* Setting of LC_ALL overwrites all other. */ - retval = getenv ("LC_ALL"); - if (retval != NULL && retval[0] != '\0') - return retval; - - /* Next comes the name of the desired category. */ - retval = getenv ("LC_MESSAGE"); - if (retval != NULL && retval[0] != '\0') - return retval; + const char *var[] = { + /* The highest priority value is the `LANGUAGE' environment + variable. This is a GNU extension. */ + "LANGUAGE", + /* Setting of LC_ALL overwrites all other. */ + "LC_ALL", + /* Next comes the name of the desired category. */ + "LC_MESSAGE", + /* Last possibility is the LANG environment variable. */ + "LANG", + /* NULL exit loops */ + NULL + }; - /* Last possibility is the LANG environment variable. */ - retval = getenv ("LANG"); - if (retval != NULL && retval[0] != '\0') - return retval; + gchar *retval; + + unsigned i = 0; + char *locale = NULL; - /* We use C as the default domain. POSIX says this is implementation - defined. */ - return ""; + while (var[i] != NULL) { + locale = getenv (var[i]); + if (locale != NULL && locale[0] != '\0') + break; + i++; + } + if (var[i] == NULL) + locale = ""; + + if (want_info == 0) + retval = g_strdup (locale); + else + if (var[i] == NULL) + retval = g_strdup (_("Using default locale")); + else + retval = g_strdup_printf (_("Using locale \"%s\" (from environment variable %s)"), locale, var[i]); + + return retval; } + /* Returns a random hint */ char *get_random_hint (void) { char *data, *result, *eol; char *hintfile_base, *hintfile; - const char *lang; + char *lang; int len; int start; @@ -1283,7 +1294,7 @@ char *get_random_hint (void) #endif hintfile_base = concat_dir_and_file (mc_home, MC_HINT); - lang = guess_message_value (); + lang = guess_message_value (0); hintfile = g_strdup_printf ("%s.%s", hintfile_base, lang); data = load_file (hintfile); @@ -1298,6 +1309,7 @@ char *get_random_hint (void) data = load_file (hintfile_base); } + g_free (lang); g_free (hintfile_base); if (!data) return 0; @@ -1557,7 +1569,7 @@ info_cmd (void) void quick_view_cmd (void) { - if (get_panel_widget (MENU_PANEL_IDX) == cpanel) + if ((WPanel *) get_panel_widget (MENU_PANEL_IDX) == cpanel) change_panel (); set_display_type (MENU_PANEL_IDX, view_quick); } diff --git a/src/cmd.h b/src/cmd.h index bb3ce9ada..a0201abda 100644 --- a/src/cmd.h +++ b/src/cmd.h @@ -8,7 +8,7 @@ void help_cmd (void); void dirsizes_cmd (void); int view_file_at_line (char *filename, int plain_view, int internal, int start_line); -int view_file (char *filename, int normal, int internal); +int view_file (char *filename, int normal, int internal); void view_cmd (WPanel *panel); void view_file_cmd (WPanel *panel); void view_simple_cmd (WPanel *panel); @@ -35,7 +35,7 @@ void do_re_sort (WPanel *panel); void quick_view_cmd (void); void tree_view_cmd (void); void ext_cmd (void); -void menu_edit_cmd (void); +void menu_edit_cmd (int select); void quick_chdir_cmd (void); void compare_dirs_cmd (void); void history_cmd (void); @@ -59,6 +59,8 @@ void quick_cd_cmd (void); void save_setup_cmd (void); char *get_random_hint (void); void source_routing (void); +void user_file_menu_cmd (void); +char *guess_message_value (unsigned want_info); /* Display mode code */ void info_cmd (void); @@ -71,4 +73,10 @@ void info_cmd_no_menu (void); void quick_view_cmd (void); void toggle_listing_cmd (void); void configure_panel_listing (WPanel *p, int view_type, int use_msformat, char *user, char *status); + +#ifdef USE_INTERNAL_EDIT +extern int edit (const char *file, int line); +extern int edit_run; +#endif + #endif /* __CMD_H */ diff --git a/src/features.inc b/src/features.inc index ebd2b1688..41f40e306 100644 --- a/src/features.inc +++ b/src/features.inc @@ -18,7 +18,7 @@ static const char * const features [] = { N_(" with X11 support to read modifiers"), #endif #endif - ".\n", + "\n", #ifdef USE_VFS N_("Virtual File System: tarfs, extfs"), @@ -38,7 +38,7 @@ static const char * const features [] = { #ifdef USE_EXT2FSLIB N_(", undelfs"), #endif - ".\n", + "\n", #endif #ifdef USE_INTERNAL_EDIT diff --git a/src/main.c b/src/main.c index cc6cb98ac..b4959fcc5 100644 --- a/src/main.c +++ b/src/main.c @@ -1287,7 +1287,7 @@ static menu_entry RightMenu [] = { }; static menu_entry FileMenu [] = { - { ' ', N_("&User menu F2"), 'U', user_menu_cmd }, + { ' ', N_("&User menu F2"), 'U', user_file_menu_cmd }, { ' ', N_("&View F3"), 'V', view_cmd }, { ' ', N_("Vie&w file... "), 'W', view_file_cmd }, { ' ', N_("&Filtered view M-!"), 'F', filtered_view_cmd }, @@ -1345,8 +1345,10 @@ static menu_entry CmdMenu [] = { #ifdef VERSION_4 { ' ', N_("&Listing format edit"), 'L', listmode_cmd}, #endif + { ' ', "", ' ', 0 }, { ' ', N_("&Extension file edit"), 'E', ext_cmd }, - { ' ', N_("&Menu file edit"), 'M', menu_edit_cmd } + { ' ', N_("&Menu file edit"), 'M', menu_edit_cmd }, + {' ', N_("Menu edi&Tor edit"), 'T', edit_user_menu_cmd} }; /* Must keep in sync with the constants in menu_cmd */ @@ -1719,7 +1721,7 @@ static void init_labels (Widget *paneletc) { define_label (midnight_dlg, paneletc, 1, _("Help"), help_cmd); - define_label (midnight_dlg, paneletc, 2, _("Menu"), user_menu_cmd); + define_label (midnight_dlg, paneletc, 2, _("Menu"), user_file_menu_cmd); define_label (midnight_dlg, paneletc, 9, _("PullDn"), menu_cmd); define_label (midnight_dlg, paneletc, 10, _("Quit"), (voidfn) quit_cmd); } @@ -2196,7 +2198,6 @@ prepend_cwd_on_local (char *filename) } #ifdef USE_INTERNAL_EDIT -void edit (const char *file_name, int startline); static int mc_maybe_editor_or_viewer (void) @@ -2275,17 +2276,24 @@ do_nc (void) static void version (int verbose) { + char *str; + fprintf (stderr, "The Midnight Commander %s\n", VERSION); if (!verbose) return; #ifndef HAVE_X - fprintf (stderr, - _("with mouse support on xterm%s.\n"), - status_mouse_support ? _(" and the Linux console") : ""); + fprintf (stderr, status_mouse_support ? + _("with mouse support on xterm and the Linux console.\n") : + _("with mouse support on xterm.\n")); #endif /* HAVE_X */ for (verbose = 0; features [verbose]; verbose++) fprintf (stderr, _(features [verbose])); + + str = guess_message_value (1); + fprintf (stderr, "%s\n", str); + g_free (str); + if (print_last_wd) write (stdout_fd, ".", 1); } @@ -2524,7 +2532,8 @@ print_mc_usage (void) #endif N_("-v, --view fname Start up into the viewer mode.\n" "-V, --version Report version and configuration options.\n" - "-x, --xterm Force xterm mouse support and screen save/restore.\n"), + "-x, --xterm Force xterm mouse support and screen save/restore.\n" + "+number number it is the start line number of file for `mcedit'.\n"), #ifdef HAVE_SUBSHELL_SUPPORT N_("-X, --dbgsubshell [DEVEL-ONLY: Debug the subshell].\n"), #endif @@ -3004,9 +3013,10 @@ main (int argc, char *argv []) /* mc_home was computed by OS_Setup */ home_dir = mc_home; } - + vfs_init (); - + edit_init_file(); + #ifdef HAVE_X /* NOTE: This call has to be before any our argument handling :) */ diff --git a/src/main.h b/src/main.h index c32d7ff47..deb1f4dd5 100644 --- a/src/main.h +++ b/src/main.h @@ -46,6 +46,7 @@ extern int auto_save_setup; extern int use_internal_view; extern int use_internal_edit; #ifdef USE_INTERNAL_EDIT +extern int edit (const char *file, int line); extern int option_word_wrap_line_length; extern int edit_key_emulation; extern int option_tab_spacing; @@ -162,6 +163,8 @@ void load_hint (void); void print_vfs_message(char *msg, ...); +void edit_user_menu_cmd (void); + extern char *prompt; extern char *mc_home; diff --git a/src/mc.hlp b/src/mc.hlp index e04d90109..c64619d8e 100644 --- a/src/mc.hlp +++ b/src/mc.hlp @@ -1238,12 +1238,15 @@ Condition syntax: = Sub-condition is one of following: + y syntax of current file matching pattern? + for edit menu only. f current file matching pattern? F other file matching pattern? d current directory matching pattern? D other directory matching pattern? t current file of type? T other file of type? + x is it executable filename? ! negate the result of sub-condition Pattern is a normal shell pattern or a regular expression, @@ -1701,8 +1704,23 @@ line input, a simple macro substitution takes place. The macros are: +"%i" The indent of blank space, equal the cursor column + position. For edit menu only. + +"%y" The syntax type of current file. For edit menu only. + +"%k" The block file name. + +"%e" The error file name. + +"%m" The current menu name. + "%f" The current file name. +"%n" Only the current file name without extension. + +"%x" The extension of current file name. + "%d" The current directory name. "%F" The current file in the unselected panel. @@ -2158,17 +2176,14 @@ press Ctrl-A and then the assigned key. The macro is also executed if you press Meta, Ctrl, or Esc and the assigned key, provided that the key is not used for any other function. Once defined, the macro commands go into the -file cedit/cooledit.macros in your home directory. You can +file ~/.cedit/cooledit.macros in your home directory. You can delete a macro by deleting the appropriate line in this file. -F19 will format C code when it is highlighted. For this to -work, make an executable file called cedit/edit.indent.rc -in your home directory containing the following: - -#!/bin/sh -/usr/bin/indent -kr -pcs ~/cedit/cooledit.block >& /dev/null -cat /dev/null > ~/cedit/cooledit.error +F19 will format text (C , C++ code or another) when it is +block highlighted. For this to work, first time, will create +executable file called ~/.cedit/edit.indent.rc in your +home directory. To edit this script if needed. You can use scanf search and replace to search and replace a C format string. First take a look at the sscanf and @@ -2429,7 +2444,7 @@ For example, to recover deleted files on the second partition of the first scsi disk on Linux, you would use the following path name: - /#undel:/dev/sda2 + /#undel:sda2 It may take a while for the undelfs to load the required information before you start browsing files there. diff --git a/src/screen.c b/src/screen.c index 7007965e8..4f9a6c0f4 100644 --- a/src/screen.c +++ b/src/screen.c @@ -2385,6 +2385,8 @@ panel_key (WPanel *panel, int key) return 0; } +void user_file_menu_cmd (void) { user_menu_cmd (NULL); } + static int panel_callback (Dlg_head *h, WPanel *panel, int msg, int par) { @@ -2392,7 +2394,7 @@ panel_callback (Dlg_head *h, WPanel *panel, int msg, int par) case WIDGET_INIT: #ifdef HAVE_X define_label (h, (Widget *)panel, 1, _("Help"), help_cmd); - define_label (h, (Widget *)panel, 2, _("Menu"), user_menu_cmd); + define_label (h, (Widget *)panel, 2, _("Menu"), user_file_menu_cmd); define_label (h, (Widget *)panel, 3, _("View"), view_panel_cmd); define_label (h, (Widget *)panel, 4, _("Edit"), edit_panel_cmd); define_label (h, (Widget *)panel, 5, _("Copy"), copy_cmd); @@ -2422,7 +2424,7 @@ panel_callback (Dlg_head *h, WPanel *panel, int msg, int par) focus_select_item (panel); #ifndef HAVE_X define_label (h, (Widget *)panel, 1, _("Help"), help_cmd); - define_label (h, (Widget *)panel, 2, _("Menu"), user_menu_cmd); + define_label (h, (Widget *)panel, 2, _("Menu"), user_file_menu_cmd); define_label (h, (Widget *)panel, 3, _("View"), view_panel_cmd); define_label (h, (Widget *)panel, 4, _("Edit"), edit_panel_cmd); define_label (h, (Widget *)panel, 5, _("Copy"), copy_cmd); diff --git a/src/user.c b/src/user.c index 4d10fcff7..83807584e 100644 --- a/src/user.c +++ b/src/user.c @@ -31,6 +31,7 @@ #include "dir.h" #include "panel.h" #include "main.h" +#include "subshell.h" /* for subshell_pty */ #include "user.h" #include "layout.h" #include "setup.h" @@ -50,6 +51,8 @@ static int debug_flag = 0; static int debug_error = 0; +static WEdit *s_editwidget; +static char *menu; /* Formats defined: %% The % character @@ -203,9 +206,27 @@ char *expand_format (char c, int quote) case 'f': case 'p': return (*quote_func) (fname, 0); case 'b': return strip_ext((*quote_func) (fname, 0)); + case 'x': return (*quote_func) (extension(fname), 0); case 'd': return (*quote_func) (panel->cwd, 0); case 's': if (!panel->marked) return (*quote_func) (fname, 0); + case 'i': /* indent equal number cursor position in line */ + if (s_editwidget) + return g_strnfill (s_editwidget->curs_col, ' '); + break; + case 'y': /* syntax type */ + if (s_editwidget) + return g_strdup (s_editwidget->syntax_type); + break; + case 'e': + /* error file name */ + return (*quote_func) (g_strconcat (home_dir, ERROR_FILE, NULL), 0); + case 'k': + /* block file name */ + return (*quote_func) (g_strconcat (home_dir, BLOCK_FILE, NULL), 0); + case 'm': + /* menu file name */ + return (*quote_func) (menu, 0); /* Fall through */ @@ -259,7 +280,8 @@ static char *extract_arg (char *p, char *arg) { while (*p && (*p == ' ' || *p == '\t' || *p == '\n')) p++; - while (*p && *p != ' ' && *p != '\t' && *p != '\n') + /* support quote space .mnu */ + while (*p && (*p != ' ' || *(p-1) == '\\') && *p != '\t' && *p != '\n') *arg++ = *p++; *arg = 0; if (!*p || *p == '\n') @@ -323,7 +345,8 @@ static char *test_condition (char *p, int *condition) /* Handle one condition */ for (;*p != '\n' && *p != '&' && *p != '|'; p++){ - if (*p == ' ' || *p == '\t') + /* support quote space .mnu */ + if ((*p == ' ' && *(p-1) != '\\') || *p == '\t') continue; if (*p >= 'a') panel = cpanel; @@ -341,10 +364,17 @@ static char *test_condition (char *p, int *condition) *condition = ! *condition; p--; break; - case 'f': + case 'f': /* file name pattern */ p = extract_arg (p, arg); *condition = panel && regexp_match (arg, panel->dir.list [panel->selected].fname, match_file); break; + case 'y': /* syntax pattern */ + if (s_editwidget) { + p = extract_arg (p, arg); + *condition = panel && + regexp_match (arg, s_editwidget->syntax_type, match_normal); + } + break; case 'd': p = extract_arg (p, arg); *condition = panel && regexp_match (arg, panel->cwd, match_file); @@ -353,6 +383,17 @@ static char *test_condition (char *p, int *condition) p = extract_arg (p, arg); *condition = panel && test_type (panel, arg); break; + case 'x': /* executable */ + { + struct stat status; + + p = extract_arg (p, arg); + if (stat (arg, &status) == 0) + *condition = is_exe (status.st_mode); + else + *condition = 0; + break; + } default: debug_error = 1; break; @@ -424,8 +465,9 @@ static char *test_line (char *p, int *result) /* Init debugger */ debug_out (NULL, NULL, 0); /* Repeat till end of line */ - while (*p && *p != '\n'){ - while (*p == ' ' || *p == '\t') + while (*p && *p != '\n') { + /* support quote space .mnu */ + while ((*p == ' ' && *(p-1) != '\\' ) || *p == '\t') p++; if (!*p || *p == '\n') break; @@ -434,7 +476,8 @@ static char *test_line (char *p, int *result) debug_flag = 1; p++; } - while (*p == ' ' || *p == '\t') + /* support quote space .mnu */ + while ((*p == ' ' && *(p-1) != '\\' ) || *p == '\t') p++; if (!*p || *p == '\n') break; @@ -482,7 +525,7 @@ execute_menu_command (char *commands) int cmd_file_fd; int expand_prefix_found = 0; char *parameter = 0; - int do_quote; + int do_quote = 0; char prompt [80]; int col; char *file_name; @@ -608,14 +651,19 @@ menu_file_own(char* path) return 0; } -void user_menu_cmd (void) +/* + if edit_widget = pointer then it is file menu from cool edit + if edit_widget = NULL then routine is invoke from file menu of mc. +*/ +void user_menu_cmd (WEdit *edit_widget) { - char *menu, *p; + char *p; char *data, **entries; int max_cols, menu_lines, menu_limit; int col, i, accept_entry = 1; int selected, old_patterns; Listbox *listbox; + s_editwidget = edit_widget; if (!vfs_current_is_local ()){ message (1, _(" Oops... "), @@ -623,13 +671,15 @@ void user_menu_cmd (void) return; } - menu = g_strdup (MC_LOCAL_MENU); + menu = g_strdup (edit_widget ? CEDIT_LOCAL_MENU : MC_LOCAL_MENU); if (!exist_file (menu) || !menu_file_own (menu)){ g_free (menu); - menu = concat_dir_and_file (home_dir, MC_HOME_MENU); + menu = concat_dir_and_file \ + (home_dir, edit_widget ? CEDIT_HOME_MENU : MC_HOME_MENU); if (!exist_file (menu)){ g_free (menu); - menu = concat_dir_and_file (mc_home, MC_GLOBAL_MENU); + menu = concat_dir_and_file \ + (mc_home, edit_widget ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); } } @@ -722,7 +772,6 @@ void user_menu_cmd (void) easy_patterns = old_patterns; return; } - g_free (menu); max_cols = min (max (max_cols, col), MAX_ENTRY_LEN); @@ -745,6 +794,7 @@ void user_menu_cmd (void) easy_patterns = old_patterns; do_refresh (); + g_free (menu); g_free (entries); g_free (data); } diff --git a/src/user.h b/src/user.h index fe14fc260..9517f102e 100644 --- a/src/user.h +++ b/src/user.h @@ -1,7 +1,14 @@ #ifndef __USER_H #define __USER_H -void user_menu_cmd (void); +#ifndef MIDNIGHT +#include "panel.h" +#define MIDNIGHT +#include "../gtkedit/edit-widget.h" +#undef MIDNIGHT +void user_menu_cmd (WEdit *edit_widget); +#endif + char *expand_format (char, int); int check_format_view (const char *); int check_format_var (const char *, char **); @@ -9,15 +16,21 @@ int check_format_cd (const char *); char *check_patterns (char*); #ifdef OS2_NT -# define MC_LOCAL_MENU "mc.mnu" -# define MC_GLOBAL_MENU "mc.mnu" -# define MC_HOME_MENU "mc.mnu" -# define MC_HINT "mc.hnt" +# define CEDIT_LOCAL_MENU "cedit.mnu" +# define CEDIT_GLOBAL_MENU "cedit.mnu" +# define CEDIT_HOME_MENU "cedit.mnu" +# define MC_LOCAL_MENU "mc.mnu" +# define MC_GLOBAL_MENU "mc.mnu" +# define MC_HOME_MENU "mc.mnu" +# define MC_HINT "mc.hnt" #else -# define MC_GLOBAL_MENU "mc.menu" -# define MC_LOCAL_MENU ".mc.menu" -# define MC_HOME_MENU ".mc/menu" -# define MC_HINT "mc.hint" +# define CEDIT_GLOBAL_MENU "cedit.menu" +# define CEDIT_LOCAL_MENU ".cedit.menu" +# define CEDIT_HOME_MENU ".cedit/menu" +# define MC_GLOBAL_MENU "mc.menu" +# define MC_LOCAL_MENU ".mc.menu" +# define MC_HOME_MENU ".mc/menu" +# define MC_HINT "mc.hint" #endif #endif diff --git a/vfs/ChangeLog b/vfs/ChangeLog index 0d504000b..3b7420c80 100644 --- a/vfs/ChangeLog +++ b/vfs/ChangeLog @@ -1,3 +1,7 @@ +2000-05-08 Valery Kornienkov + + vfs/extfs/uha.in: add HSC type archives + 2000-05-01 Pavel Machek * direntry.c (vfs_s_inode_from_path): fix for stating / directory diff --git a/vfs/extfs/uha.in b/vfs/extfs/uha.in index d227206bb..56100171a 100644 --- a/vfs/extfs/uha.in +++ b/vfs/extfs/uha.in @@ -1,7 +1,7 @@ #!/bin/sh # # It is the uhafs Valery Kornienkov vlk@st.simbirsk.su 2:5051/30@fidonet -# ver ? :) +# ver 0.1 Thu Apr 6 12:05:08 2000 HA=ha # for HA 0.999 Copyright (c) 1995 Harri Hirvola # Source: ftp://sunsite.unc.edu/pub/Linux/compress/ha0999p-linux.tar.gz @@ -12,7 +12,7 @@ mchafs_list () { date="JanFebMarAprMayJunJulAugSepOctNovDec" } /^===========/ {next} { - if ($5="%" && $8~/DIR|ASC|CPY/) { + if ($5="%" && $8~/DIR|ASC|HSC|CPY/) { split($6, a, "-") split($7, t, ":") filename=$1