change dir using a menu command
David E
edavid at doal.co.il
Thu Jan 22 22:35:23 UTC 2004
I did as you advised and added a "%cd" macro, I changed the code to do 2
things:
1. add an environment variable: CDFILE=~/.mc_cdfile
(I used sprintf(dir_file,"CDFILE=%s/.mc_cdfile", home_dir) in the
subshell.c file)
2. when the execute_menu_command() sees %cd inside the file it changed
the variable 'change_dir' to '1' (initial value = 0),
at the end of the function (after the menu command was executed), it
searches for the ~/.mc_cdfile, if it exists, then it changes to the
directory written in it.
I tried to add a remove() command after changing the directory (to
remove the $CDFILE), but for some reason it didn't work (i'm not sure i
did it right).
to use it all one has to write in a menu command is this:
echo /path/to/new/directory > $CDFILE
%cd
Anyway, I attached the patch files for subshell.c and user.c for this
feature, I hope this helps, I'm using it for a samba mounter script I
wrote (also attached to this email).
David E.
On 02:53 Thu 22 Jan , Pavel Roskin wrote:
> On Fri, 16 Jan 2004, David E wrote:
>
> > Hi
> >
> > I've written a samba browser/mounter script, what it does is use
> > smbclient, to get a list of samba shares, and gives me a list of shares
> > using 'dialog', when I choose a share it is mounted. I've added a menu
> > item to the menu file, that will run the program, and I want mc to jump
> > to the mounted directory, I have looked around, and saw that it was
> > possible with the $MC_CONTROL_FILE variable, but then I saw that it was
> > disabled. So I'm wondering how (and if) it is possible.
>
> It's currently impossible. If you want to add this functionality, see
> execute_menu_command() in src/user.c. You could add a %cd macro in a way
> similar to the recently added %view (you'll need the CVS version or
> mc-4.6.1-pre1 to see it). Please note that mc doesn't execute the
> commands step by step. The whole menu entry is put to a script and run as
> a whole.
>
> --
> Regards,
> Pavel Roskin
> _______________________________________________
> Mc mailing list
> Mc at gnome.org
> http://mail.gnome.org/mailman/listinfo/mc
-------------- next part --------------
*** original/subshell.c Sun Oct 26 08:46:02 2003
--- subshell.c Thu Jan 22 23:57:15 2004
***************
*** 233,242 ****
--- 233,248 ----
/* Allow alternative readline settings for MC */
if (access (".mc/inputrc", R_OK) == 0)
putenv ("INPUTRC=.mc/inputrc");
+ /* david: begin CDFILE */
+ char env_cdfile[128] = "";
+ sprintf (env_cdfile, "CDFILE=%s/.mc_cdfile", home_dir);
+ putenv (env_cdfile);
+ /* david: end CDFILE */
+
break;
/* TODO: Find a way to pass initfile to TCSH and ZSH */
case TCSH: case ZSH:
break;
-------------- next part --------------
*** original/user.c Thu Jan 22 18:07:20 2004
--- user.c Thu Jan 22 23:58:47 2004
***************
*** 551,560 ****
--- 551,561 ----
int do_quote = 0;
char prompt [80];
int col;
char *file_name;
int run_view = 0;
+ int change_dir = 0; /* david: change */
/* Skip menu entry title line */
commands = strchr (commands, '\n');
if (!commands){
return;
***************
*** 625,636 ****
int i = check_format_view (commands + 1);
if (i) {
commands += i;
run_view = 1;
} else {
! do_quote = 1; /* Default: Quote expanded macro */
! expand_prefix_found = 1;
}
} else
fputc (*commands, cmd_file);
}
}
--- 626,646 ----
int i = check_format_view (commands + 1);
if (i) {
commands += i;
run_view = 1;
} else {
! i = check_format_cd (commands + 1); /* david: begin change */
! if (i)
! {
! commands += i;
! change_dir = 1;
! } /* david: end change */
! else
! {
! do_quote = 1; /* Default: Quote expanded macro */
! expand_prefix_found = 1;
! }
}
} else
fputc (*commands, cmd_file);
}
}
***************
*** 642,651 ****
--- 652,676 ----
} else {
shell_execute (file_name, 0);
}
unlink (file_name);
g_free (file_name);
+
+ if (change_dir) /* david: begin change */
+ {
+ char buffer[256] = "";
+ sprintf (buffer, "%s/.mc_cdfile", home_dir);
+ FILE *dir_file = fopen (buffer, "r");
+ if (dir_file)
+ {
+ if (fscanf (dir_file, "%255[^\n]s", buffer) == 1)
+ {
+ do_cd (buffer, cd_exact);
+ }
+ }
+ fclose (dir_file);
+ } /* david: end change */
}
/*
** Check owner of the menu file. Using menu file is allowed, if
** owner of the menu is root or the actual user. In either case
-------------- next part --------------
#!/bin/bash
# Samba Browser Script
# Written by David Elentok. 09/01/04 17:02
#
# Arguments:
# -r = reload (regenerates the share tree)
# -mc = midnight commander mode (doesn't open an mc terminal after mounting)
tempfile="$(tempfile)"
treefile="$HOME/var/smbtree"
lastfile="$HOME/var/last_smb_mount"
mc_mode=0
if [ "$1" == "-r" -o ! -e "$treefile" ]; then
TREE="$(smbtree)"
echo "$TREE" > $treefile
shift
else
TREE="$(cat $treefile)"
fi
if [ "$1" == "-mc" ]; then
mc_mode=1
fi
data=$(echo "$TREE" | grep ' ' | sed "s# ##g" | sed "s/[ ]/;/" | grep -v "^\\\\.[^\\]*;" | grep -v '\\IPC\$' | grep -v '\\ADMIN\$')
length=$(echo "$data" | grep -c $)
MENU=""
for x in $(seq $length)
do
line=$(echo "$data" | sed -n ${x}p)
share=$(echo $line | cut -d\; -f1)
desc=$(echo $line | cut -d\; -f2)
if [ -n "$desc" ]; then desc=" $desc"; fi
share_check=$(echo $share | sed 's#\\#/#g')
if [ -n "$(mount | grep $share_check)" ]; then
stats="(*)"
else
stats="( )"
fi
MENU="$MENU '$share' '$stats$desc'"
# echo "$MENU"
done
# read -n1
echo $MENU
eval "dialog --menu 'Samba Browser' 30 80 $length $MENU" 2> $tempfile
choice=$(cat $tempfile)
rm $tempfile
if [ -z "$choice" ]; then
exit 0
fi
clear
share="$(echo $choice | gawk -F'\' '{print $NF}')"
name="$(echo $choice | gawk -F'\' '{print $(NF-1)}')"
dir="$HOME/mnt/$name/$share"
# ALREADY MOUNTED --------------------------------------------------------------
if [ -n "$(mount | grep $dir)" ]; then
# NOT MC-MODE: unmount -------------------------------------------------------
if [ $mc_mode -eq 0 ]; then
echo "Unmounting [$dir]... "
smbumount $dir
exit $?
# MC-MODE: just change directory ---------------------------------------------
else
echo $dir > "$lastfile"
exit 0
fi
fi
# NOT MOUNTED ------------------------------------------------------------------
# Create Directories
if [ ! -d "$HOME/mnt/$name" ]; then mkdir "$HOME/mnt/$name"; fi
if [ ! -d "$dir" ]; then mkdir "$dir"; fi
# Mount
echo "Mounting [$choice] at [$dir]"
smbmount $choice $dir
# IF Mounted -------------------------------------------------------------------
if [ $? -eq 0 ]; then
if [ $mc_mode -eq 0 ]; then
exec mc $dir
else
echo $dir > "$lastfile"
exit 0
fi
# IF NOT -----------------------------------------------------------------------
else
rm "$lastfile"
exit 1
fi
More information about the mc
mailing list