dotfiles
什么是dotfile
每个人都有自己用电脑的习惯,比如命令的简写、关键字的高亮、函数的缩写等等。这些设置都会被我们一劳永逸的设置在配置文件中。但是如果我们更换了电脑,想要快速恢复这些设置,或者我们在网络上找到了一个心仪的别人的配置,想要复刻,我们应该怎样操作呢?这就关系到dotfile的配置和管理。
在Linux系统中,有一些隐藏的以 .
开头的文件,使用 ls -a
就可以看到。这些文件就是dotfile。
这些文件大多是各种软件的配置文件
比如使用 sudo apt install git
安装了“版本控制工具”,并且使用 git config --global user.name "你的名字"
和 git config --global user.email "你的邮箱@example.com"
设置了全局用户名和邮箱,则会自动创建 ~/.gitconig
。不设置用户名和邮箱,git的配置文件不会在安装了git之后自动生成。
再比如Vim的配置文件 .vimrc
,如果用户未主动配置,Vim会使用内置的默认设置,因此 ~/
下没有 .vimrc
。Vim的系统级配置问价通常位于 /etc/vim/vimrc
,但用户个人配置需要单独创建。
如果只是进行简单的设置的情况下,可以简单手动创建 touch ~/.vimrc
并在文件中输入下面内容:
# 显示行号
set number
# 启用语法高亮
syntax on
# 设置缩进为4空格
set tabstop=4
set shiftwidth=4
set expandtab
编译完成后,按下 esc
,输入 :wq
,保存并退出,可以发现在路径 ~/
下新增了关于Vim的配置文件
可以输入下面的命令查看Vim的配置路径
vim --version | grep "vimrc"
得到类似下面的结果:
当再次输入
vim ~/.vimrc
进入Vim编辑界面时,会与之前有所不同,显示了行号、关键字高亮和缩进。(不修改直接退出,按下 esc
,输入 :q
即可)
rcm软件
当我们初次使用一些软件时,会花大量的时间对响应的dotfile文件逐一进行配置。但是当我们更换电脑时,又会花费大量时间重新设置。怎样可以快速方便的统一进行设置呢?可以使用Github上开源的rc file management(rcm)软件。这个软件主要思想就是将所有你希望用rcm管理的dotfile移动并集中存储在一个目录中(默认是在 ~/.dotflies
下),并在你的个人目录下创建所有被rcm管理的dotfile的符号连接(symlink)。
可以直接执行下面三行命令下载rcm:
sudo add-apt-repository ppa:martin-frost/thoughtbot-rcm
sudo apt-get update
sudo apt-get install rcm
如果第一次在本地使用rcm,可以使用 mkrc
命令指定要管理哪些文件
当前文件夹 ~/
下的文件如下所示:
我想将 .viminfo
和 .vimrc
文件放到 ~/.dotflies
下,方便后续统一管理,使用命令
mkrc .viminfo .vimrc
将指定的dotfiles移动到 ~/.dotflies
目录下并重命名将文件前的 .
去掉,同时在原目录下创建响应的符号链接:
注意事项:请勿对已经由rcm管理并创建的符号连接使用mkrc命令,否则会让 ~/.dotfiles
下的文件变成指向自己的符号链接并丢失源文件。
手动修改/生成dotfile
启动脚本 .bash_profile
Bash在登录时会按照一下顺序查找配置文件:
~/.bash_profile
~/.bash_login
~/.profile
如果前两个文件不存在,则会加载3. ~/.profile
大多数Linux发行版(如Ubuntu)默认不自动创建 ~/.bash_profile
,而是通过以下文件管理Bash配置
~/.bashrc
:用于非登录 Shell(如终端分页或新窗口)。~/.profile
或/etc/profile
:用于登录 Shell(如系统登录或 SSH 连接)。
如果想要创建 .bash_profile
文件,可以通过以下方法
touch ~/.bash_profile
nano ~/.bash_profile
之后在文件中编辑文件内容,具体内容我参考的Github中webpro开源的代码,内容如下:
# 仅限交互式Shell执行,如果是非交互式的,则直接退出
[ -z "$PS1" ] && return
# 定位dotfiles目录,确定dotfiles 的存储路径 DOTFILES_DIR
# (assuming ~/.dotfiles on distros without readlink and/or $BASH_SOURCE/$0)
CURRENT_SCRIPT=$BASH_SOURCE
if [[ -n $CURRENT_SCRIPT && -x readlink ]]; then
SCRIPT_PATH=$(readlink -n $CURRENT_SCRIPT)
DOTFILES_DIR="${PWD}/$(dirname $(dirname $SCRIPT_PATH))"
elif [ -d "$HOME/.dotfiles" ]; then
DOTFILES_DIR="$HOME/.dotfiles"
else
echo "Unable to find dotfiles, exiting."
return
fi
# 添加自定义工具到 PATH
PATH="$DOTFILES_DIR/bin:$PATH"
# 加载系统配置文件,批量加载dotfiles/system/ 目录下的配置文件(如函数、别名、环境变量等)
for DOTFILE in "$DOTFILES_DIR"/system/.{function,function_*,n,path,env,exports,alias,fzf,grep,prompt,completion,fix,zoxide}; do
. "$DOTFILE"
done
# macOS特定配置(略)
if is-macos; then
for DOTFILE in "$DOTFILES_DIR"/system/.{env,alias,function}.macos; do
. "$DOTFILE"
done
fi
# 设置目录颜色
eval "$(dircolors -b "$DOTFILES_DIR"/system/.dir_colors)"
# 清理与导出
unset CURRENT_SCRIPT SCRIPT_PATH DOTFILE
export DOTFILES_DIR
然后分别按下 Ctrl + O
保存和 Ctrl + X
退出
别忘了把文件放到 ~/.dotfiles
下
mkrc .bash_profile
按键绑定 .inputrc
.inputrc
是用于配置 GNU Readline 库的文件(影响 Bash、Python REPL、MySQL 客户端等工具的输入行为)。
系统不会自动创建此文件,除非你手动配置或某些程序需要它。
Readline 的默认配置通常位于 /etc/inputrc
,用户无需手动创建 .inputrc
即可使用默认行为。
如果想要创建 .inputrc
文件,可以通过以下方法
touch ~/.inputrc
nano ~/.inputrc
之后在文件中编辑文件内容,具体内容我参考的Github中webpro开源的代码,内容如下:
# 忽略大小写:补全时不区分文件名的大小写
# (如输入 FILE 可补全 file.txt)
set completion-ignore-case on
# 显示所有可能项:当有多个补全选项时,直接列出所有结果,无需按两次 Tab。
set show-all-if-ambiguous on
# 目录符号链接补全加斜杠:补全符号链接指向的目录时,自动添加 /
# (如 ln -s dir link,补全 link 会变成 link/)。
set mark-symlinked-directories on
# 禁用分页显示:补全结果直接全部显示,而非分页
# (类似 ls 与 ls | less 的区别)。
set page-completions off
# 提示确认数量:当补全选项超过 200 个时,询问是否显示全部
# (避免意外刷屏)。
set completion-query-items 200
# 显示文件类型标识:补全时像 ls -F 一样标记文件类型
# (如目录加 /,可执行文件加 *)。
set visible-stats on
# 智能跳过已输入部分:补全时忽略光标后的内容
# (例如输入 cd ~/src/mozil,光标在 z 处按 Tab,补全为 mozilla 而非 mozillail)。
set skip-completed-text on
# 允许输入 UTF-8 元字符:支持输入非 ASCII 字符(如中文、Emoji)。
# 允许输出 UTF-8 元字符:正确显示非 ASCII 字符。
# 禁用字符转义:不将特殊字符转换为转义序列(如避免显示 $'\0123\0456')。
set input-meta on
set output-meta on
set convert-meta off
# Shift+Tab 遍历补全选项:按 Shift+Tab 反向循环选择补全结果(默认 Tab 正向循环)。
"\e[Z": menu-complete
# ”上“键搜索历史命令:根据已输入的前缀过滤历史命令(如输入 git 后按”上“,只显示以 git 开头的历史命令)。
# ”下“键搜索历史命令:同上,向下搜索。
"\e[A": history-search-backward
"\e[B": history-search-forward
然后分别按下 Ctrl + O
保存和 Ctrl + X
退出
别忘了把文件放到 ~/.dotfiles
下
mkrc .inputrc
效果:文件起作用,需要重启虚拟机/电脑,重启之后,可以尝试代码中进行的第一项设置:Tab补齐不需要区分大小写
别名 .alias
.alias
文件并非系统默认生成,而是用户手动创建的配置文件,通常用于集中管理命令行别名(alias)。
如果想要创建 .bash_profile
文件,可以通过以下方法
touch ~/.alias
nano ~/.alias
之后在文件中编辑文件内容,具体内容我参考的Github中webpro开源的代码,内容如下:
# Shortcuts
alias reload="source ~/.bash_profile"
alias _="sudo"
alias g="git"
alias rr="rm -rf"
alias mux="tmuxinator"
# Default options
alias rsync="rsync -vh"
alias json="json -c"
alias psgrep="psgrep -i"
# Global aliases
if $(is-supported "alias -g"); then
alias -g G="| grep -i"
alias -g H="| head"
alias -g T="| tail"
alias -g L="| less"
fi
# List declared aliases, functions, paths
alias aliases="alias | sed 's/=.*//'"
alias functions="declare -f | grep '^[a-z].* ()' | sed 's/{$//'"
alias paths='echo -e ${PATH//:/\\n}'
# Directory listing/traversal
LS_COLORIZED=$(is-supported "ls --color" --color -G)
LS_TIMESTYLEISO=$(is-supported "ls --time-style=long-iso" --time-style=long-iso)
LS_GROUPDIRSFIRST=$(is-supported "ls --group-directories-first" --group-directories-first)
alias l="ls -lahA $LS_COLORIZED $LS_TIMESTYLEISO $LS_GROUPDIRSFIRST"
alias ll="ls -lA $LS_COLORIZED"
alias lt="ls -lhAtr $LS_COLORIZED $LS_TIMESTYLEISO $LS_GROUPDIRSFIRST"
alias ld="ls -ld $LS_COLORIZED */"
alias lp="stat -c '%a %n' *"
unset LS_COLORIZED LS_TIMESTYLEISO LS_GROUPDIRSFIRST
alias ..="cd .."
alias ...="cd ../.."
alias ....="cd ../../.."
alias .....="cd ../../../.."
alias -- -="cd -" # Go to previous dir with -
alias cd.='cd $(readlink -f .)' # Go to real dir (i.e. if current dir is linked)
# p/npm
alias b="bun"
alias p="pnpm"
alias ncu="npm-check-updates --interactive"
alias ncuw="npm-check-updates --interactive --root --workspaces"
# Network
alias ip="curl -s ipinfo.io | jq -r '.ip'"
alias ipl="ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'"
# Miscellaneous
alias hosts="sudo $EDITOR /etc/hosts"
alias quit="exit"
alias week="date +%V"
alias speedtest="wget -O /dev/null http://speed.transip.nl/100mb.bin"
alias grip="grip --browser --pass=$GITHUB_TOKEN"
alias fkill="ps -e | fzf | awk '{print $1}' | xargs kill"
alias formatmd="remark --use remark-preset-webpro"
基本语法:alias 别名="原名"
然后分别按下 Ctrl + O
保存和 Ctrl + X
退出
别忘了把文件放到 ~/.dotfiles
下
mkrc .inputrc
其他dotfiles
还有 .functions
.prompt
等等配置文件。更多请参考Github-webpor的开源
从github克隆
从Github库中下载代码
在home(~)目录下输入git命令即可
git clone https://github.com/webpro/dotfiles.git
让dotfile文件生效
将 ~/.doffiles
目录下的配置文件通过复制或创建符号链接(symlink)的方式,放置到用户的 home (即~) 目录下。否则这些文件不会生效。
注意事项:用户原有的 .bash_profile、.gitconfig 等文件可能已存在,操作前需备份重要文件,避免覆盖或丢失配置。
cp ~/.bash_profile ~/.bash_profile.bak
建议使用符号链接而非直接复制,便于后续同步更新。
上一章手动创建dotfile时,是在home目录下创建的文件,之后用 mkrc
命令将文件移动到 ~/.dotfile
文件夹中,并在原地留下了一个链接
这一章因为我们可以直接在Github库中下载 .dotfile
文件夹,所以在home文件夹下没有链接。因此需要通过 ln 命令创建符号链接
ln -sv ~/.doffiles/.test ~
会有下面的结果
GUN stow管理
如果我们从Github中下载了一个完整的模板,里面会有很多已经设置好的配置文件,如果我们一条一条使用 ln
命令创建链接,非常麻烦。这时我们可以使用Stow按照软件(即分类的文件夹),统一对文件夹中的配置文件创建链接。
安装Stow
sudo apt install stow
不知道有没有安装,可以使用下面的命令查看
stow --version
如果安装了,就会显示版本号,没安装则会显示找不到命令
初始化目录结构
如果是自己手动创建的dotfile,那么可以按照软件分类存储文件,在dotfiles文件夹下创建几个文件夹
mkdir -p ~/.dotfiles/{bash,git,vim,tmux,input,ali}
然后按照分类将对应配置文件放到相应的目录中
mv ~/.bashrc ~/.dotfiles/bash/
假设目录结构如下:
~/.dotfiles/
├── bash/
│ ├── .bashrc
│ └── .bash_profile
├── git/
│ └── .gitconfig
└── vim/
└── .vimrc
使用Stow
使用Stow创建符号链接
在~/.dotfiles
目录下运行stow -v -t ~ bash # 为 bash 配置创建链接到 HOME
-v:显示详细输出。
-t ~:指定目标目录为 $HOME(默认是上级目录)。
bash:要链接的模块名(对应 ~/.dotfiles/bash/)。效果:
~/.dotfiles/bash/.bashrc 会符号链接到 ~/.bashrc。也可以一次性配置多个模块
stow -v -t ~ bash git vim
删除符号链接(卸载配置)
stow -D -v -t ~ bash # 删除 bash 模块的链接
-D:删除(卸载)符号链接,不会删除源文件。
参考文章
代码主要来源:
内容参考:
- Lars Kappert的博客
- 简书-wty21cn
- DeepSeek
- Stow管理符号链接