我安装了 spaceship-prompt zsh 主题,它需要电力线字体才能正确显示。因此,我想在直接在 tty 上运行的 shell 中禁用它(据我所知,它只能使用位图字体),而不是在 DE 中的终端仿真器内运行的 shell。
我尝试将其放入我的 .zshrc 中:
if [[ -o login ]] ; then
return
fi
它禁止在登录 shell 上加载配置,但由于某种原因,当我使用 su 时,根 shell 也被标记为登录,即使我在终端模拟器(Konsole)中运行它:
➜ su
Password:
n750jv# echo $-
569XZilms
不知道它是否相关,但我实际上已经在 /root 中创建了到我的 .zshrc 的符号链接,以便我的配置保持同步。
注意:如果我在 tty 中运行 echo $- ,我会得到完全相同的输出:569XZilms
答案1
事实证明,您想知道某些字符在运行 zsh 的终端上是否正确显示。 (顺便说一句,这与字体类型无关:它与字符编码以及字体是否包含您使用的字符有关。)
使用TERM
环境变量来了解 shell 正在运行的终端。这可能是字体覆盖的一个不错的启发式方法。
不要跳过整个.zshrc
:无论 shell 在哪里运行,大多数设置都有意义,例如别名、完成等。仅更改提示内容。
case $TERM in
xterm*|konsole*)
set_fancy_prompt;;
*)
set_less_fancy_prompt;;
esac
或者,一个足够好的启发法可能是终端使用 Unicode 还是 8 位编码。区域设置类别LC_CTYPE
应该是一个很好的启发式方法。
case ${(L)LC_ALL:-${LC_CTYPE:-$LANG}} in
*UTF*)
set_fancy_prompt;;
*)
set_less_fancy_prompt;;
esac
这与是否是登录 shell 无关。例如,如果您通过 SSH 登录,您将获得一个登录 shell,它可能会显示在文本控制台或 GUI 终端或某种其他类型的终端(或无终端)中,具体取决于您登录的位置从。
答案2
没有通用的方法可以实现这一点。
Powerline 使用中的字符私人使用区统一码。我一次又一次地看到电力线(以及“书呆子字体”)用户了解私人使用区确实意味着某些东西在任何地方的工作方式并不相同,其含义完全由私人安排决定。
没有标准方法可以确定哪些字形将为私有使用区域代码点呈现,以及有哪些私有安排。除了实际查看字形或阅读人类可读的文档外,没有其他方法可以确定字体是否具有 Powerline 所需的非标准字形。
此外,还有一些位图字体具有非标准专用 Powerline 字形(例如 Tamzen)。因此,在一般情况下,这不能通过终端是否是内核虚拟终端来代理。 KVT 可能会也可能不会显示非标准专用电力线字形。
也不能通过 shell 是否是登录 shell 来明智地代理它。 Shell 可以是终端仿真器上的登录 shell,其中字体具有非标准专用 Powerline 字形(多个 GUI 终端仿真器能够将 shell 作为登录 shell 启动),就像 shell 可以是终端仿真器上的非登录 shell 一样简单,其中字体没有非标准的私有 Powerline 字形(因为可以只 fork+exec 一个子 shell,或者从mailx
或 之类的“shell out” vi
)。
你只需要想出您自己的私人安排。找到一些方法来标记终端登录会话你已经(未)安装私人使用区域代码点的特殊含义。实现这一目标的各种方法的示例:
getty
在、 、甚至 KVT 登录的登录服务中设置您自己设计的环境变量login
,然后关闭您的 shell 初始化脚本(前提是您需要具有管理员访问权限,并且您需要在将来维护此设置)随着事情的变化)。- 以某种私有方式关闭终端设备文件名(附带条件是,当您通过串行连接引入真实终端时,这会变得非常复杂;或者引入 SSH)。
- 发送一个 ␅ (U+0005) 字符并关闭返回的内容(条件是这在终端始终是用户可编程的,并且实际上可能不会导致任何返回)。
紧握的手上……
当然,更好的途径是让你的主题使用标准字符,而不用担心任何这些障碍。
实际不需要私人使用区域代码点,正如你的主题的作者所认为的,对于锁定的挂锁。标准化为 U+1F512 (
答案3
我发现问题:我忘记了我的别名苏作为苏-l我自己...:D
编辑:按照@Gilles的建议,我修改了配置以检查 $TERM 环境变量的内容,并且仅在不是 Linux 控制台时才加载主题。
if test "$TERM" != "linux"
then
autoload -U promptinit; promptinit
prompt spaceship
fi