in reply to mvi -- mv+vi (+ln+rm+cp+mkdir)

What about using symlink on directories (I needed it)?

Just a simple example that works quite well (I haven't tested it extesively).

if( (-f $file) and ( ! link( $file, $new )) ) { warn "Can't link $file to $new: $!\n"; } elsif( (-d $file) and ( ! symlink( $file, $new )) ) { warn "Can't symbolic link $file to $new: $!\n"; } else { $did= 'ln'; }

In the ProcessFile subroutine.

And recursive directory structure creation (just like mkdir -p)?

This is made using the subroutine make_path in File::Path instead of mkdir to create directories.

use File::Path qw< make_path >; # this should be added at the t +op sub MakeNewDirs { my( @newDirs )= @_; for my $dir ( @newDirs ) { if( -d $dir ) { warn "mkdir $dir: Already exists.\n"; } elsif( make_path( $dir ) ) { warn "mkdir $dir\n"; } else { warn "Can't mkdir $dir: $!\n"; } } }

Anyway thank you for sharing.

Alex's Log - http://alexlog.co.cc

Replies are listed 'Best First'.
Re^2: mvi -- mv+vi (+ln+rm+cp+mkdir) (ln -s, mkdir -p)
by tye (Sage) on Aug 02, 2010 at 21:02 UTC

    I usually want to be told when I typo part of the path. And, since I'm in vim, it isn't hard to expand "MD=foo/bar/baz" to add "MD=foo" and "MD=foo/bar". But I can see wanting to avoid such machinations. Perhaps MP= makes sense.

    As I was posting this, I briefly wondered why I hadn't added support for creating symbolic links (other than "never needed it, yet"). Thinking about it more now that you've asked, I see some problems with supporting such. There are lots of ways to make a symbolic link that points to an existing file or directory and I don't yet see a clear way to distinguish between the cases via this interface.

    Consider "mvi foo/*" and then changing "=foo/bar" to "S=foo/baz". You probably want the equivalent of

    % ln -s bar foo/baz % readlink foo/baz bar %

    not "readlink foo/baz" returning "../foo/bar" nor "/whatever/path/we/are/in/foo/bar". But if you did want one of those, how would specify it?

    Maybe I should just assume that people either want relative symlinks or absolute symlinks and, when making relative symlinks, remove as many instances of ".." as possible? Then you could say "RS=foo/baz" or "AS=foo/baz". That'd be easier than actually trying to get the invocation of "ln -s" correct on the first try (which is extra hard for me since I personally always think that the arguments to "ln -s" should go in the other order for some reason).

    I'd probably never use "ln -s" directly again. Yeah, I think I really need to implement this.

    Thanks for the suggestions!

    - tye