我如何利用点文件提高工作效率 [更新]
我如何利用点文件提高工作效率
原文发表于blog.mphomphego.co.za,日期为 2019 年 2 月 28 日。
更新:2019年3月17日添加了我的新电脑设置脚本的
演示视频。 点击GIF:
我如何利用点文件提高工作效率
简而言之:只需几分钟,你就可以使用配置文件和安装脚本搭建一个新系统。创建自己的软件仓库并不难,而且你会在这个过程中学到很多东西。这真的是一件重在过程而非结果的事情!
没有什么比一切从头再来更令人沮丧的了,尤其是在全新安装操作系统或者硬盘崩溃导致需要重新安装操作系统的时候!
然后你会想,我的天哪!我的别名、系统设置和配置文件,所有的小辅助文件和脚本 ,就这么没了!
你新电脑上全新安装的操作系统已经面目全非,一切都是新装的——你会多么恼火啊!
回想起以前使用电脑时的舒适和高效,心中不禁涌起一股暖流。要是能把所有熟悉和喜爱的东西都随身携带,再也不用担心重新安装软件的痛苦就好了……
幸好,确实有!
随着时间的推移,我变得越来越恼火和沮丧,以至于我创建了自己的 Linux 安装脚本,它可以自动安装我需要的所有内容,包括软件包、点文件、配置文件和设置。
如果您想了解一下 [ new-computer ] - 如果您有好的想法想要分享或想要合作,请随时给我发推文@orifhampho或fork 并向我发送 PR!
一切自动化!
这包含两个部分:
-
第一个是我的 dotfiles 和 configs的存储库/备份。
此存储库包含并跟踪我的分区中大多数重要文件的更改
/home,例如.bashrc,.bash_aliases以及其他相关文件。点文件用于自定义系统。这个
"dotfiles"名称源自类 Unix 系统中以点号开头的配置文件(例如 `.x`.bash_profile和.gitconfig`.yml`)。对于普通用户来说,这意味着这些文件并非常规文档,默认情况下会在目录列表中隐藏。但对于高级用户而言,它们是核心工具之一。
将我的点文件备份到 GitHub 可以确保所有内容都得到清晰的跟踪和版本控制。 -
第二个仓库功能强大,它包含一个脚本,运行后会安装我日常工作、学习和娱乐所需的所有软件包、配置文件、 GitHook和点文件
installer.sh。正是它让这一切神奇地运转起来。
我将在下一篇文章中详细介绍。
我的 Dotfiles
示例 Dotfiles 仓库
在这篇文章中,我只会列出我自己的dotfiles 仓库的一个子集。
当前结构
以下是我的 dotfiles 仓库的结构。这也是我们将在下面的演示中使用到的结构。
.
├── .config
│ ├── Code
│ │ └── User
│ ├── gummi
│ │ ├── gummi.cfg
│ │ ├── snippets.cfg
│ │ └── welcome.tex
│ ├── Mendeley Ltd.
│ │ └── Mendeley Desktop.conf
│ ├── ranger
│ │ ├── bookmarks
│ │ ├── commands_full.py
│ │ ├── commands.py
│ │ ├── history
│ │ ├── rc.conf
│ │ ├── rifle.conf
│ │ ├── scope.sh
│ │ └── tagged
│ ├── redshift.conf
│ ├── Slack
│ │ └── local-settings.json
│ ├── sublime-text-3
│ │ ├── Packages
│ │ ├── TrailingSpaces
│ │ └── WordHighlight
│ ├── terminator
│ │ └── config
│ └── xfce4
│ ├── helpers.rc
│ ├── help.rc
│ ├── panel
│ ├── terminal
│ ├── xfce4-screenshooter
│ ├── xfce4-taskmanager.rc
│ └── xfconf
├── .dotfiles
│ ├── .bash_aliases
│ ├── .bash_functions
│ ├── .bashrc
│ ├── .docker_aliases
│ ├── .dotfiles_setup.sh
│ ├── .git-completion.bash
│ ├── .gitconfig
│ ├── .gitignore
│ ├── .nanorc
│ ├── .profile
│ └── .travis.conf
├── .ipython
│ └── profile_default
│ ├── db
│ ├── ipython_config.py
│ ├── ipython_kernel_config.py
│ ├── log
│ ├── pid
│ └── startup
├── LICENSE
├── My-Git-Repos.txt
├── Pictures
│ ├── glasses-and-computer-screen.jpg
│ ├── vertical_background.jpeg
│ └── wallpaper.jpg
├── README.md
└── .travis.yml
深入研究点文件
我们将来看以下例子:
- .dotfiles/.profile
- .dotfiles/.bashrc
- .dotfiles/.bash_aliases
- .dotfiles/.bash_functions
- .dotfiles/.docker_aliases
。轮廓
这个文件位于您的/home目录中,会在登录时首先加载,它的名称可能是 `.config.js`.profile或 `.config.js` .bash_profile。
在 `.config.js` 中写入什么内容.profile完全取决于个人喜好,而且它可以被大幅扩展。我个人喜欢尽可能保持 `.config.js` 文件.profile简洁,只包含那些只需要运行一次的内容。
例如,我会在 `.config.js` 文件中定义所有颜色和颜色函数。.profile
case ${TERM} in
'') ;;
*)
# Define a few Colours
BLACK="$(tput -T xterm setaf 0)"
BLACKBG="$(tput -T xterm setab 0)"
# ....
esac
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
# set PATH so it includes user's private bin directories
PATH="$HOME/.venv/bin:$HOME/bin:$HOME/.local/bin:$PATH"
export PATH="$HOME/.poetry/bin:$PATH"
recho() {
echo "${RED}$1${NC}"
}
gecho() {
echo "${GREEN}$1${NC}"
}
export -f recho
export -f gecho
完整示例:我的.profile
如果你想更深入了解启动脚本,Peter Ward 解释了Shell 启动脚本。
.bashrc
.bashrc这是一个 shell 脚本,Bash 在每次以交互方式启动时(例如打开新终端时)都会运行它。它会初始化一个交互式 shell 会话。
例如,我在这里定义了我的PS1参数、shell 选项、快捷键、别名、函数和自定义消息。
__git_status_info() {
STATUS=$(git status 2>/dev/null |
awk '
/^On branch / {printf($3)}
/^Changes not staged / {printf("|?Changes unstaged!")}
/^Changes to be committed/ {printf("|*Uncommitted changes!")}
/^Your branch is ahead of/ {printf("|^Push changes!")}
')
if [ -n "${STATUS}" ]; then
echo -ne " (${STATUS}) [Last updated: $(git show -1 --stat | grep ^Date | cut -f4- -d' ')]"
fi
}
__disk_space=$(/bin/df --output=pcent /home | tail -1)
_ip_add=$(ip addr | grep -w inet | gawk '{if (NR==2) {$0=$2; gsub(/\//," "); print $1;}}')
__ps1_startline="\[\033[0;32m\]\[\033[0m\033[0;38m\]\u\[\033[0;36m\]@\[\033[0;36m\]\h on ${_ip_add}:\w\[\033[0;32m\] \[\033[0;34m\] [disk:${__disk_space}] \[\033[0;32m\]"
__ps1_endline="\[\033[0;32m\]└─\[\033[0m\033[0;31m\] [\D{%F %T}] \$\[\033[0m\033[0;32m\] >>>\[\033[0m\] "
export PS1="${__ps1_startline}\$(__git_status_info)\n${__ps1_endline}"
# ------------
IP_ADD=`ip addr | grep -w inet | gawk '{if (NR==2) {$0=$2; gsub(/\//," "); print $1;}}'`
printf "${LIGHTGREEN}Hello, ${USER}@${IP_ADD}\n"
printf "Today is, $(date)\n";
printf "Sysinfo: $(uptime)\n"
printf "\n$(fortune | cowsay)${NC}\n"
完整示例:我的.bashrc
.bash_aliases
Bash别名本质上就是键盘快捷键、缩写,一种避免输入冗长命令序列的方法。了解更多。以下是一些示例:
alias update='sudo apt-get -y update'
alias upgrade='sudo apt-get -y --allow-unauthenticated upgrade && sudo apt-get autoclean && sudo apt-get autoremove'
alias hist='history --color=always'
alias hist-grep='history | grep --color=always'
alias youtube="$(command -v youtube-dl)"
alias youtube-mp3="$(command -v youtube-dl) -x --audio-format mp3"
alias rsync='rsync --progress'
alias less='less -N'
完整示例:我的.bash_aliases
.bash_functions
对于过于复杂而无法使用别名(或者过于简单而无法编写成独立脚本)的命令,可以将其定义在函数中。函数可以接受参数,使其功能更加强大。
cd() {
# The 'builtin' keyword allows you to redefine a Bash builtin without
# creating a recursion. Quoting the parameter makes it work in case there are spaces in
# directory names.
builtin cd "$@" && ls -thor;
}
compile() {
if [ -f $1 ] ; then
case $1 in
*.tex) latexmk -pdf $1 ;;
*.c) gcc -Wall "$1" -o "main" -lm ;;
# List should be expanded.
*) recho "'$1' cannot opened via ${FUNCNAME[0]}" ;;
esac
else
recho "'$1' is not a valid file"
fi
}
committer() {
# Add file(s), commit and push
FILE=$(git status | $(which grep) "modified:" | cut -f2 -d ":" | xargs)
for file in $FILE; do git add -f "$file"; done
if [ "$1" == "" ]; then
# SignOff by username & email, SignOff with PGP and ignore hooks
git commit -s -S -n -m"Updated $FILE";
else
git commit -s -S -n -m"$2";
fi;
read -t 5 -p "Hit ENTER if you want to push else wait 5 seconds"
[ $? -eq 0 ] && bash -c "git push --no-verify -q &"
}
createpr() {
# Push changes and create Pull Request on GitHub
REMOTE="devel";
if ! git show-ref --quiet refs/heads/devel; then REMOTE="master"; fi
BRANCH="$(git rev-parse --abbrev-ref HEAD)"
git push -u origin "${BRANCH}" || true;
if [ -f /usr/local/bin/hub ]; then
/usr/local/bin/hub pull-request -b "${REMOTE}" -h "${BRANCH}" --no-edit || true
else
recho "Failed to create PR, create it Manually"
recho "If you would like to continue install hub: https://github.com/github/hub/"
fi
}
完整示例:我的.bash_functions
.docker_aliases
类似地.bash_aliases,我在这个文件中定义了所有docker run快捷键。
# bat supports syntax highlighting for a large number of programming and markup languages
# see: https://github.com/sharkdp/bat
alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat'
# A collection of simplified and community-driven man pages.
# see: https://github.com/sharkdp/tldr
alias tldr='docker run --rm -it -v ~/.tldr/:/root/.tldr/ nutellinoit/tldr'
# Simplified docker based markdown linter
# see: https://github.com/mmphego/my-dockerfiles/markdownlint
alias markdownlint='docker run --rm -it -v "$(pwd):/app" mmphego/markdownlint'
# Simplified docker based latexmk
# see: https://github.com/mmphego/my-dockerfiles/latex-full
alias mklatex='docker run --rm -i -v "$PWD":/data --user="$(id -u):$(id -g)" mmphego/latex:ubuntu'
完整示例:我的.docker_aliases
其他点文件
上面我只列出了一部分点文件,很多软件包也会将它们的设置存储在点文件中,例如
.gitconfigGit- 完整示例:我的.gitconfig文件
.nanorc纳米- 完整示例:我的.nanorc
安装点文件
注意:请确保您的 /home 目录下定义了一些配置文件。在继续操作之前,请务必备份这些配置文件。
记住,能力越大,责任越大。
我编写了一个 dotfiles 安装脚本,用于自动将仓库中的 dotfiles 文件软链接到您的/home目录。您可以参考.dotfiles_setup.sh文件查看示例。
请注意,该脚本目前使用 'ln' 而不是 '\n'GNU stow来创建软链接——我很快会更新脚本。
要在新系统上安装 dotfiles,我们可以通过克隆仓库轻松完成:
cd $HOME
git clone --depth 1 https://github.com/mmphego/dot-files
rsync -uar --delete-after dot-files/{.,}* "${HOME}"
bash .dotfiles/.dotfiles_setup.sh install
# To delete
# bash .dotfiles/.dotfiles_setup.sh delete
该脚本将备份现有的点文件,然后进行符号链接。
完成后,您只需运行测试以确保安装成功即可。
bash .dotfiles/.dotfiles_setup.sh test
结论
这篇博文就到这里了,希望你能从中有所收获。配置
文件(dotfiles)是非常个人化的,你可以参考其他仓库,然后按照自己的喜好来编写。我一直很擅长在 GitHub 和其他博客上搜索包含配置文件的仓库,而且经常能找到一些有用的东西。要让所有东西都按照你的规范运行总是有点棘手,但一旦你把一切都安排妥当,就可以开始使用了。
去构建并设置你自己的配置文件,下次你的电脑崩溃/重装系统时,就不会那么糟糕了!
反馈
如果你有好的想法想要分享或想要合作,欢迎随时在推特上@orifhampho给我发消息,或者fork 这个项目并向我发送 PR!
