zsh不会在提示中重新加载功能

约翰·史密斯

我正在尝试使zsh提示每次加载新提示时都重新加载一个函数。该函数输出一个版本的pwd但较短,如果输出pwd~/Downloads/Folder该函数将输出~/D/Folder如果我更改目录,该功能有效,但不会重新加载。这是zsh的问题,而不是函数的问题,因为该函数在ksh和csh中可以正常工作。我不使用oh-my-zsh。函数是_collapsed_pwd,文件是$SHELLDIR/cpwdrc

这是我的.zshrc档案

export SHELLDIR="$XDG_CONFIG_HOME/shells"
export ZSH="$SHELLDIR/zsh"
export HISTFILE="$XDG_DATA_HOME"/zsh/history

autoload -U +X compinit && compinit
fpath=($ZSH/plugins/zsh-completions/src $fpath)
compinit -d $XDG_CACHE_HOME/zsh/zcompdump-artix-5.8

source $SHELLDIR/aliasrc
source $SHELLDIR/colorsrc # contians color substituions

source $SHELLDIR/cpwdrc # contains _collapsed_pwd

source $ZSH/plugins/fzf-tab/fzf-tab.zsh
source $ZSH/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh

setopt prompt_subst

PS1=$(printf "${BOLD}${BLUE}%s${NORM}@%s:[${BLUE}%s${NORM}]:$ " $USER $(hostname) $(_collapsed_pwd) )

这是该函数的代码 _collapsed_pwd

#!/bin/sh
## Collapsed Directory
_collapsed_pwd() {
  pwd | perl -pe '
   BEGIN {
      binmode STDIN,  ":encoding(UTF-8)";
      binmode STDOUT, ":encoding(UTF-8)";
   }; s|^$ENV{HOME}|~|g; s|/([^/.])[^/]*(?=/)|/$1|g; s|/\.([^/])[^/]*(?=/)|/.$1|g
'
}
吉勒斯“别再邪恶了”

您一劳永逸地设置提示的内容.zshrc在当前目录更改时,您的代码中没有任何内容可以更改提示的内容。

一种解决方案是将更改提示的代码放在chpwd钩子中删除,setopt prompt_subst因为您将不会对的内容进行任何评估PS1

function set_prompt {
  PS1=$(printf "${BOLD}${BLUE}%s${NORM}@%s:[${BLUE}%s${NORM}]:$ " $USER $(hostname) "${$(_collapsed_pwd)//\%/%%}" )
}
chpwd_functions+=(set_prompt)
cd .

