bug in edit.m

Ben Abbott bpabbott at mac.com
Wed Jan 16 21:03:16 CST 2008


On Jan 15, 2008, at 8:56 PM, John W. Eaton wrote:

> On 15-Jan-2008, Ben Abbott wrote:
>
> |
> | On Jan 15, 2008, at 7:12 PM, John W. Eaton wrote:
> |
> | > On 15-Jan-2008, Ben Abbott wrote:
> | >
> | > | Actually, I guess I'd prefer all cases be left to the editor to
> | > decide
> | > | what to do.
> | >
> | > In that case, you would just always pass the filename (whatever  
> it is,
> | > presumably after looking for it in the path if it is not an  
> absolute
> | > file name) and let the editor have its way.  Then we wouldn't  
> need to
> | > worry about FUNCTION.HOME or opening in the current directory, or
> | > permissions or anything else.
> | >
> | > jwe
> |
> | Something like the sequence below?
> |
> | (1) Search the path for the explicit file (do not append .m)
> | (2) If no file, the append the ".m" and search again.
> | (3) if file exists in the path, append its path to the filename.
> | (4) Pass the result to the editor.
>
> OK, how about the following (here, F is the given file name):
>
>  files = {f};
>  if (isempty (regexp (f, "\\.m$")))
>    files{2} = strcat (f, ".m");
>  endif
>  file_to_edit = file_in_loadpath (files);
>  if (isempty (file_to_edit))
>    file_to_edit = f;
>  endif
>
> If we are searching for foo and foo.m, the above will only search the
> path once, looking in each directory for foo first, then for foo.m,
> returning the first one found.
>
> Except that you might want to deal with absolute or rooted relative
> file names first.  There are internal functions in Octave that decide
> whether a file name is absolute or rooted relative (declared in
> liboctave/oct-env.h), but they are not exported to the scripting
> language.  Maybe they should be.  Or maybe it would be better to fix
> file_in_loadpath to properly handle absolute and rooted relative
> names.
>
> Also, if a user asks to edit foo.dat, should we avoid looking for
> foo.dat.m? In that case, I guess the pattern match should just be to
> see if there is a "." anywhere in the name.
>
> jwe

Please review and comment.

	2008-01-16  Ben Abbott <bpabbott at mac.com>

	* miscellaneous/edit.m: Changed behavior to be consistent with Matlab.
	Open all existing files in place. New files are opened in the pwd.


Index: edit.m
===================================================================
RCS file: /cvs/octave/scripts/miscellaneous/edit.m,v
retrieving revision 1.3
diff -u -r1.3 edit.m
--- edit.m	29 Dec 2007 00:30:20 -0000	1.3
+++ edit.m	17 Jan 2008 02:56:11 -0000
@@ -27,28 +27,25 @@
  ##
  ## @itemize @bullet
  ## @item
-## If the function @var{name} is available in a file on your path and
-## that file is modifiable, then it will be edited in place.  If it
-## is a system function, then it will first be copied to the directory
-## @code{HOME} (see further down) and then edited.
+## If the function @var{name} is available in a file on your path it
+## will be edited in place.
  ##
  ## @item
-## If @var{name} is the name of a function defined in the interpreter  
but
-## not in an m-file, then an m-file will be created in @code{HOME}
+## If @var{name} is the name of a function defined in the interpreter
+## but not in an m-file, then an m-file will be created in @code{PWD}
  ## to contain that function along with its current definition.
  ##
  ## @item
  ## If @code{name.cc} is specified, then it will search for  
@code{name.cc}
  ## in the path and try to modify it, otherwise it will create a new
-## @file{.cc} file in @code{HOME}.  If @var{name} happens to be an
+## @file{.cc} file in @code{PWD}.  If @var{name} happens to be an
  ## m-file or interpreter defined function, then the text of that
  ## function will be inserted into the .cc file as a comment.
  ##
  ## @item
