Implementation of getting last editing/viewing position of file.
authorSlava Zanko <slavazanko@gmail.com>
Fri, 11 Jan 2013 10:31:31 +0000 (11 13:31 +0300)
committerSlava Zanko <slavazanko@gmail.com>
Sat, 16 Feb 2013 14:40:37 +0000 (16 17:40 +0300)
Signed-off-by: Slava Zanko <slavazanko@gmail.com>
lib/util.c
src/execute.c
src/execute.h
src/filemanager/cmd.c
src/filemanager/cmd.h

index eb4e117..4c4aeb0 100644 (file)
@@ -1102,7 +1102,8 @@ load_file_position (const vfs_path_t * filename_vpath, long *line, long *column,
         return;
 
     /* prepare array for serialized bookmarks */
-    *bookmarks = g_array_sized_new (FALSE, FALSE, sizeof (size_t), MAX_SAVED_BOOKMARKS);
+    if (bookmarks != NULL)
+        *bookmarks = g_array_sized_new (FALSE, FALSE, sizeof (size_t), MAX_SAVED_BOOKMARKS);
     filename = vfs_path_to_str (filename_vpath);
 
     while (fgets (buf, sizeof (buf), f) != NULL)
@@ -1143,7 +1144,7 @@ load_file_position (const vfs_path_t * filename_vpath, long *line, long *column,
                 *column = strtol (pos_tokens[1], NULL, 10);
                 if (pos_tokens[2] == NULL)
                     *offset = 0;
-                else
+                else if (bookmarks != NULL)
                 {
                     size_t i;
 
index 6dff456..2247567 100644 (file)
@@ -67,7 +67,7 @@ int pause_after_run = pause_on_dumb_terminals;
 void do_execute (const char *shell, const char *command, int flags);
 void do_executev (const char *shell, int flags, char *const argv[]);
 char *execute_get_external_cmd_opts_from_config (const char *command,
-                                                 const vfs_path_t * filename_vpath, int start_line);
+                                                 const vfs_path_t * filename_vpath, long start_line);
 
 /* --------------------------------------------------------------------------------------------- */
 
@@ -254,7 +254,7 @@ execute_get_opts_from_cfg (const char *command, const char *default_str)
 
 char *
 execute_get_external_cmd_opts_from_config (const char *command, const vfs_path_t * filename_vpath,
-                                           int start_line)
+                                           long start_line)
 {
     char *str_from_config, *return_str;
     char *parameter;
@@ -270,7 +270,7 @@ execute_get_external_cmd_opts_from_config (const char *command, const vfs_path_t
     g_free (str_from_config);
     str_from_config = return_str;
 
-    parameter = g_strdup_printf ("%d", start_line);
+    parameter = g_strdup_printf ("%ld", start_line);
     return_str = str_replace_all (str_from_config, "%lineno", parameter);
     g_free (parameter);
     g_free (str_from_config);
@@ -612,7 +612,7 @@ execute_with_vfs_arg (const char *command, const vfs_path_t * filename_vpath)
 
 void
 execute_external_editor_or_viewer (const char *command, const vfs_path_t * filename_vpath,
-                                   int start_line)
+                                   long start_line)
 {
     vfs_path_t *localcopy_vpath = NULL;
     const vfs_path_t *do_execute_vpath;
index 469b2be..a8a00ef 100644 (file)
@@ -44,7 +44,7 @@ gboolean execute_suspend (const gchar * event_group_name, const gchar * event_na
 /* Execute command on a filename that can be on VFS */
 void execute_with_vfs_arg (const char *command, const vfs_path_t * filename_vpath);
 void execute_external_editor_or_viewer (const char *command, const vfs_path_t * filename_vpath,
-                                        int start_line);
+                                        long start_line);
 
 void post_exec (void);
 void pre_exec (void);
index bbefb6a..7c453e4 100644 (file)
@@ -166,7 +166,17 @@ do_view_cmd (gboolean normal)
 static inline void
 do_edit (const vfs_path_t * what_vpath)
 {
-    do_edit_at_line (what_vpath, use_internal_edit, 0);
+    long line = 0;
+
+    if (!use_internal_edit)
+    {
+        long column;
+        off_t offset;
+
+        if (what_vpath != NULL && *(vfs_path_get_by_index (what_vpath, 0)->path) != '\0')
+            load_file_position (what_vpath, &line, &column, &offset, NULL);
+    }
+    do_edit_at_line (what_vpath, use_internal_edit, line);
 }
 
 /* --------------------------------------------------------------------------------------------- */
@@ -607,7 +617,7 @@ set_basic_panel_listing_to (int panel_index, int listing_mode)
 /* --------------------------------------------------------------------------------------------- */
 
 gboolean
-view_file_at_line (const vfs_path_t * filename_vpath, int plain_view, int internal, int start_line)
+view_file_at_line (const vfs_path_t * filename_vpath, int plain_view, int internal, long start_line)
 {
     static const char *viewer = NULL;
     gboolean ret = TRUE;
@@ -647,7 +657,7 @@ view_file_at_line (const vfs_path_t * filename_vpath, int plain_view, int intern
         char view_entry[BUF_TINY];
 
         if (start_line != 0)
-            g_snprintf (view_entry, sizeof (view_entry), "View:%d", start_line);
+            g_snprintf (view_entry, sizeof (view_entry), "View:%ld", start_line);
         else
             strcpy (view_entry, "View");
 
@@ -688,7 +698,18 @@ view_file_at_line (const vfs_path_t * filename_vpath, int plain_view, int intern
 gboolean
 view_file (const vfs_path_t * filename_vpath, int plain_view, int internal)
 {
-    return view_file_at_line (filename_vpath, plain_view, internal, 0);
+    long line = 0;
+
+    if (!internal)
+    {
+        long column;
+        off_t offset;
+
+        if (filename_vpath != NULL && *(vfs_path_get_by_index (filename_vpath, 0)->path) != '\0')
+            load_file_position (filename_vpath, &line, &column, &offset, NULL);
+    }
+
+    return view_file_at_line (filename_vpath, plain_view, internal, line);
 }
 
 
@@ -761,7 +782,7 @@ view_filtered_cmd (void)
 /* --------------------------------------------------------------------------------------------- */
 
 void
-do_edit_at_line (const vfs_path_t * what_vpath, gboolean internal, int start_line)
+do_edit_at_line (const vfs_path_t * what_vpath, gboolean internal, long start_line)
 {
     static const char *editor = NULL;
 
@@ -777,6 +798,10 @@ do_edit_at_line (const vfs_path_t * what_vpath, gboolean internal, int start_lin
             if (editor == NULL)
                 editor = get_default_editor ();
         }
+
+        if (start_line < 1)
+            start_line = 1;
+
         execute_external_editor_or_viewer (editor, what_vpath, start_line);
     }
 
index 8baa35e..71719f8 100644 (file)
@@ -53,13 +53,13 @@ void smart_dirsize_cmd (void);
 void single_dirsize_cmd (void);
 void dirsizes_cmd (void);
 gboolean view_file_at_line (const vfs_path_t * filename_vpath, int plain_view, int internal,
-                            int start_line);
+                            long start_line);
 gboolean view_file (const vfs_path_t * filename_vpath, int normal, int internal);
 void view_cmd (void);
 void view_file_cmd (void);
 void view_raw_cmd (void);
 void view_filtered_cmd (void);
-void do_edit_at_line (const vfs_path_t * what_vpath, gboolean internal, int start_line);
+void do_edit_at_line (const vfs_path_t * what_vpath, gboolean internal, long start_line);
 void edit_cmd (void);
 void edit_cmd_new (void);
 #ifdef USE_INTERNAL_EDIT