Tự xây dựng dotfiles của riêng bạn
vim
20
zsh
1
dotfiles
2
White

Thinh Tran viết ngày 04/10/2017

Lý do viết bài: Mặc dù viết lách không được giỏi, nhưng mà vì muốn sử dụng kipalog API nên mình cũng cố rặn 2 bài viết, đây là bài viết số 1 (a hjhj)

Mở bài

Tại sao lại là dotfiles, là một thằng dev công việc hằng ngày của bạn chắc hẳn cắm mặt vào cái
termial cả ngày, nên việc custom sao cho nó dễ xài, thao tác nhanh luôn quan trọng nhất, hoặc đôi khi là để lấy le cho mấy em gái marketing, hr, etc... (giả bộ để màn hình đen đen, lúc mấy ẻm đi qua thì gõ lạch cạch chứng tỏ mình nguy hiểm :troll:)
Ấy vậy mà có vấn đề, vấn đề là khi bạn config nhiều quá, đến lúc mua máy mới thì lại... quên. Hoặc là lúc tỏ ra nguy hiểm mấy em marketing thấy thích quả, qua hỏi là "anh ơi, setup giùm em cái vim" (clgt), holy shit, lúc đó quên béng đi là mình đã setup như thế nào thì nhục mặt quá. Bởi vậy nên theo chủ nghĩa xã hội developers và tư tưởng coders, chúng ta nên tạo một repository và lưu giữ những config đó.

Thân bài

Dotfiles là gì?

Sau đây là một khái niệm tổng quát mình copy được

  • Dotfiles are used to customize your system. The “dotfiles” name is derived from the configuration files in Unix-like systems that start with a dot (e.g. .bash_profile and .gitconfig).
  • For normal users, this indicates these are not regular documents, and by default are hidden in directory listings. For power users, however, they are a core tool belt.