-## If @var{name.ext} is on your path then it will be editted, otherwise
-## the editor will be started with @file{HOME/name.ext} as the
-## filename.  If @file{name.ext} is not modifiable, it will be copied  
to
-## @code{HOME} before editing.
+## If @var{name.ext} is on your path then it will be edited, otherwise
+## the editor will be started with @file{./name.ext} as the
+## filename.
  ##
  ## @strong{WARNING!} You may need to clear name before the new  
definition
  ## is available.  If you are editing a .cc file, you will need
@@ -185,47 +182,31 @@
        error ("unable to edit a built-in or compiled function");
    endswitch

-  ## Find file in path.
-  idx = rindex (file, ".");
-  if (idx != 0)
-    ## If file has an extension, use it.
-    path = file_in_loadpath (file);
-  else
-    ## Otherwise try file.cc, and if that fails, default to file.m.
-    path = file_in_loadpath (strcat (file, ".cc"));
-    if (isempty (path))
-      file = strcat (file, ".m");
-      path = file_in_loadpath (file);
+  ## If no path info, and no ".m" look for both the file and file+".m"
+  if !(any (strfind (file, filesep)) || \
+      (any (strfind (file, ".")) && isempty (regexp (file, "\\.m$"))))
+    files = {file};
+    if (isempty (regexp (file, "\\.m$")))
+      ## If the name is not explicity an m-file, create a list with  
each.
+      files{2} = strcat (file, ".m");
+    endif
+    ## File without the ".m" exists, it has precidence over the ".m"  
version.
+    file_to_edit = file_in_loadpath (files);
+    if (numel (file_to_edit))
+      file = file_to_edit;
      endif
    endif

-  ## If the file exists and is modifiable in place then edit it,
-  ## otherwise copy it and then edit it.
-  if (! isempty (path))
-    fid = fopen (path, "r+t");
-    if (fid < 0)
-      from = path;
-      path = strcat (FUNCTION.HOME, from (rindex (from, filesep):end))
-      [status, msg] = copyfile (from, path, 1);
-      if (status == 0)
-        error (msg);
-      endif
-    else
-      fclose(fid);
-    endif
-    system (sprintf (FUNCTION.EDITOR, strcat ("\"", path, "\"")),
-	    [], FUNCTION.MODE);
+  ## If the file exists, edit it.
+  if exist (file)
+    system (sprintf (FUNCTION.EDITOR, strcat ("\"", file, "\"")),
+            [], FUNCTION.MODE);
      return;
    endif

    ## If editing something other than a m-file or an oct-file, just
    ## edit it.
-  idx = rindex (file, filesep);
-  if (idx != 0)
-    path = file;
-  else
-    path = fullfile (FUNCTION.HOME, file);
-  endif
+  path = file;
    idx = rindex (file, ".");
    name = file(1:idx-1);
    ext = file(idx+1:end);
@@ -373,6 +354,8 @@
        text = strcat (comment, body);
    endswitch

+path
+file
    ## Write the initial file (if there is anything to write)
    fid = fopen (path, "wt");
    if (fid < 0)





-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://www.cae.wisc.edu/pipermail/octave-maintainers/attachments/20080116/ce1d4ee2/attachment-0002.html 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: edit.patch
Type: application/octet-stream
Size: 4277 bytes
Desc: not available
Url : https://www.cae.wisc.edu/pipermail/octave-maintainers/attachments/20080116/ce1d4ee2/attachment-0002.obj 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: edit.ChangeLog
Type: application/octet-stream
Size: 186 bytes
Desc: not available
Url : https://www.cae.wisc.edu/pipermail/octave-maintainers/attachments/20080116/ce1d4ee2/attachment-0003.obj 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://www.cae.wisc.edu/pipermail/octave-maintainers/attachments/20080116/ce1d4ee2/attachment-0003.html 


More information about the Octave-maintainers mailing list