说明:

  • cd .chpwdzsh启动时触发一次挂钩,以便初始设置提示。
  • 如果输出中包含空格,则命令替换周围的双引号可防止将其拆分为单独的单词。
  • ${…//\%/%%}周围的输出替代_collapsed_pwd变化%%%因为%将被解释为一个提示逃逸¹。

或者,请设置prompt_subst选项并设置PS1为包含代码的字符串,该代码将在每次显示提示时进行评估。

setopt prompt_subst
PS1='$(printf "${BOLD}${BLUE}%s${NORM}@%s:[${BLUE}%s${NORM}]:$ " $USER $(hostname) "${$(_collapsed_pwd)//\%/%%}" )'

您可以使用zsh的内置功能在提示中包含可变数据,从而大大简化此过程首先,这是一个提示,显示当前目录的最后两个组件:

unsetopt prompt_subst
PS1='%B%F{blue}%n%f%b@%m:[%F{blue}%2~%f]:%(!.#.$) '

为了简化目录组件,我认为您必须通过chpwd钩子或通过运行一些zsh代码prompt_subst为避免与扩展有关的复杂性,请使用chpwd钩子在提示字符串中进行设置psvar%v引用psvar

unsetopt prompt_subst
PS1='%B%F{blue}%n%f%b@%m:[%F{blue}%1v%f]:%(!.#.$) '
function abbreviate_pwd {
  psvar[1]=${(%):-%~}
  while [[ $psvar[1] =~ /[^/][^/]+/ ]]; do
    psvar[1]=${psvar[1][1,MBEGIN+1]}${psvar[1][MEND,-1]}
  done
}
chpwd_functions+=(abbreviate_pwd)
cd .

¹对于额外的稳健性,$USER(另见$USERNAME通过自动设置zsh)和$(hostname)(参见$HOST自动设置zsh),也应受到保护,但它们通常不包含任何有问题的字符,假设你不改变的价值IFS,包括主机名中出现的字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Iframe中的AngularJS run()方法不会在iframe重新加载时重新运行

来自分类Dev

如果不重新启动,JSP更改不会在Tomcat中重新加载

来自分类Dev

zsh:`source`命令不会重新加载功能

来自分类Dev

“ window.location.reload”不会在Chrome中重新加载页面

来自分类Dev

ts-node-dev不会在自动重新加载中应用更改

来自分类Dev

“ window.location.reload”不会在Chrome中重新加载页面

来自分类Dev

Laravel不会在MAMP上重新加载.env文件

来自分类Dev

glob 模式不会在 zsh 中的文件内部扩展

来自分类Dev

KDE .Deskop Exec不会在终端中返回提示

来自分类Dev

自动重新加载扩展程序不会在更改时重新加载

来自分类Dev

Sprite不会在Sprite Kit中重新生成

来自分类Dev

重新定义的变量不会在AngularJS中绑定

来自分类Dev

特定的Gif不会在IE中重新启动

来自分类Dev

Eclipse 不会在 Ubuntu 中重新启动

来自分类Dev

jqgrid加载页面加载。但不会在选择列表更改时重新加载

来自分类Dev

$ location.search()设置程序不会在ui路由器中引起重新加载

来自分类Dev

选项按钮不会在PHP中自动重新加载页面,我无法在代码中找到错误

来自分类Dev

React不会在组件中触发功能

来自分类Dev

Laravel会话数据不会在页面加载中停留

来自分类Dev

加载的事件不会在UserControl中触发

来自分类Dev

加载数据而不会在片段中暂停活动

来自分类Dev

新窗口加载永远不会在 javascript 中触发

来自分类Dev

React功能组件不会在父功能组件内部重新分配

来自分类Dev

导航栏不会在每次加载页面时重新加载

来自分类Dev

WebApplicationContext不会在Servlet上下文重新加载时关闭

来自分类Dev

Rails 4.1不会在Vagrant VM上自动重新加载

来自分类Dev

浏览器同步不会在监视任务完成时重新加载页面

来自分类Dev

Firestore不会在不重新加载应用程序的情况下更新SwiftUI网格

来自分类Dev

如何使帖子提交不会在重新加载HTML时消失

Related 相关文章

  1. 1

    Iframe中的AngularJS run()方法不会在iframe重新加载时重新运行

  2. 2

    如果不重新启动,JSP更改不会在Tomcat中重新加载

  3. 3

    zsh:`source`命令不会重新加载功能

  4. 4

    “ window.location.reload”不会在Chrome中重新加载页面

  5. 5

    ts-node-dev不会在自动重新加载中应用更改

  6. 6

    “ window.location.reload”不会在Chrome中重新加载页面

  7. 7

    Laravel不会在MAMP上重新加载.env文件

  8. 8

    glob 模式不会在 zsh 中的文件内部扩展

  9. 9

    KDE .Deskop Exec不会在终端中返回提示

  10. 10

    自动重新加载扩展程序不会在更改时重新加载

  11. 11

    Sprite不会在Sprite Kit中重新生成

  12. 12

    重新定义的变量不会在AngularJS中绑定

  13. 13

    特定的Gif不会在IE中重新启动

  14. 14

    Eclipse 不会在 Ubuntu 中重新启动

  15. 15

    jqgrid加载页面加载。但不会在选择列表更改时重新加载

  16. 16

    $ location.search()设置程序不会在ui路由器中引起重新加载

  17. 17

    选项按钮不会在PHP中自动重新加载页面,我无法在代码中找到错误

  18. 18

    React不会在组件中触发功能

  19. 19

    Laravel会话数据不会在页面加载中停留

  20. 20

    加载的事件不会在UserControl中触发

  21. 21

    加载数据而不会在片段中暂停活动

  22. 22

    新窗口加载永远不会在 javascript 中触发

  23. 23

    React功能组件不会在父功能组件内部重新分配

  24. 24

    导航栏不会在每次加载页面时重新加载

  25. 25

    WebApplicationContext不会在Servlet上下文重新加载时关闭

  26. 26

    Rails 4.1不会在Vagrant VM上自动重新加载

  27. 27

    浏览器同步不会在监视任务完成时重新加载页面

  28. 28

    Firestore不会在不重新加载应用程序的情况下更新SwiftUI网格

  29. 29

    如何使帖子提交不会在重新加载HTML时消失

热门标签

归档