From 339497e16421b729fa210593aa5bde023ce60c94 Mon Sep 17 00:00:00 2001 From: "Yury V. Zaytsev" Date: Sun, 29 Jun 2025 12:19:53 +0200 Subject: [PATCH 1/3] Ticket #4726: add mc wrapper for fish shell fish shell occasionally gets bug reports from mc users, so there are definitely some mc+fish users, but none of them has noticed the lack of "/usr/libexec/mc/mc-wrapper.fish". That file is supposed to define an alias that behaves like mc except that, after mc exits, it will change fish's directory to the one last used by mc. Users need to source this manually; if this is the behavior that most people expect, we should make it the default (for example by shipping this function with fish). For now, add it to mc, which shouldn't break anyone even if fish decides to add this as well. Note that fish does not do word splitting, so variable expansions usually don't need to be quoted. Tested as follows: $ make install $ type mc mc is /home/johannes/.local/bin/mc $ source /home/johannes/.local/libexec/mc/mc.fish $ type mc mc is a function with definition # Defined in /home/johannes/.local/libexec/mc/mc.fish @ line 1 function mc --description 'Visual shell for Unix-like systems - fish wrapper' source /home/johannes/.local/libexec/mc/mc-wrapper.fish $argv end mc # navigate somewhere, press F10 to exit Closes #4726. Co-authored-by: Jarkko Sakkinen Signed-off-by: Johannes Altmanninger Signed-off-by: Yury V. Zaytsev --- contrib/.gitignore | 1 + contrib/Makefile.am | 10 ++++++++-- contrib/mc-wrapper.csh.in | 1 + contrib/mc-wrapper.fish.in | 20 ++++++++++++++++++++ contrib/mc-wrapper.sh.in | 1 + contrib/mc.fish.in | 3 +++ doc/man/es/mc.1.in | 6 ++++-- doc/man/hu/mc.1.in | 6 ++++-- doc/man/it/mc.1.in | 6 ++++-- doc/man/mc.1.in | 6 ++++-- doc/man/ru/mc.1.in | 4 +++- doc/man/sr/mc.1.in | 4 +++- 12 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 contrib/mc-wrapper.fish.in create mode 100644 contrib/mc.fish.in diff --git a/contrib/.gitignore b/contrib/.gitignore index bf2c44a937..cc53777bda 100644 --- a/contrib/.gitignore +++ b/contrib/.gitignore @@ -1,4 +1,5 @@ mc-wrapper.csh mc-wrapper.sh mc.csh +mc.fish mc.sh diff --git a/contrib/Makefile.am b/contrib/Makefile.am index 4fad494b56..fd9c303c0b 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -1,8 +1,8 @@ noinst_DATA = README.xterm -SCRIPTS_IN = mc.csh.in mc.sh.in mc-wrapper.csh.in mc-wrapper.sh.in -SCRIPTS_OUT = mc.csh mc.sh mc-wrapper.csh mc-wrapper.sh +SCRIPTS_IN = mc.csh.in mc-wrapper.fish.in mc.sh.in mc-wrapper.csh.in mc-wrapper.sh.in +SCRIPTS_OUT = mc.csh mc.sh mc-wrapper.csh mc-wrapper.fish mc-wrapper.sh pkglibexec_SCRIPTS = $(SCRIPTS_OUT) @@ -20,12 +20,18 @@ EXTRA_DIST = \ mc.csh: $(top_builddir)/config.status $(srcdir)/mc.csh.in $(SED) "s%@""pkglibexecdir@%$(pkglibexecdir)%" $(srcdir)/mc.csh.in > mc.csh +mc.fish: $(top_builddir)/config.status $(srcdir)/mc.fish.in + $(SED) "s%@""pkglibexecdir@%$(pkglibexecdir)%" $(srcdir)/mc.fish.in > mc.fish + mc.sh: $(top_builddir)/config.status $(srcdir)/mc.sh.in $(SED) "s%@""pkglibexecdir@%$(pkglibexecdir)%" $(srcdir)/mc.sh.in > mc.sh mc-wrapper.csh: $(top_builddir)/config.status $(srcdir)/mc-wrapper.csh.in $(SED) "s%@""bindir@%$(bindir)%" $(srcdir)/mc-wrapper.csh.in > mc-wrapper.csh +mc-wrapper.fish: $(top_builddir)/config.status $(srcdir)/mc-wrapper.fish.in + $(SED) "s%@""bindir@%$(bindir)%" $(srcdir)/mc-wrapper.fish.in > mc-wrapper.fish + mc-wrapper.sh: $(top_builddir)/config.status $(srcdir)/mc-wrapper.sh.in $(SED) "s%@""bindir@%$(bindir)%" $(srcdir)/mc-wrapper.sh.in > mc-wrapper.sh diff --git a/contrib/mc-wrapper.csh.in b/contrib/mc-wrapper.csh.in index 1b00491bc4..391f50a068 100644 --- a/contrib/mc-wrapper.csh.in +++ b/contrib/mc-wrapper.csh.in @@ -6,6 +6,7 @@ else setenv MC_PWD_FILE "`mktemp '/tmp/mc.pwd.XXXXXX'`" endif +# Propagate mc exit code outside the wrapper @bindir@/mc -P "$MC_PWD_FILE" $* if (-r "$MC_PWD_FILE") then diff --git a/contrib/mc-wrapper.fish.in b/contrib/mc-wrapper.fish.in new file mode 100644 index 0000000000..9542bbddca --- /dev/null +++ b/contrib/mc-wrapper.fish.in @@ -0,0 +1,20 @@ +set --local MC_PWD_FILE +if set -q MC_TMPDIR + set MC_PWD_FILE (mktemp $MC_TMPDIR/mc.pwd.XXXXXX) +else if set -q TMPDIR + set MC_PWD_FILE (mktemp $TMPDIR/mc.pwd.XXXXXX) +else + set MC_PWD_FILE (mktemp /tmp/mc.pwd.XXXXXX) +end + +# Propagate mc exit code outside the wrapper +@bindir@/mc -P "$MC_PWD_FILE" $argv + +if test -r "$MC_PWD_FILE" + set --local MC_PWD (cat $MC_PWD_FILE) + if test -n $MC_PWD && test $MC_PWD != $PWD && test -d $MC_PWD + cd $MC_PWD || true + end +end + +rm -f $MC_PWD_FILE diff --git a/contrib/mc-wrapper.sh.in b/contrib/mc-wrapper.sh.in index 3d929b3485..12e598cf5f 100644 --- a/contrib/mc-wrapper.sh.in +++ b/contrib/mc-wrapper.sh.in @@ -6,6 +6,7 @@ else MC_PWD_FILE="`mktemp "/tmp/mc.pwd.XXXXXX"`" fi +# Propagate mc exit code outside the wrapper @bindir@/mc -P "$MC_PWD_FILE" "$@" if test -r "$MC_PWD_FILE"; then diff --git a/contrib/mc.fish.in b/contrib/mc.fish.in new file mode 100644 index 0000000000..d48ce2a67f --- /dev/null +++ b/contrib/mc.fish.in @@ -0,0 +1,3 @@ +function mc --description 'Visual shell for Unix-like systems - fish wrapper' + source @pkglibexecdir@/mc-wrapper.fish $argv +end diff --git a/doc/man/es/mc.1.in b/doc/man/es/mc.1.in index a4ac7f33a7..b067985490 100644 --- a/doc/man/es/mc.1.in +++ b/doc/man/es/mc.1.in @@ -92,9 +92,11 @@ usada directamente, sino desde un guión de shell adecuado, para dejar como directorio activo el directorio que estaba en uso dentro de Midnight Commander. Consúltese en los archivos .B %pkglibexecdir%/mc.sh -(usuarios de bash y zsh) y +(usuarios de bash y zsh), .B %pkglibexecdir%/mc.csh -(usuarios de tcsh) la manera de definir +(usuarios de tcsh) y +.B %pkglibexecdir%/mc.fish +(usuarios de fish) la manera de definir .B mc como un alias para el correspondiente guión de shell. .TP diff --git a/doc/man/hu/mc.1.in b/doc/man/hu/mc.1.in index b14631c1ba..06a57e550c 100644 --- a/doc/man/hu/mc.1.in +++ b/doc/man/hu/mc.1.in @@ -61,9 +61,11 @@ helyett a Midnight Commander által utoljára meglátogatott könyvtárra való Fjerdingstad\-nek és Sergey\-nek közreműködésükért). Kérlek, ne csinálj szó szerinti másolatot a funkció beállításairól. A fájlok forrása a .I %pkglibexecdir%/mc.sh -(bash és zsh felhasználóknak), illetőleg a +(bash és zsh felhasználóknak), .I %pkglibexecdir%/mc.csh -(tcsh felhasználóknak) fájl. Ilyenkor, amikor a funkció beállításokat +(tcsh felhasználóknak) illetőleg a +.I %pkglibexecdir%/mc.fish +(fish felhasználóknak) fájl. Ilyenkor, amikor a funkció beállításokat változtatod, a profil értékeket nem szükséges megváltoztatnod, csak arról gondoskodj, hogy az MC\-t ne fordítsd eltérő beállításokkal. .PP diff --git a/doc/man/it/mc.1.in b/doc/man/it/mc.1.in index 7b2591ad0f..e1c806b38f 100644 --- a/doc/man/it/mc.1.in +++ b/doc/man/it/mc.1.in @@ -82,9 +82,11 @@ utilizzata da una speciale funzione shell che imposti automaticamente l'ultima directory corrente della shell come l'ultima directory in cui stava il Midnight Commander. Prelevate i file .B %pkglibexecdir%/mc.sh -(utenti bash e zsh) o rispettivamente +(utenti bash e zsh), .B %pkglibexecdir%/mc.csh -(utenti tcsh) per definire +(utenti tcsh) o rispettivamente +.B %pkglibexecdir%/mc.fish +(utenti fish) per definire .B mc come un alias allo script di shell appropriato. .TP diff --git a/doc/man/mc.1.in b/doc/man/mc.1.in index dc90272ad3..dab74fe836 100644 --- a/doc/man/mc.1.in +++ b/doc/man/mc.1.in @@ -78,9 +78,11 @@ not meant to be used directly. Instead, it's used from a special shell script that automatically changes the current directory of the shell to the last directory Midnight Commander was in. Source the file .B %pkglibexecdir%/mc.sh -(bash and zsh users) or +(bash and zsh users), .B %libexecdir%/mc.csh -(tcsh users) respectively to define +(tcsh users), or +.B %pkglibexecdir%/mc.fish +(fish users) respectively to define .B mc as an alias to the appropriate shell script. .TP diff --git a/doc/man/ru/mc.1.in b/doc/man/ru/mc.1.in index 0c0630951a..2ae88751e0 100644 --- a/doc/man/ru/mc.1.in +++ b/doc/man/ru/mc.1.in @@ -90,8 +90,10 @@ Commander. .IP Для того чтобы эта функция была определена, используйте файл .B %pkglibexecdir%/mc.sh -для оболочек bash и zsh, а для оболочки tcsh соответственно файл +для оболочек bash и zsh, или для оболочки tcsh файл .B %pkglibexecdir%/mc.csh +а для оболочки fish соответственно файл +.B %pkglibexecdir%/mc.fish .TP .I \-s, \-\-slow Включает медленный режим терминала, в котором программа выводит меньше diff --git a/doc/man/sr/mc.1.in b/doc/man/sr/mc.1.in index 98b16c635f..2d2db4ce9b 100644 --- a/doc/man/sr/mc.1.in +++ b/doc/man/sr/mc.1.in @@ -64,7 +64,9 @@ termcap/terminfo. Корисно је само на ХП\-овим термин .B %pkglibexecdir%/mc.sh (за кориснике љуски bash и zsh) или .B %pkglibexecdir%/mc.csh -(за кориснике љуске tcsh), тим редом, да бисте задали +(за кориснике љуске tcsh) или +.B %pkglibexecdir%/mc.fish +(за кориснике љуске fish), тим редом, да бисте задали .B mc као надимак за одговарајући спис љуске. .TP From 30094d210e0fd1633ae0afaf3e420bb731dc440b Mon Sep 17 00:00:00 2001 From: Johannes Altmanninger Date: Sat, 28 Jun 2025 15:33:02 +0200 Subject: [PATCH 2/3] doc/man/mc.1.in: fix typo This was missed in 76555ad40 (man: much use of directory macros, 2021-12-08). Signed-off-by: Johannes Altmanninger Signed-off-by: Yury V. Zaytsev --- doc/man/mc.1.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/man/mc.1.in b/doc/man/mc.1.in index dab74fe836..243e635e2d 100644 --- a/doc/man/mc.1.in +++ b/doc/man/mc.1.in @@ -79,7 +79,7 @@ script that automatically changes the current directory of the shell to the last directory Midnight Commander was in. Source the file .B %pkglibexecdir%/mc.sh (bash and zsh users), -.B %libexecdir%/mc.csh +.B %pkglibexecdir%/mc.csh (tcsh users), or .B %pkglibexecdir%/mc.fish (fish users) respectively to define From 3e761f04f552f62d3de7b52956714313e6ef52a7 Mon Sep 17 00:00:00 2001 From: Johannes Altmanninger Date: Sat, 5 Jul 2025 12:06:48 +0200 Subject: [PATCH 3/3] contrib: reformat to help future wrapper additions Signed-off-by: Johannes Altmanninger Signed-off-by: Yury V. Zaytsev --- contrib/.gitignore | 4 ++-- contrib/Makefile.am | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/contrib/.gitignore b/contrib/.gitignore index cc53777bda..46a1a1490a 100644 --- a/contrib/.gitignore +++ b/contrib/.gitignore @@ -1,5 +1,5 @@ -mc-wrapper.csh -mc-wrapper.sh +mc-wrapper.* +!mc-wrapper.*.in mc.csh mc.fish mc.sh diff --git a/contrib/Makefile.am b/contrib/Makefile.am index fd9c303c0b..4a6f03e104 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -1,8 +1,18 @@ noinst_DATA = README.xterm -SCRIPTS_IN = mc.csh.in mc-wrapper.fish.in mc.sh.in mc-wrapper.csh.in mc-wrapper.sh.in -SCRIPTS_OUT = mc.csh mc.sh mc-wrapper.csh mc-wrapper.fish mc-wrapper.sh +SCRIPTS_IN = \ + mc.csh.in \ + mc.sh.in \ + mc-wrapper.csh.in \ + mc-wrapper.fish.in \ + mc-wrapper.sh.in +SCRIPTS_OUT = \ + mc.csh \ + mc.sh \ + mc-wrapper.csh \ + mc-wrapper.fish \ + mc-wrapper.sh pkglibexec_SCRIPTS = $(SCRIPTS_OUT)