Atuin 配置管理实战指南:`atuin config` 命令与 config.toml 完整参数解析
2026/9/19 3:27:34 网站建设 项目流程

Atuin 配置管理实战指南:atuin config命令与 config.toml 完整参数解析

【免费下载链接】atuin✨ Making your shell magical项目地址: https://gitcode.com/gh_mirrors/at/atuin

本篇技术指南以 Atuin 的atuin config子命令为主线,完整讲解如何在不打开编辑器的情况下读取、修改与检查 Atuin 的配置项,并结合仓库源码解析 Atuin 配置的解析顺序(默认值 →config.toml→ 环境变量覆盖)、类型检测机制与底层实现原理。读完本文,你将掌握atuin config get/set/print的完整用法,并能够对照 config.toml 中从搜索模式、过滤模式到 daemon、logs、theme、ui 等全部配置参数进行精准调优。

配置从哪来:三层解析来源

Atuin 的配置解析集中在 crates/atuin-client/src/settings.rs 的Settings::build_config()builder_with_data_dir()中。配置值按以下优先级合并(后者覆盖前者):

  1. 内置默认值builder_with_data_dir()中通过set_default(...)注册的所有默认项,例如search_mode = "fuzzy"sync_frequency = "5m"style = "compact"enter_accept = false等;
  2. 配置文件~/.config/atuin/config.toml(可用ATUIN_CONFIG_DIR环境变量覆盖目录,最终文件固定为config.toml)。若文件不存在,Atuin 会自动将 crates/atuin-client/config.toml 这一内置示例配置写入磁盘;
  3. 环境变量覆盖:所有以ATUIN_为前缀的环境变量,使用__作为层级分隔符(Environment::with_prefix("atuin").prefix_separator("_").separator("__")),例如ATUIN_SEARCH_MODE对应顶层search_modeATUIN_DAEMON__ENABLED对应daemon.enabled

atuin config命令存在的意义,正是让你能够直观地看到这三层来源各自"设了什么"、最终生效值是什么,并在 config.toml 中安全地写入新值。其实现位于 crates/atuin/src/command/client/config.rs,由GetSetPrint三个子命令构成。

atuin config get <key>:读取配置值

get读取 config.toml 中指定键的原始值。键支持点号路径(如daemon.enabled),也可以直接读取整个表(如daemon):

$ atuin config get search_mode fuzzy $ atuin config get daemon [daemon] enabled = true socket_path = "/tmp/atuin_daemon.sock"

若键在配置文件中不存在,输出占位提示:

$ atuin config get enter_accept (not set in config file)

需要注意的是,get默认只读config.toml 文件本身,并不包含默认值与环境变量。结合源码(GetCmd::print_current_value)可以看到,它通过toml_edit将配置文件解析为文档后,用get_deep_key按点号逐层下钻,表类型([daemon])会被整体dump_table打印,标量类型则输出其字符串值。

--resolved/-r:查看合并后的生效值

要查看三层来源合并后的最终生效值,使用-r标志。它调用Settings::get_config_value(key)重建完整配置(默认值 + 文件 + 环境变量),并输出真正的运行时值:

$ atuin config get enter_accept --resolved false

对于表键,--resolved会把所有子项展开为扁平的key = value形式(键按字母序排序):

$ atuin config get logs --resolved logs.ai.file = ai.log logs.daemon.file = daemon.log logs.dir = /home/user/.local/share/atuin/logs logs.enabled = true logs.level = info logs.search.file = search.log

这里能看到路径类配置(如logs.dir)已被shellexpand展开为绝对路径——这正是"解析后"与"文件原文"的差异所在。get_config_value还对daemon.socket_path做了特殊处理:当该键未显式配置时,会把 settings/daemon.rs 中Daemon::socket_path()动态计算出的默认路径($TMPDIR/atuin-$UID/atuin.sock)手动插入结果,方便排查 socket 问题。

