From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=DKIM_ADSP_ALL,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 2133 invoked from network); 22 Feb 2021 22:28:43 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 22 Feb 2021 22:28:43 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20200801; t=1614032923; b=QXq2WdgLmofMZcatDUAx8M080UhM7/6uh0y3f1jI1t+TunCLG83ZB2Sjo8/pVSm5hJP4L407X8 k3kYW6a8SPgvsEwjQ/xAG/0OPx66ANsq9ogONI7aLZ2qT9bnUW0WtpkNzqERWbw8AXgW0lebTN b6jsldHC5KAlo7K/ptkZ8bpKtCR3vKDP9fTinrurm2rKBdQHoiV0TsIoshiLW1SNJGw0lw8a0u jHx+m0QGKIEFIVvGRYeH+BjOhgzvzBrLUYwcKMJPiGAK0V4XPv8kLlPDfajORGOThUKaIwKU3V N4PQJJHrVkV2WW++sLj1IwSXwSGAJPL/LYWXI38ZQDnkOw==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail.cs.msu.ru) smtp.remote-ip=188.44.42.39; dkim=pass header.d=cs.msu.ru header.s=dkim header.a=rsa-sha256; dmarc=pass header.from=cs.msu.ru; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20200801; t=1614032923; bh=hN9nYuxvMYuYbgESBipHH33H5UO0rNa22zKlwnON9kM=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Subject:Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-ID:Date:Cc:To:From:DKIM-Signature:DKIM-Signature; b=nPdKsdQRZWjKlj5Eubogmn0Tm0PzJHohjU9qABjoHxfyXYywbA8vc7VENhspprexpkmrk5SZBr 8RXDSxXaJEzcWIaIx5YRoisK9cSUmc/nh98A5etXUN+EwfWFMgOCO2ZU/IL2jDDTvDoKI/42PO +i/xIG4+nMYLY1Ef2c+5jArn4Tt8Wt+s0DScTVoxNDyX28lhKnYAZl5T8xpA7FGWc2jC3aYBYq mAusXGGdX70NLIhiyShCuzqECdMcim6qcnlGJt42GaWUzudvc9NGJa+tTMczFOhNTvApMI+PxW dcjWyt83QAGOFs3bFHpyZw5WJyTaiVDzF9CYZq++G1A0SQ==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20200801; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Subject:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Cc:To:From:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=ANpMcgmvCS+ME76efNoAagLd9ZrtNe+MkFUdoU67Yik=; b=qZPA+WMtPQhwz7fyxi0/scZvlX L0Kv90Ovz7ELAF+/2YnLmX5TH+ZEx1LALpp8X6clL0HpO3cSz4IkCyN36o/H8TYZABkTbnofuzL5j 3bA37iyr85pAtPaJRsIWYBpTTC4YD+JIb0Nc8sPtcOayMa4FQ/+cvtthdqQlDgpsQCcTpVTVn+fyS C6RIWz4ALKertR2fGkgCts9Rq1DCbGjFk9GWVnqyGR8LHiQww9N5bIT1ciwQD5PpAOKWfta4+6AvW LYGzG3lMHTvJXBv20cM5Ab8XpyNevO7IFZDOADEVhAV4NKSc87/imGN734aXOkrcNsM5vk1scARN6 vXk9Sj3w==; Received: from authenticated user by zero.zsh.org with local id 1lEJh4-000MpT-JF; Mon, 22 Feb 2021 22:28:42 +0000 Authentication-Results: zsh.org; iprev=pass (mail.cs.msu.ru) smtp.remote-ip=188.44.42.39; dkim=pass header.d=cs.msu.ru header.s=dkim header.a=rsa-sha256; dmarc=pass header.from=cs.msu.ru; arc=none Received: from mail.cs.msu.ru ([188.44.42.39]:49248) by zero.zsh.org with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) id 1lEJgr-000MOW-Kk; Mon, 22 Feb 2021 22:28:30 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=cs.msu.ru; s=dkim; h=Subject:Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=ANpMcgmvCS+ME76efNoAagLd9ZrtNe+MkFUdoU67Yik=; b=ThEX4dsQ9gRUslmH4bUVWoBEwZ TBpf/9LMKAPG5Zbh3KgJTvZnlw4gSWLfa0C+bKKC5JfEq5A2fk1SL3BBNFTDS67TkUo4+s1m+ovod 1BQADo1L0Vin/qdbiHUwfWjHyw4zhub9bF6frwcJrQRHiZTp0i8L4Eqq7GaaSECMVWcV/Sy6prgT6 FaJXiEyqlZQ61zs3aFcH/8mUgyNyj5upedr7XrQH1cMLa9ZCmZphCSiq9cinZLaoPg4ZW0puvm8p9 IzSXFsk6BaCB2M4jdJFCV8OTD7EMaAxjSTo5K6p6GNKPa4Euao75k1hpa6ZmjH01DAS3aEZIi1JK0 SFM6wYYw==; Received: from [37.204.119.143] (port=37198 helo=localhost.localdomain) by mail.cs.msu.ru with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94 (FreeBSD)) (envelope-from ) id 1lEJgq-0004qn-JZ; Tue, 23 Feb 2021 01:28:28 +0300 From: Arseny Maslennikov To: zsh-workers@zsh.org Cc: Arseny Maslennikov Date: Tue, 23 Feb 2021 01:28:00 +0300 Message-Id: <20210222222800.243147-1-ar@cs.msu.ru> X-Mailer: git-send-email 2.30.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 37.204.119.143 X-SA-Exim-Mail-From: ar@cs.msu.ru Subject: [PATCH v2] promptinit: Fix prompt cleanups X-SA-Exim-Version: 4.2.1 X-SA-Exim-Scanned: Yes (on mail.cs.msu.ru) X-Seq: 48094 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: The Zsh documentation at Doc/Zsh/contrib, paragraph 26.6.4 "Writing Themes", says: Declare cleanup If your function makes any other changes that should be undone when the theme is disabled, your setup function may call prompt_cleanup command where command should be suitably quoted. If your theme is ever disabled or replaced by another, command is executed with eval. You may declare more than one such cleanup hook. The promptinit framework fails to apply cleanup commands of the current theme on any theme change other than "prompt restore", as well as when invoking setup functions of a certain $theme as an implementation detail of `prompt -[hp] $theme'. This problem was previously brought up in zsh-users/23314, to no avail. We fix it in the following way, hopefully without breaking compatibility: * Rename zstyle `cleanup' on the context `:prompt-theme' to `restore' everywhere but in prompt_cleanup(). It is only used as a restore mechanism now. * Ensure prompt_cleanup() continues to store its command list in the `cleanup' style. * Clean up before theme switch at the end of set_prompt(). * Prepend every use of prompt_*_setup (which might modify the shell state in ways that require cleanup) with a cleanup run. * Adjust `prompt restore' to do both parts of the newly split restore mechanism, cleanup first. --- Changes since v1: * fix the case when no theme was previously activated * small refactorings --- Functions/Prompts/prompt_restore_setup | 1 + Functions/Prompts/promptinit | 54 +++++++++++++++++--------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/Functions/Prompts/prompt_restore_setup b/Functions/Prompts/prompt_restore_setup index 54c4adbf9..b77dbe815 100644 --- a/Functions/Prompts/prompt_restore_setup +++ b/Functions/Prompts/prompt_restore_setup @@ -1,2 +1,3 @@ # Damn that was easy zstyle -t :prompt-theme cleanup +zstyle -t :prompt-theme restore diff --git a/Functions/Prompts/promptinit b/Functions/Prompts/promptinit index 5e42ebdd3..37d69f100 100644 --- a/Functions/Prompts/promptinit +++ b/Functions/Prompts/promptinit @@ -47,17 +47,19 @@ prompt_preview_safely() { return fi - # This handles all the stuff from the default :prompt-theme cleanup + # This handles all the stuff from the default :prompt-theme restore local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2 local +h PROMPT=$PROMPT RPROMPT=$RPROMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR - local -a precmd_functions preexec_functions prompt_preview_cleanup + local -a precmd_functions preexec_functions prompt_preview_restore local -aLl +h zle_highlight { # Save and clear current restore-point if any - zstyle -g prompt_preview_cleanup :prompt-theme cleanup + zstyle -g prompt_preview_restore :prompt-theme restore { - zstyle -d :prompt-theme cleanup + zstyle -d :prompt-theme restore + # Execute current cleanup sequence, if any. + zstyle -t :prompt-theme cleanup # The next line is a bit ugly. It (perhaps unnecessarily) # runs the prompt theme setup function to ensure that if @@ -74,8 +76,8 @@ prompt_preview_safely() { zstyle -t :prompt-theme cleanup } } always { - (( $#prompt_preview_cleanup )) && - zstyle -e :prompt-theme cleanup "${prompt_preview_cleanup[@]}" + (( $#prompt_preview_restore )) && + zstyle -e :prompt-theme restore "${prompt_preview_restore[@]}" } } @@ -103,9 +105,11 @@ Use prompt -h for help on specific themes.' local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2 local +h PROMPT=$PROMPT RPROMPT=$RPROMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR local -a precmd_functions preexec_functions + local theme_reset='' else - trap 'prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' 0 + local theme_reset='prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' fi + trap 'zstyle -t :prompt-theme cleanup;'"${theme_reset:+ $theme_reset}" 0 ;; esac case "$opt" in @@ -120,6 +124,7 @@ Use prompt -h for help on specific themes.' ;; h) if [[ -n "$2" && -n $prompt_themes[(r)$2] ]]; then if functions prompt_$2_setup >/dev/null; then + zstyle -t :prompt-theme cleanup # The next line is a bit ugly. It (perhaps unnecessarily) # runs the prompt theme setup function to ensure that if # the theme has a _help function that it's been autoloaded. @@ -179,28 +184,38 @@ Use prompt -h for help on specific themes.' typeset -ga zle_highlight=( ${zle_highlight:#default:*} ) (( ${#zle_highlight} )) || unset zle_highlight + zstyle -t :prompt-theme cleanup prompt_$1_setup "$@[2,-1]" && prompt_theme=( "$@" ) ;; esac } prompt_cleanup () { - local -a cleanup_hooks - if zstyle -g cleanup_hooks :prompt-theme cleanup - then - cleanup_hooks+=(';' "$@") - zstyle -e :prompt-theme cleanup "${cleanup_hooks[@]}" - elif (( $+prompt_preview_cleanup == 0 )) + local -a cleanup_hooks theme_active + if ! zstyle -g cleanup_hooks :prompt-theme cleanup then - print -u2 "prompt_cleanup: no prompt theme active" - return 1 + (( $+prompt_preview_restore == 0 )) && + if ! zstyle -g theme_active :prompt-theme restore + then + print -u2 "prompt_cleanup: no prompt theme active" + return 1 + fi + + # Set the cleanup sequence up. + zstyle -e :prompt-theme cleanup \ + 'zstyle -d :prompt-theme cleanup;' \ + 'reply=(yes)' + zstyle -g cleanup_hooks :prompt-theme cleanup fi + + cleanup_hooks+=(';' "$@") + zstyle -e :prompt-theme cleanup "${cleanup_hooks[@]}" } prompt () { local -a prompt_opts theme_active - zstyle -g theme_active :prompt-theme cleanup || { + zstyle -g theme_active :prompt-theme restore || { # This is done here rather than in set_prompt so that it # is safe and sane for set_prompt to setopt localoptions, # which will be cleared before we arrive back here again. @@ -210,8 +225,8 @@ prompt () { [[ -o promptpercent ]] && prompt_opts+=(percent) [[ -o promptsp ]] && prompt_opts+=(sp) [[ -o promptsubst ]] && prompt_opts+=(subst) - zstyle -e :prompt-theme cleanup \ - 'zstyle -d :prompt-theme cleanup;' \ + zstyle -e :prompt-theme restore \ + 'zstyle -d :prompt-theme restore;' \ 'prompt_default_setup;' \ ${PS1+PS1="${(q)PS1}"} \ ${PS2+PS2="${(q)PS2}"} \ @@ -239,7 +254,7 @@ prompt_preview_theme () { emulate -L zsh # Check for proper state handling - (( $+prompt_preview_cleanup )) || { + (( $+prompt_preview_restore )) || { prompt_preview_safely "$@" return } @@ -249,6 +264,7 @@ prompt_preview_theme () { print -n "$1 theme" (( $#* > 1 )) && print -n " with parameters \`$*[2,-1]'" print ":" + zstyle -t :prompt-theme cleanup prompt_${1}_setup "$@[2,-1]" (( ${#prompt_opts} )) && setopt noprompt{bang,cr,percent,sp,subst} "prompt${^prompt_opts[@]}" -- 2.30.1