当我启动时fish
,我希望它打印出读取配置、配置文件和自定义的每个位置,以便我可以:
- 如果我想保留我的 shell 体验,了解我需要备份哪些特定路径,以及
- 确定变量和颜色的设置位置
这可能吗?如果可能,怎么做?
答案1
我怎样才能要求fish
枚举它正在读取配置的位置?
我不相信这是可能的。
如果我想保留我的 shell 体验,我需要备份哪些特定路径,
这些都列在文档,但最重要的可能是您自己的配置文件:
~/.config/fish/config.fish
~/.config/fish/completions
~/.config/fish/functions
初始化文件
配置文件按以下顺序进行评估:
$__fish_data_dir/config.fish
与 fish一起提供的配置,通常 不应被编辑/usr/share/fish/config.fish
。
.fish
目录中以 结尾的文件中的配置片段:
$__fish_config_dir/conf.d
(默认情况下,~/.config/fish/conf.d/
)
$__fish_sysconf_dir/conf.d
(默认情况下,/etc/fish/conf.d/
)第三方软件供应商用于为他们的软件发送自己的配置片段的目录。 Fish 在
XDG_DATA_DIRS
环境变量的fish/vendor_conf.d
目录中搜索目录;如果未定义此变量,则默认通常搜索/usr/share/fish/vendor_conf.d
并/usr/local/share/fish/vendor_conf.d
如果这些目录中有多个同名文件,则只执行第一个。它们按文件名的顺序执行,按自然顺序排序(如 globs)(即“01”排在“2”之前)。
系统范围的配置文件,管理员可以在其中包含应对系统上所有用户运行的初始化 - 类似于
/etc/profile
POSIX 风格的 shell -$__fish_sysconf_dir
(通常/etc/fish/config.fish
)。用户初始化,通常在
~/.config/fish/config.fish
(由环境变量控制XDG_CONFIG_HOME
,并可作为 访问$__fish_config_dir
)。这些路径由构建、安装或运行时设置的参数控制,并且可能与上面列出的默认值不同。
这种大范围的搜索可能会让人困惑。如果您不确定将自己的自定义项放在哪里,请使用
~/.config/fish/config.fish
。请注意
~/.config/fish/config.fish
来源后代码片段。这样,用户可以复制代码片段并覆盖他们的一些行为。
在哪里放置完成内容
补全可以在命令行或配置文件中定义,但也可以自动加载。 Fish 会自动搜索列表变量中的任何目录
$fish_complete_path
,并在需要时自动加载定义的任何补全。 补全文件的文件名必须由要完成的命令的名称和后缀“.fish
”组成。默认情况下,Fish 使用找到的第一个可用文件来搜索以下内容以完成:
- 供最终用户保存他们自己的完成的目录,通常
~/.config/fish/completions
(由环境变量控制XDG_CONFIG_HOME
);- 系统管理员为系统上的所有用户安装补全的目录,通常是
/etc/fish/completions
;- 第三方软件供应商用来运送其软件的目录。Fish 在
XDG_DATA_DIRS
环境变量中的fish/vendor_completions.d
目录中搜索目录;如果未定义此变量,则默认通常搜索/usr/share/fish/vendor_completions.d
并/usr/local/share/fish/vendor_completions.d
;- 完井装置随鱼一起运输,通常安装在
/usr/share/fish/completions
;和- 从操作系统手册自动生成的完成内容,通常存储在 中
~/.local/share/fish/generated_completions
。这些路径由构建、安装或运行时设置的参数控制,并且可能与上面列出的默认值不同。
这种广泛的搜索可能会让人困惑。如果你不确定,你的完成可能属于
~/.config/fish/completions
。
自动加载函数
函数可以在命令行或配置文件中定义,但也可以自动加载。这有一些优点:
- 自动加载的功能将自动供所有正在运行的 shell 使用。
- 如果函数定义发生变化,所有正在运行的 shell 将自动重新加载改变后的版本。
- 启动时间和内存使用率得到改善等等。
当 fish 需要加载一个函数时,它会在列表变量的所有目录中搜索
$fish_function_path
一个由函数名称加上后缀“.fish
”组成的文件,然后加载它找到的第一个文件。默认
$fish_function_path
包含以下内容:
- 供最终用户保存其自身功能的目录,通常
~/.config/fish/functions
(由环境变量控制XDG_CONFIG_HOME
)。- 系统管理员为系统上的所有用户安装功能的目录,通常
/etc/fish/functions
(确实$__fish_sysconfdir/functions
)。- 第三方软件供应商为其软件提供自己的功能的目录。 Fish 在
XDG_DATA_DIRS
环境变量的fish/vendor_functions.d
目录中搜索目录;如果未定义此变量,则默认通常搜索/usr/share/fish/vendor_functions.d
并/usr/local/share/fish/vendor_functions.d.
- fish 自带的功能,通常安装在
/usr/share/fish/functions
(really$__fish_data_dir/functions
) 中。这些路径由构建、安装或运行时设置的参数控制,并且可能与上面列出的默认值不同。
这种广泛的搜索可能会让人困惑。如果你不确定,你的函数可能属于
~/.config/fish/functions
。
如何确定变量和颜色的设置位置
查看上面列出的初始化文件。
答案2
您可以尝试以下几种方法。使用 fish 3.1.2。
- 在启动时设置调试级别。
https://fishshell.com/docs/current/cmds/fish.html
-d 或 --debug=CATEGORY_GLOB 启用调试输出并指定用于匹配调试类别的 glob(如 fish -d)。默认为空。
> fish -d 2
<2> fish: exec_path: '/usr/bin/fish', argv[0]: 'fish'
<2> fish: Using compiled in paths:
<2> fish: determine_config_directory_paths() results:
paths.data: /usr/share/fish
paths.sysconf: /etc/fish
paths.doc: /usr/share/doc/fish
paths.bin: /usr/bin
<2> fish: sourcing /usr/share/fish/config.fish
<2> fish: sourcing /etc/fish/config.fish
<2> fish: sourcing /home/x/.config/fish/config.fish
- 放
fish_trace
。
https://fishshell.com/docs/current/index.html#special-variables
如果设置了 fish_trace并且不为空,将导致 fish 在执行命令之前打印命令,类似于 bash 中的 set -x。
这个命令对我很有帮助--
> fish_trace=1 fish -lic 'echo' &| grep "source /home"
++++ source /home/x/.config/fish/conf.d/fzf.fish
+ source /home/x/.config/fish/config.fish
+++++++ source /home/x/.config/fish/functions/bass.fish
...
这将启动一个新的 fish 实例,它既是登录又是交互式 shell,并且 grep 仅显示你的主目录中正在查找的内容。
- 要确定变量和颜色的设置位置,请使用
set -S|--show
。
https://fishshell.com/docs/current/cmds/set.html#description
-S 或 --show 显示有关给定变量的信息。如果没有给出变量名,则所有变量将按排序顺序显示。此选项不能与任何其他标志一起使用。显示的信息包括它是否在每个本地、全局和通用范围内设置。如果它在其中一个范围内设置,则报告它是否被导出。还会显示各个元素以及每个元素的长度。
> set -S
...
$fish_color_cancel: not set in local scope
$fish_color_cancel: not set in global scope
$fish_color_cancel: set in universal scope, unexported, with 1 elements
$fish_color_cancel[1]: length=2 value=|-r|
...