--verbose/-v:文件值与生效值对照

-v同时展示两侧,适合调试"为什么我配置没生效":

$ atuin config get enter_accept --verbose Config file: (not set in config file) Resolved: false

--verbose--resolved互斥使用:前者内部同时调用print_current_value(读文件)与print_effective_value(合并解析)。

atuin config set <key> <value>:写入配置

set直接把值写入config.toml,并且保留文件原有的格式与注释。这是它的核心卖点——基于toml_editDocumentMut原地修改,而不是重新序列化整个文件。

$ atuin config set search_mode fuzzy $ atuin config set daemon.enabled true

点号键会自动导航并创建中间表:atuin config set keys.scroll_exits false[keys]表不存在时会自动新建。config.rs中的测试(set_adds_a_missing_key_without_touching_existing_content)验证了"追加新键不破坏既有注释"、set_preserves_formatting_when_overwriting验证了覆盖已有键时连值后面的行尾注释(如frequency = "5m" # sync interval)都能原样保留。

类型自动检测

set默认(--type auto)遵循两条规则:

  1. 键已存在:匹配 config.toml 中已有值的 TOML 类型(detect_existing_type),避免把字符串"300"意外变成整数300
  2. 键不存在:根据输入值自动推断类型:
推断类型
true/falseboolean
42-1integer
3.14float
其他string

自动推断实现在parse_valueValueType::Auto分支:先匹配布尔,再尝试i64,再尝试f64,兜底为字符串。

--type/-t:显式指定类型

--type的优先级最高,用于强制存储为指定类型,可选值:autostringbooleanintegerfloat

$ atuin config set sync_frequency 600 --type string

限制与报错

!!! warning "仅支持标量值"atuin config set只能设置标量(scalar)配置项;表与数组(如history_filtersearch.filtersextra_headers)必须手动编辑 config.toml。

试图用标量覆盖表时会得到明确指引(set_deep_key中的守卫逻辑):

$ atuin config set logs true Error: 'logs' is a table; use a dotted key like 'logs.key' to set a value within it

写入前set会调用Settings::validate_str对修改后的完整文档做反序列化校验——如果新值会让整个配置失效(例如search_mode = "invalid"),写入会被拒绝并回滚,错误信息会包含出问题的键与值,避免把配置文件写坏。

atuin config print [key]:整体输出

print以 TOML 格式输出配置内容。不带 key 时打印整个文件;带 key 时只打印该节:

$ atuin config print daemon [daemon] enabled = true socket_path = "/tmp/atuin_daemon.sock" pidfile_path = "/tmp/atuin_daemon.pid" autostart = false

printget的区别:print忠实反映文件结构(含表头、子表嵌套),适合把整个配置归档或粘贴给他人;get更侧重单值查询。

核心配置参数速查

atuin config get/set操作的对象,就是 docs/docs/configuration/config.md 中定义的整套参数。以下按功能域梳理高频参数(默认值均取自builder_with_data_dir与示例配置 crates/atuin-client/config.toml)。

基础路径与同步

参数默认值说明
db_path~/.local/share/atuin/history.dbSQLite 历史数据库路径
key_path~/.local/share/atuin/key加密密钥路径
dialectus影响 stats 命令解析日期的格式(us/uk
auto_synctrue登录状态下是否自动同步
update_checktrue是否每小时至多一次向https://api.atuin.sh检查更新。关闭且未配置同步时,Atuin 自身不发起任何网络请求
sync_addresshttps://api.atuin.sh同步服务器地址
sync_frequency5m自动同步间隔,支持10s/20m/1h/1d;裸数字按秒解析(向后兼容);0表示每条命令后都同步
network_timeout30s单次网络请求最大等待时间
network_connect_timeout5s建立连接的最大等待时间
local_timeout2s获取本地 SQLite 连接的超时
extra_headers{}附加到每次同步请求的 HTTP 头,适用于 Cloudflare Access 等网关场景。Atuin 自身设置的头(如Authorization)优先,不可覆盖;配置后拒绝跨源重定向,避免凭据外泄

搜索与过滤

参数默认值说明
search_modefuzzy搜索模式:prefixquery*)、fulltext*query*)、fuzzydaemon-fuzzydaemon-fuzzy自 Atuin 18.13 起提供,使用 daemon 内存索引,需启用 daemon([daemon] enabled = true, autostart = true);在命令行非交互搜索中它表现得与fuzzy一致
filter_modeglobal交互搜索的初始过滤模式:global/host/session/directory/workspace/session-preload,TUI 内可随时用 ctrl-r 轮换。各模式的搜索范围见 advanced-usage
search_mode_shell_up_key_bindingfuzzy从 shell 上方向键绑定进入搜索时使用的搜索模式,未设置时回落到search_mode
filter_mode_shell_up_key_bindingglobal同上,针对过滤模式
inline_height_shell_up_key_bindinginline_height上方向键唤起时界面最大行数
workspacesfalse在 git 仓库中自动激活workspace过滤
search.filters全部模式交互搜索可用过滤模式列表(即 ctrl-r 轮换顺序)。filter_mode不在列表中时取第一个可用模式;workspace在非 git 目录或workspaces = false时自动跳过
search.shells"auto"(Atuin ≥ 18.18)按 shell 过滤搜索结果:"all"显示全部;"auto"显示当前 shell 及无 shell 记录的旧命令(经ATUIN_SHELL环境变量识别当前 shell);数组如["bash","zsh"]则只显示列出的 shell,""表示包含无 shell 记录的命令
search.frequency_score_multiplier1.0daemon-fuzzy模式下频率得分的乘数(<1降低、>1放大、0关闭该维度)
search.recency_score_multiplier1.0同上,针对新鲜度得分
search.frecency_score_multiplier1.0最终 frecency 得分的乘数,0表示完全依赖模糊匹配得分。frecency 计算式:Recency Score * Recency Multiplier + Frequency Score * Frequency Multiplier