Cả 2 ý đều đúng, nhưng ở đây chúng ta chỉ đi sâu vào ý thứ nhất, thông thường trên các hệ thống dùng *nix (xài windows thì chia tay), tại thư mục $HOME luôn có sẵn các file config (có phần cuối tên file được kết thúc bằng rc và bắt đầu bằng dấu chấm, ví dụ .vimrc, .zshrc,... Đây chính là dotfiles của bạn, nơi đây chứa config cho đa số các ứng dụng bạn xài hằng ngày (luôn đúng nếu bạn là một console hipster)

Công việc chúng ta bây giờ là backup và restore những dotfiles đó khi cần thiết.

Nên làm như thế nào?

Đầu tiên thì bạn cần một nơi để lưu trữ nó, cách đơn giản nhất ở đây là dùng luôn github, hãy lên github và tạo ngay một repo "github.com/[your_name]/dotfiles. Tiếp theo việc của bạn là copy các dotfiles của bạn vào thư mục repo, commit và push lên github là xong. Tuy nhiên, không lẽ mỗi lẫn bạn sửa một files bạn lại đi copy từng files một rồi commit, push lên. Như vậy thì không khoa học lắm. Là một người công dân của đất nước xã hội chủ nghĩa, là một developer mẫu mực, tôi sẽ không bao giờ thực hiện một công việc lặp đi, lặp lại trong đời. Tất cả nên được tự động hoá.

Đầu tiên hãy tạo một file như Dotfiles trong repo, có nội dung như sau

.vimrc
.zshrc
.zlogin
.tmux.conf

File này chứa list files bạn sẽ backup và restore khi cần thiết ở thư mục $HOME

Tiếp theo tạo một file `backup.sh' như sau

#!/bin/sh

git pull origin master
while read f; do
    echo "Backup file $f..."
    cp -rf $HOME/$f ./
done < Dotfiles
echo "Backup files done, please commit!"

git add . -A
git commit -m "Backup at $(date)"
git push origin master

Đoạn script đơn giản trên sẽ thực hiện pull dotfiles mới nhất trên github repo, copy lại những file config bạn đã khai báo ở trong list Dotfiles, thực hiện commit và push ngược lên github (nếu rủi bạn có bị conflict thì thôi, bạn quá đen chúc mừng bạn, hjhj)
Vậy làm sao để restore, tạo một file restore.sh như sau

#!/bin/sh
# Clone dotfiles in to workspace
mkdir -p $HOME/workspace
git clone https://github.com/[your_name]/dotfiles.git $HOME/workspace/dotfiles
cd $HOME/workspace/dotfiles

# Restore runtime config
while read f; do
    echo "Copying file $f..."
    cp -rf $f ~/
done < Dotfiles

echo "Restore dotfiles done!"

Commit tất cả lại, sau đó chạy ./backup.sh (nhớ chmod +x)
Tiếp theo để restore khi cần thiết bạn chỉ cần chạy:

curl -sSL https://raw.githubusercontent.com/[your_name]/dotfiles/master/restore.sh | sh

Dotfiles của tôi có gì?

Đại đa số là các config được custom lại theo ý tôi, có thể bạn dùng một số bộ config sẵn như awesome-zsh hoặc vim config của bạn spf13 chẳng hạn, nhưng thường tôi sẽ tự "trồng" lấy một cái để xài, một phần để dễ quản lý, một phần để hiểu được cái mình đang xài là gì, có cái magic mù mờ nào đó không? Mà thật ra thì có nhiều cái xài của người khác làm sẵn nó không theo ý mình cảm giác nó khó chịu. Sau đây là cách tổ chức dotfiles về một số đồ chơi mà tôi có xài, tất nhiên mình sẽ không đi sâu vào tôi config chi tiết những gì, bởi vì mỗi người sẽ có sở thích, ý kiến riêng.

Về .zshrc của tôi

Đây là cổng đi vào không giản ảo và góc chiến lược hằng ngày bạn, bạn sẽ phải cắm mông lên ghế và cắm mặt vào nhìn nó thường xuyên. Mặc dù không thường xuyên thay đổi, nhưng thỉnh thoảng bạn có cài thêm đồ chơi mới thì cũng phải thêm rc cho nó.
Mặc định zsh có một file config chung tên là .zshrc, tuy nhiên việc để một file chung như vầy khá là củ chuối, mỗi lần bạn thay đổi gì thì bạn phải append thêm vào hoặc tìm lại config cũ để sửa khá là không rõ ràng rành mạch, thêm nữa khi bạn dùng nhiều hệ máy cùng lúc (như tôi dùng cả Mac OS X lẫn Archlinux) thì có những config trên máy này lại không dùng cho máy khác. Nên tôi tách ra như sau:

.zshrc #config chung cho zshrc
.zshrc.theme # prompt theme của tui dành cho zsh (cái này không cần thiết nếu bạn dùng theme của người khác)
.zshrc.linux # config riêng cho máy chạy archlinux
.zshrc.osx # config riêng cho máy chạy osx
.zshrc.alias.linux # config riêng cho việc alias các command trên archlinux
.zshrc.alias.osx # config riêng cho việc alias command trên osx

Làm sao để cách load tất cả các file đó trong 1. Trong .zshrc sẽ làm như sau:

# other config above

# Load custom prompt theme
[ -f ~/.zshrc.theme ] && source ~/.zshrc.theme

# Load specific config for linux or osx
case $(uname) in
Linux)
  [ -f ~/.zshrc.linux ] && source ~/.zshrc.linux
  [ -f ~/.zshrc.alias.linux ] && while read line; do eval "alias $line"; done < ~/.zshrc.alias.linux
  ;;
Darwin)
  [ -f ~/.zshrc.osx ] && source ~/.zshrc.osx
  [ -f ~/.zshrc.alias.osx ] && while read line; do eval "alias $line"; done < ~/.zshrc.alias.osx
  ;;
esac

# other config below

Trong 2 file .zshrc.linux với .zshrc.osx thì khỏi nói, còn trong 2 files alias thì nội dung của nó trông như thế này:
.zshrc.alias.linux

ls='ls --color=auto'
dm='docker-machine'
vim='nvim'
po='kubectl get po | grep'

.zshrc.alias.osx

ls='ls -G'
dm='docker-machine'
vim='nvim'

Về vim của tôi

Đầu tiên phải cám ơn @unrealhoang, đã kéo tôi vào hố vôi rồi lội ra không được, vimrc của tôi về cơ bản cũng giống như ai thôi, chỉ có điều tương tự như zsh, file config của tôi cũng được chia nhỏ ra để cho dễ quản lý

.vimrc # config chung, bao gồm một số key mapping chung
.vimrc.fn # một số hàm vimL được tôi viết để xử lý một số thứ cần thiết (được load vào đầu file vimrc)
.vimrc.bundles # chứa list các plugins sẽ được tôi sử dụng, tôi dùng vim Plug
.vimrc.plugins.settings # chứa settings của các plugins, key mapping của pluggins (đang muốn tách ra tiếp mỗi pluggin 1 file.

Làm sao để vimrc load các file config khác. Rất đơn giản, tại nơi bạn muốn load file rc thì bạn thêm đoạn vimL như sau:

" Begin {
  set nocompatible
  source ~/.vimrc.fn
" }

" VIM bundles {
  filetype off
  call plug#begin('~/.vim/plugged')
  source ~/.vimrc.bundles
  call plug#end()
  filetype plugin indent on     " required!
" }

" COMMON CONFIG should be here

" Load Plugins settings {
  if !empty(glob('~/.vimrc.plugins.settings'))
    source ~/.vimrc.plugins.settings
  endif
" }

Sample .vimrc.bundle

Plug 'duythinht/inori' "Inori colorscheme
Plug 'bling/vim-airline'
Plug 'ctrlpvim/ctrlp.vim'

Sample .vimrc.fn

" Delete_trailing remove unneccessary  space in code when saving
func! Delete_trailing()
  exe "normal mz"
  %s/\s\+$//ge
  exe "normal `z"
endfunc

Sample .vimrc.pluggins.settings

" ack {
  if executable('ag')
    let g:ackprg = 'ag --vimgrep'
  endif
" }

" GoLang by gocode {
  au FileType go nmap gi :GoImports<CR>
  au FileType go nmap gI :GoImport<Space>
  au FileType go nmap gl :GoLint<CR>
  au FileType go nmap ge :GoErrCheck<CR>
" }

Kết bài

Không biết viết gì cả :troll:

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Thinh Tran

3 bài viết.
27 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
22 15
“I am not a visionary. I'm an engineer. I'm happy with the people who are wandering around looking at the stars but I am looking at the ground and ...
Thinh Tran viết 3 tháng trước
22 15
White
10 3
Tôi có thằng bạn, thời đi học lúc tôi học Java thì nó học C, sau ra đường kiếm sống tôi xài Python thì nó nhập hội Ruby. Gần đây thấy bảo nó lại âm...
Thinh Tran viết 2 tháng trước
10 3
Bài viết liên quan
White
14 12
Một vài thủ thuật vim mới biết, ghi lại cho khỏi quên Căn lề các cột dữ liệu Để căn lề ấn phím esc (để sang command mode) :%column t Chọn th...
studybot viết 3 năm trước
14 12
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
27 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!