From 231c049c022963f65f869b9c12e763473207b42a Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Sat, 15 May 2021 13:23:31 -0700 Subject: 48707: fix keymap handling when zed invokes read-from-minibuffer; update doc --- ChangeLog | 5 +++++ Doc/Zsh/contrib.yo | 21 +++++++++++---------- Functions/Zle/zed-set-file-name | 27 ++++++++++++++++++++++----- 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 + + * 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 * 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 +} -- cgit 1.4.1