fuzzy模式采用 fzf 搜索语法(daemon-fuzzy不支持其中的|或运算符):

Token匹配类型说明
sbtrktfuzzy-match模糊匹配sbtrkt
'wildexact-match (quoted)必须包含wild
^musicprefix-exact-matchmusic开头
.mp3$suffix-exact-match.mp3结尾
!fireinverse-exact-match不包含fire
!^musicinverse-prefix-exact-match不以music开头
!.mp3$inverse-suffix-exact-match不以.mp3结尾

例如^core go$ | rb$ | py$匹配以core开头、以gorbpy结尾的命令。

TUI 外观与交互

参数默认值说明
stylecompactauto/full/compactauto在终端过矮时自动从full切到compact
invertfalse把搜索栏放到顶部
inline_height40界面最大行数,0表示全屏
show_previewtrue是否预览选中命令(命令超宽截断时有用)
max_preview_height4预览最大高度
show_helptrue帮助行(版本、更新提示、键位提示、历史总量)
show_tabstrue显示 search/inspect 标签页
show_numeric_shortcutstrue列表项旁的数字快捷键(1..9)
auto_hide_height8可用高度低于该行数时自动隐藏多余 UI 行,仅在compact风格下生效,0关闭
exit_modereturn-originalEsc 的行为:return-original恢复搜索前命令行;return-query保留已输入的查询。ctrl+c / ctrl+d 始终恢复原值
keymap_modeemacs初始键位模式:emacs/vim-normal/vim-insert/autoauto按触发搜索的 shell 键位决定,Nushell 目前不支持,恒为emacs
keymap_cursor空字典各键位模式下的光标样式,如{ emacs = "blink-block", vim_insert = "blink-block", vim_normal = "steady-block" },取值default{blink,steady}-{block,underline,bar}
prefers_reduced_motionfalse减少 TUI 动画(如动态刷新时间戳);亦可设环境变量NO_MOTION
ctrl_n_shortcutsfalsemacOS 场景:用 ctrl+0..9 替代 alt+0..9 数字快捷键(避免 option 键重映射影响输入)
command_chainingfalse&&/||后启用命令链式补全而非替换当前行
enter_acceptfalse(新装用户为truetrue时回车直接执行命令、tab 退回编辑。默认配置文件里写的是true,源码中set_default("enter_accept", false)与文件默认值的"不一致"是有意为之:不改变老用户肌肉记忆,同时给新用户默认启用

历史记录控制

参数默认值说明
history_filter正则数组,匹配的命令不写入历史(未锚定则匹配命令任意位置)。配合 prune 可清理已入库的旧记录
cwd_filter正则数组,在这些目录下执行的命令不写入历史
store_failedtrue是否保存非零退出码的命令
secrets_filtertrue命中内置凭据正则的命令拒绝入库。覆盖 AWS(Access Key ID、AWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN)、Azure(AZURE_*_KEY)、Google Cloud(GOOGLE_SERVICE_ACCOUNT_KEY)、GitHub(新旧 PAT、OAuth/App token、refresh token)、GitLab PAT、Slack(OAuth v2 bot/user、webhook)、Stripe live/test key、Netlify、npm、Pulumi,以及把密码和密钥当参数传入的atuin login。精确表达式见 crates/atuin-common/src/secrets.rs
history_format{time}\t{command}\t{duration}history list默认格式,可用--format按次覆盖

关于secrets_filter需要特别说明:它同时作用于捕获的命令输出。命令文本本身干净,但输出可能泄露凭据(如cat .envgh auth token),因此捕获输出中识别到的凭据值会在存储前替换为****——只替换值,保留变量名或 flag。正如 excluding-commands 所强调,这是"安全网而非保证":它只识别已知格式,其余敏感内容请用history_filter兜底。

统计、点文件与键位

参数默认值说明
[stats] common_subcommandsapt/cargo/git/kubectl/npm/...这些命令的子命令计入统计(如kubectl get而非仅kubectl
[stats] common_prefix["sudo"]统计时完全剥离的前缀(源码默认还含doas
[dotfiles] enabledfalse跨主机同步 shell 别名。启用后可用atuin dotfiles alias set k kubectlatuin dotfiles alias listatuin dotfiles alias delete k管理,改后需重启 shell 或 source init 文件
[keys] scroll_exitstrue滚动越过首/末条目时是否退出 TUI
[keys] prefixa前缀模式前缀键,如默认 ctrl+a 再按 d 删除选中项。完整默认前缀快捷键见 key-binding,自定义见 advanced-key-binding
[keys] exit_past_line_starttrue光标在行首继续左滚时退出
[keys] accept_past_line_endtrue右方向键等同 tab:把选中行复制到命令行待编辑
[keys] accept_past_line_startfalse左方向键等同 tab
[keys] accept_with_backspacefalse退格键等同 tab
[preview] strategyauto预览高度计算策略:auto(按选中命令长度)、static(按当前结果集最长命令)、fixed(固定用max_preview_height)。都受max_preview_height约束

tmux 弹出窗

在 tmux 内以浮层 popup 打开搜索 UI(需 tmux ≥ 3.2,支持 zsh/bash/fish;iTerm2 原生 tmux 集成tmux -CC无法显示 popup,应保持禁用)。配置由atuin init读取并通过环境变量传给 shell 插件,因此修改后必须重启 shell;单会话禁用可设ATUIN_TMUX_POPUP=false。任何无法使用 popup 的场景(tmux 外、版本过旧、shell 不支持)都会无错误回退到普通渲染。

[tmux] enabled = true width = "80%" # 或绝对列数 height = "60%" # 或绝对行数

daemon 与日志

参数默认值说明
[daemon] enabledfalse启用后台守护进程(历史钩子经 daemon 路由)
[daemon] autostartfalse按需自动启动并管理 daemon;与systemd_socket = true不兼容
[daemon] sync_frequency5mdaemon 的同步间隔
[daemon] socket_path$TMPDIR/atuin-$UID/atuin.sock客户端与 daemon 通信的 Unix socket 路径;systemd_socket = true时默认改为$XDG_RUNTIME_DIR/atuin.sock。未手动配置时,Atuin 还会兼容探测旧版本可能遗留的$XDG_RUNTIME_DIR$XDG_DATA_HOME路径下的旧 socket
[daemon] pidfile_path~/.local/share/atuin/atuin-daemon.pid进程协调 pidfile
[daemon] systemd_socketfalse使用 systemd socket activation 传入的 socket
[daemon] tcp_port8889非 Unix 系统上客户端与 daemon 通信的 TCP 端口
[logs] enabledtrue文件日志总开关
[logs] dir~/.atuin/logs日志目录
[logs] levelinfotrace/debug/info/warn/error
[logs] retention4d按类型保留时长(裸数字按天)
[logs.ai/.daemon/.search]各日志子类型独立覆盖enabled/file/level/retention,如[logs.search] file = "search.log"

theme 与 ui

参数默认值说明
[theme] name"default"内置主题(default/autumn/marine)或~/.config/atuin/themes/(可用ATUIN_THEME_DIR覆盖)下的NAME.toml主题
[theme] debugfalse输出主题加载失败原因(可能把主题文件内容原样打到终端)
[theme] max_depth10主题继承遍历的最大层数,常规无需改动
[ui] columns["duration", "time", "command"]交互搜索列,从左到右(选中指示列>恒在首位)。支持字符串或对象{ type = "...", width = N, expand = true }形式;可用列:duration(5)、time(8)、datetime(16)、directory(20)、host(15)、user(10)、exit(3)、command(占满剩余空间)。expand = true只允许一列,默认command独占;源码中Ui::validate()会拒绝多列同时 expand
[ui] syntax_highlighttrue搜索结果按运行 shell 语法高亮(bash/zsh/sh 用 bash 文法,fish 用 fish 文法,无文法的 nu/xonsh/PowerShell 不高亮);颜色可用主题的Syntax*键定制,见 theming。tree-sitter 无法构建的平台不可用

AI 相关设置([ai])独立成篇,见 ai/settings。

环境变量覆盖速记

  • ATUIN_CONFIG_DIR:覆盖配置目录(文件固定为其中的config.toml),由Settings::get_config_path()读取;
  • ATUIN_前缀变量ATUIN_SYNC_ADDRESSATUIN_SEARCH_MODEATUIN_DAEMON__ENABLED等,优先级高于配置文件;
  • NO_MOTION:等价于prefers_reduced_motion = true
  • ATUIN_TMUX_POPUP:置false可单会话禁用 tmux popup;
  • ATUIN_SHELL:由 shell init 脚本注入,用于search.shells = "auto"的当前 shell 识别;
  • ATUIN_THEME_DIR:覆盖主题目录。

调试思路小结

  1. atuin config get <key> --resolved确认最终生效值,排除"文件里写了但没生效";
  2. --verbose对照文件值 vs 解析值,快速定位是默认值、文件还是环境变量在起作用;
  3. 修改表/数组配置(history_filtersearch.filtersextra_headers)时直接编辑 config.toml——set明确不支持,且会在校验失败时拒绝写入;
  4. 担心改动写坏配置时,先atuin config print备份当前内容;
  5. 涉及daemon-fuzzy、daemon socket 或 tmux popup 的配置变更,记得重启 shell 或重启 daemon 后再验证。

【免费下载链接】atuin✨ Making your shell magical项目地址: https://gitcode.com/gh_mirrors/at/atuin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询