about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@ipost.com>2021-05-15 13:23:31 -0700
committerBart Schaefer <schaefer@ipost.com>2021-05-15 13:23:31 -0700
commit231c049c022963f65f869b9c12e763473207b42a (patch)
tree1988ea722c23f8086de62f64a0b397d6022c7e76
parent9e38ab81785c4ac755a7e78d2fe7a7db92bdf375 (diff)
downloadzsh-231c049c022963f65f869b9c12e763473207b42a.tar.gz
zsh-231c049c022963f65f869b9c12e763473207b42a.tar.xz
zsh-231c049c022963f65f869b9c12e763473207b42a.zip
48707: fix keymap handling when zed invokes read-from-minibuffer; update doc
-rw-r--r--ChangeLog5
-rw-r--r--Doc/Zsh/contrib.yo21
-rw-r--r--Functions/Zle/zed-set-file-name27
3 files changed, 38 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 9392e39d9..63341d2bf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2021-05-15  Bart Schaefer  <schaefer@zsh.org>
+
+	* 48707: Doc/Zsh/contrib.yo, Functions/Zle/zed-set-file-name:
+	fix keymap handling when zed invokes read-from-minibuffer
+
 2021-05-06  Peter Stephenson  <p.stephenson@samsung.com>
 
 	* 48787: Src/loop.c, Test/A01grammar.ztst: status was incorrect
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index 8bf1a208e..da7ab2a7c 100644
--- a/Doc/Zsh/contrib.yo
+++ b/Doc/Zsh/contrib.yo
@@ -4534,16 +4534,17 @@ suitable for putting into a startup file.  Note that, if rerun,
 this will overwrite the existing tt(zed) and tt(zed-vicmd) keymaps.
 
 Completion is available, and styles may be set with the context prefix
-`tt(:completion:zed)'.
-
-A zle widget tt(zed-set-file-name) is available.  This can be called by
-name from within zed using `tt(\ex zed-set-file-name)' (note, however, that
-because of zed's rebindings you will have to type tt(^j) at the end instead
-of the return key), or can be bound to a key in either of the tt(zed) or
-tt(zed-vicmd) keymaps after `tt(zed -b)' has been run.  When the widget is
-called, it prompts for a new name for the file being edited.  When zed
-exits the file will be written under that name and the original file will
-be left alone.  The widget has no effect with `tt(zed -f)'.
+`tt(:completion:zed:)'.
+
+findex(zed-set-file-name)
+A zle widget tt(zed-set-file-name) is available.  This can be called
+by name from within zed using `tt(\ex zed-set-file-name)' or can be
+bound to a key in either of the tt(zed) or tt(zed-vicmd) keymaps after
+`tt(zed -b)' has been run.  When the widget is called, it prompts for
+a new name for the file being edited.  When zed exits the file will be
+written under that name and the original file will be left alone.  The
+widget has no effect when invoked from `tt(zed -f)'.  The completion
+context is changed to `tt(:completion:zed-set-file-name:)'.
 
 While tt(zed-set-file-name) is running, zed uses the keymap
 tt(zed-normal-keymap), which is linked from the main keymap in effect
diff --git a/Functions/Zle/zed-set-file-name b/Functions/Zle/zed-set-file-name
index da3421e71..745610660 100644
--- a/Functions/Zle/zed-set-file-name
+++ b/Functions/Zle/zed-set-file-name
@@ -2,8 +2,25 @@ emulate -L zsh
 
 autoload -Uz read-from-minibuffer
 
-zle -K zed-normal-keymap
-
-local REPLY
-read-from-minibuffer "File name: "
-zed_file_name=$REPLY
+case $curcontext in
+  (zed:::)
+    local curcontext=zed-set-file-name:::
+    # The call to vared from zed does the equivalent of
+    #  bindkey -A zed main
+    # which confuses read-from-minibuffer.  Fix it.
+    bindkey -A zed-normal-keymap main;;
+  (zed-set-file-name:::)
+    zle -M "zed-set-file-name: may not be called recursively"
+    return 1;;
+  (*)
+    zle -M "zed-set-file-name: not called from within zed"
+    return 1;;
+esac
+{
+  local REPLY
+  read-from-minibuffer "File name: "
+  zed_file_name=$REPLY
+} always {
+  # Re-install the zed keymap in the way vared should have all along
+  zle -K zed
+}