dotfiles
用戶對於程序的配置通常存儲在所謂的點文件(以 .
開頭的文件)中。通常的做法是用版本控制系統(如 Git )來管理點文件,以跟蹤其變化,並在不同的主機上同步。有許多管理點文件的方法。例如,直接跟蹤主目錄中的點文件;或者將其放在子文件夾中,用 shell 腳本或專用工具進行管理。除了說明如何管理你的點文件之外,本文章還包含了一個來自 Arch Linux 用戶的點文件配置庫列表。
使用 Git 跟蹤點文件[編輯 | 編輯原始碼]
直接使用 Git 跟蹤點文件的好處是它只涉及Git而不涉及符號連結。壞處則是對於特定主機的配置通常需要多個分支來合併。
實現這一需求最簡單的方式是直接在 home 目錄初始化一個 Git 倉庫,並在gitignore(5)文件中使用*
匹配所有文件來忽視它們。
但是兩個弊端也隨之而來:一是當你的 home 目錄下有其他 Git 倉庫時,就會難以應對(比如說你如果你忘記初始化而直接對點文件倉庫進行操作的時候)。二是你很難確定當前目錄下的那些文件是沒有被跟蹤的(因為他們已經被忽略了)。
為避免上述兩個弊端,一個很受歡迎的替代方法是「裸倉庫別名法」,它的原文連結在此:Ask Hacker News: What do you use to manage your dotfiles?,它只要3個命令就可輕鬆完成設置:
$ git init --bare ~/.dotfiles $ alias dotfiles='/usr/bin/git --git-dir="$HOME/.dotfiles/" --work-tree="$HOME"' $ dotfiles config status.showUntrackedFiles no
你可以採用下面的命令在新系統中複製點文件:
$ git clone --bare <git-repo-url> $HOME/.dotfiles $ alias dotfiles='/usr/bin/git --git-dir="$HOME/.dotfiles/" --work-tree="$HOME"' $ dotfiles checkout $ dotfiles config --local status.showUntrackedFiles no
- 如果這時有一些點文件已經被覆蓋了,你可能會遇到類似下面這樣的錯誤:
$ dotfiles checkout error: The following untracked working tree files would be overwritten by checkout: .bashrc .gitignore Please move or remove them before you can switch branches. Aborting
- 你應該使用
$ dotfiles checkout -f
重寫已經存在的文件,或是用下面更安全的腳本方法備份所有文件,記得使用checkout
:mkdir -p .dotfiles-backup && \ dotfiles checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \ xargs -I{} mv {} .dotfiles-backup/{}
在這之後你可以用 alias命令 去管理點文件。如果你使用的是 Bash,只需要安裝 bash-complete-aliasAUR 後就可以使用補全功能,最後將別名和下面的一行命令放在你的~/.bashrc
中。
$ complete -F _complete_alias dotfiles
另一種在bash中使用補全功能的方法,在你的~/.bashrc
中加入下面的命令(擅自[1]):
source /usr/share/bash-completion/completions/git __git_complete config __git_main
特定設備相關的配置[編輯 | 編輯原始碼]
你可能有很多台設備, 在這些設備之間同步點文件是一個很常見的問題,我們將其稱之為特定設備相關的配置。
有了 Git 工具的幫助,我們可以通過以下方式解決這個問題:我們可以維護一個包含通用配置文件的主分支,同時為設備間不同的特定配置文件創建單獨的分支。維護時將通用配置文件的變動提交到前者,而將與設備相關的配置文件提交到後者。也就是說,每個設備的專用分支都是在保持通用分支更新的基礎上單獨建立的。
某些配置文件中,比如在 shell configuration files 中,可以使用條件邏輯判斷不同的設備。比如,Bash 腳本 (即.bashrc
) 中可以根據不同的主機名(或者其他特徵如類型、自定義變量等等)應用不同的配置。
if [[ "$(hostname)" == "archlaptop" ]]; then # laptop specific commands here else # desktop or server machine commands fi
同樣也可以用 .Xresources.[2] 實現類似功能。
如果你覺得設置 Git 分支太麻煩,也可以使用支持文件分組的工具,或者使用處理工具使管理更加靈活。
工具[編輯 | 編輯原始碼]
- 文件分組
- 也就是將配置文件歸納成組的方法。
- 處理
- 一些工具對配置文件進行處理,使其能夠根據主機情況進行定製。
名稱 | 包 | 語言 | 文件分組 | 處理 |
---|---|---|---|---|
dotbot | dotbotAUR | Python | 配置文件 | 無 |
chezmoi | chezmoi包 | Go | 基於目錄 | Go 模板 |
dot-templater | dot-templater-gitAUR | Rust | 基於目錄 | 特定語法 |
toml-bombadil | toml-bombadil | Rust | 基於目錄 | tera |
dotdrop | dotdropAUR | Python | 配置文件 | Jinja2 |
dotfiles | dotfilesAUR | Python | 無 | 無 |
dotter | dotter-rsAUR | Rust | 配置文件 | Handlebars |
dt-cli | dt-cliAUR | Rust | 配置文件 | Handlebars |
GNU Stow | stow包 | Perl | 基於目錄[3] | 無 |
Mackup | mackupAUR | Python | 自動按應用 | 無 |
mir.qualia | mir.qualiaAUR | Python | 無 | 自定義塊 |
rcm | rcmAUR | Shell | 基於目錄(按主機或標籤) | 無 |
yas-bdsm | - | Shell | 基於目錄 | 無 |
Git 的替代品[編輯 | 編輯原始碼]
如果你不喜歡 Git ,可以嘗試下列工具,它們或多或少可以看作是版本控制系統。
名稱 | 包 | 語言 | 文件分組 | 處理 |
---|---|---|---|---|
dotbare | dotbareAUR | Shell (fzf包) | repository-wise | 無 |
dotgit | dotgitAUR | Python | 基於文件名稱 | 無 |
homeshick | homeshick-gitAUR | Bash | repository-wise | 無 |
homesick | – | Ruby | repository-wise | 無 |
Pearl | pearl-gitAUR | Python | repository-wise | 無 |
vcsh | vcsh包 | Shell | repository-wise | 無 |
yadm(1) | yadm包 | Python | 基於文件名稱 (按類/作業系統/發行版/主機名稱/用戶)[4] |
內置模板/Jinja2/ESH[5] (可選) |
dfm | dfmAUR | Perl | repository-wise | 無 |
用戶倉庫[編輯 | 編輯原始碼]
作者 | Shell | WM / DE | 編輯器 | 終端 | 終端復用 | 音頻 | 資源監視 | 郵件 | IRC | 文件管理 | RSS 閱讀 |
---|---|---|---|---|---|---|---|---|---|---|---|
adamperkowski | Zsh | dwm | Neovim | Kitty | tmux | mpv | 自定義 | weechat | |||
alfunx | zsh | awesome | vim | kitty | tmux | ncmpcpp/mpd | htop/lain | thunderbird | |||
Ambrevar | Eshell | EXWM | Emacs | Emacs (Eshell) | Emacs TRAMP + dtach | EMMS | conky/dzen | mu4e | Circe | ||
ananthu | zsh | bspwm | neovim | alacritty | mpv | htop, polybar | neomutt | weechat | ranger | ||
awal | fish | i3 | vim | st | tmux | i3status | The Lounge | ||||
ayekat | zsh | karuiwm | vim | rxvt-unicode | tmux | ncmpcpp/mpd | karuibar | mutt | irssi | ||
bachoseven | zsh | dwm | neovim | st | ncmpcpp | bottom | neomutt | weechat | lf | ||
bamos | zsh | i3/xmonad | vim/emacs | rxvt-unicode | tmux | mpv/cmus | conky/xmobar | mutt | ERC | ||
brisbin33 | zsh | xmonad | vim | rxvt-unicode | screen | dzen | mutt | irssi | |||
BVollmerhaus | fish | i3-gaps | kakoune | kitty | polybar | ranger | |||||
christian-heusel | Zsh | i3 | Neovim | st / terminator | byobu / tmux | htop | neomutt/thunderbird | weechat | nemo / rangern | ||
cinelli | zsh | dwm | vim | termite-git | pianobar | htop | mutt-kz | weechat | |||
dikiaap | zsh | i3-gaps | neovim | alacritty | tmux | i3blocks | nnn | ||||
Earnestly | zsh | i3/orbment | vim/emacs | termite | tmux | mpd | conky | mutt | weechat | ||
ErikBjare | zsh | xmonad/xfce4 | vim | terminator | tmux | xfce4-panel | weechat | ||||
falconindy | bash | i3 | vim | rxvt-unicode | ncmpcpp | conky | mutt | ||||
filiparag | fish | bspwm | vim | alacritty | tmux | mpv, playerctl | htop, polybar | mail-notification | pcmanfm[失效連結 2022-09-17 ⓘ] | ||
gardenapple | zsh | sway | neovim | kitty | htop | aerc | |||||
graysky | zsh | xfce4 | vim | terminal | ncmpcpp | custom | thunderbird | ||||
hugdru | zsh | awesome | neovim | rxvt-unicode | tmux | thunderbird | weechat | ||||
insanum | bash | herbstluftwm | vim | evilvte | tmux | dzen | mutt-kz | ||||
isti115 | pwsh | sway | neovim | alacritty | tmux | mpv / playerctl | waybar / htop / ytop | ranger | |||
jasonwryan | bash/zsh | dwm | vim | rxvt-unicode | tmux | ncmpcpp | custom | mutt | irssi | ||
jdevlieghere | zsh | xmonad | vim | terminal | tmux | htop | mutt | weechat | |||
jelly | zsh | i3 | vim | termite | tmux | ncmpcpp | mutt-kz-git | weechat | |||
JonasDe[失效連結 2022-09-17 ⓘ] | zsh | i3 | vim | rxvt-unicode | tmux | ||||||
Jorengarenar | sh/Bash | i3 | Vim | xterm | tmux[失效連結 2022-09-17 ⓘ] | mpv | htop | aerc | WeeChat | ranger | QuiteRSS |
MarkusZoppelt | zsh | gnome | vim | terminal | tmux | ||||||
maximbaz | zsh | sway | kakoune | kitty | waybar | neomutt | nnn | ||||
mehalter | zsh | i3-gaps | neovim | termite | tmux | cmus | gotop | neomutt | weechat | ranger | |
meskarune | bash | herbstluftwm | vim | rxvt-unicode | screen | conky | weechat | ||||
neersighted | fish | i3 | neovim | alacritty | tmux | ncmpcpp | |||||
nimaipatel | fish | awesome | neovim | alacritty | ncmpcpp | ||||||
oibind | fish | awesome | neovim | st | tmux | htop-vim | weechat | lf | |||
OK100 | bash | dwm | vim | rxvt-unicode | cmus | conky, dzen | mutt | weechat | |||
orhun | bash | i3-gaps | vsc | alacritty | i3status | weechat | tere | ||||
pablox-cl | zsh (zplug) | gnome3 | neovim | kitty | |||||||
peterzuger | zsh | i3-gaps | emacs | rxvt-unicode | screen | moc | htop | ||||
potamides | bash | awesome | neovim | termite | tmux | ncmpcpp | conky,htop | mutt | weechat | ranger | |
reisub0 | fish | qtile | neovim | kitty | mpd | conky | |||||
Scrumplex | fish | sway | neovim | kitty | ncmpcpp / pipewire | waybar | aerc | ranger | |||
sistematico | zsh/fish/bash | i3-gaps | vim/nano | termite | tmux | ncmpcpp | polybar | mutt | weechat | ||
sitilge | zsh | sway | neovim | alacritty | htop | thunderbird | |||||
thecashewtrader | Eshell | EXWM | Emacs | Emacs (VTerm) | Emacs | Bongo | htop | mu4e | ERC | Dired | Elfeed |
thiagowfx | bash/zsh | i3 | vim | alacritty | tmux | playerctl | i3status | ranger | |||
tuurep | bash | openbox | neovim | alacritty | tmux | polybar | |||||
vodik | zsh | xmonad | vim | termite-git | tmux | ncmpcpp | custom | mutt | weechat | ||
w0ng | zsh | dwm | vim | rxvt-unicode | tmux | ncmpcpp | custom | mutt | irssi | ||
whitelynx | fish | i3 | neovim | kitty | i3pystatus | ||||||
whynothugo | zsh | sway | neovim | alacritty | mpv | waybar, top | neomutt | nemo | |||
wryonik | zsh | i3-gaps-rounded | vim | terminator | cmus | htop, i3blocks, gotop | ranger, nautilus |
另見[編輯 | 編輯原始碼]
- gregswiki:DotFiles
- XMonad Config Archive
- dotshare.it
- dotfiles.github.io
- terminal.sexy - Terminal color scheme designer