ぼくのdotfilesの軌跡
Noahです。
この記事は Aizu Advent Calendar 8日目の記事です。
前の記事は id:culumn さんの記事です。自分はiOS開発を行う際によくStoryboardをつかうのですが、Xibも触ってみようという気持ちになりました。
次の記事は id:Nozomi_M さんです。楽しみです。
本題
ところで、早いもので自分ももう学部三年です。
AizuAdventCalendar、自分が学部1年のとき投稿したのはHaskellの遅延評価の話、学部2年のときにはNeoVim/go-clientの記事と書きましたが、来年は忙しくて振り返ってられないと思うのと、
今年は学部一年が結構居たので、あまり小難しい記事は書かずに、僕のdotfilesの軌跡を辿っていきたいと思います。
序盤、若干ポエム入るので読みたくない人はGoBack!
ぼくのdotfiles黎明期
黎明期っていうけど、最初にdotfilesを上げたのが2015/9/9らしい。
ちょうど自分が高校3年の秋ですね。僕はこの頃から会津大学の受験勉強を始めていました(推薦入試の3ヶ月くらい前でかなり遅い)
この頃は Qiitaやどこかからコピペしたreferenceすらない .vimrc
をお遊びで入れていたくらいで、そもそもGitHubというツールがどのようにつかわれるものかを把握していませんでした。
dotfiles/.vimrc at a1a4a1d449f7ff1219c114f53ebd62b5c0e09ddd · NoahOrberg/dotfiles · GitHub
僕自身、大学に入ってからチーム開発というものを触れたのでしかたがないですね。コミットメッセージも最初の頃はひどいものです。
何がcorrectやねん。そもそも定期ってなんやねん定期って。
ぼくの最近の.zshrcのはなし
install script
最初は、上のようにどこから拾ってきたか知らない .vimrc
を突っ込んでるだけでしたが、最近はMacBookProと並行して使うマシン(ThinkPad x230)が増えたり、インターンで使用するPCが支給されたりしたので、それらのためにセットアップスクリプトを組んだりしています。
# __ # / /_ ________ _ __ # / __ \/ ___/ _ \ | /| / / # / /_/ / / / __/ |/ |/ / # /_.___/_/ \___/|__/|__/ # if `which brew > /dev/null 2>&1`; then echo "brew: already installed" else if [ `uname` = "Darwin" ]; then echo "brew: installing..." /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" echo "brew: done." elif [ `uname` = "Linux" ]; then echo "brew: unnecessary install" else echo "cannot detect OS" fi fi
よくあるやつですね。Linuxにはbrewは不必要(apt-getなりpacmanなりをつかえばいい)なので、 uname
がDarwin
, Linux
で識別してそれぞれを入れます。
愛用のfzfやzplugもこれで入れています。
widgets
zshは、widgetという機能を使うと、関数をキーにバインドでき、その機能を自分は割と気に入って使っています。以下のような関数をC-j
などホームポジションで実行できるように出来ます。
cd_ghq() { selected=`for dir in $(ls $GHQPATH/github.com);do for dir2 in $(ls $GHQPATH/github.com/${dir});do echo ${dir}${dir2}; done; done | fzf` [ "${selected}" = "" ] && return 0 cd $GHQPATH/github.com/${selected} zle reset-prompt zle -R -c }
zshプラグインで、anyframeというプラグインに anyframe-widget-cd-ghq-repository
というウィジェットがあるのですが、細かい挙動を操作したかったので自分で再実装しています。
fzfを割と愛用してて、それで任意のghqパス配下にあるディレクトリに移動できるので心強い
これ以外によく使うのは、gitのbranchのcheckoutですね。
checkout_gbranch() { # NOTE: サブディレクトリからでもcheckout可能にする # プロジェクトルートにcdする制限付き(存在しないディレクトリに入ったりしないために tmpdir=`pwd`; branches="" while true ; do # NOTE: `$ git branch -a` を、cdしなくてもいい方法があればそちらのほうが良い if [ `pwd` = "/" ]; then; cd ${tmpdir} && return 0 fi if [ -d .git ]; then; branches=`git branch -a` break else cd ../; fi done selected=`echo ${branches} | awk 'BEGIN{}{print $1}' | grep -v 'HEAD' | grep -v '\*' | awk 'BEGIN{idx=1;FS="/"}{if($1=="remotes" && $2=="origin"){idx=3};for(i=idx;i<NF;i++){printf "%s/", $i}; print $NF}' | sort | uniq | fzf` # NOTE: プロジェクトルートからしかできない安定版は以下(上がぶっ壊れたらつかう) # [ ! -d .git ] && return 0 # selected=`git branch -a | awk 'BEGIN{}{print $1}' | grep -v 'HEAD' | grep -v '\*' | awk 'BEGIN{idx=1;FS="/"}{if($1=="remotes" && $2=="origin"){idx=3};for(i=idx;i<NF;i++){printf "%s/", $i}; print $NF}' | sort | uniq | fzf` [ "${selected}" = "" ] && return 0 git checkout ${selected} zle reset-prompt zle -R -c }
プロジェクトルートに戻るために .git/
が見つかるまでひたすら cd ../
してますね。改めて見ると、階層が浅いうちはいいんですけど深くなったらどうなるんでしょうねコレ。
めっちゃコメントがかいてありますが、実際には割といま手探りで、gitのcheckoutの都合上、checkout元のブランチには存在したディレクトリにいまいるとして、checkout先のブランチにはそのディレクトリがない、などの場合が起こると都合が悪いので、チェックアウトしたあとにプロジェクトルートに戻るか、それともこの実行自体をプロジェクトルートから行えるのみにするか、みたいな葛藤をしてますね。
結局前者のほうが都合がいいので、後者はコメントにして残してる状態です。GitHubでコードを管理するとき、わりとみなさん良いコードだけ残そうとしますけど、葛藤したコードとかも残しておくほうがあとから見返せますし個人的にはいいと思います。
fzfを使うと、dockerの操作も簡単にできますのでおすすめです。ここに書くと行数が長くなるので書きません。
dlogs: dotfiles/.zshrc at 6777317032fd9b3e173a9f7fde4e2a7b8e5dcd3a · NoahOrberg/dotfiles · GitHub
dsh: dotfiles/.zshrc at 6777317032fd9b3e173a9f7fde4e2a7b8e5dcd3a · NoahOrberg/dotfiles · GitHub
dshは個人的によく使います。作業する際にコンテナの中に入って操作するときが多いので。
コマンド
あとは gg
コマンドですね。chrome-cliを使って、今開いているタブのgitリポジトリをghqで取ってくるようにしています。
gg() { # NOTE: NEEDs chrome-cli # $ brew install chrome-cli ghq get $(chrome-cli info | sed -n 's/Url: https:\/\/github.com\/\(.*\)/git@github.com:\1/p') cd $GHQPATH/$(echo $_ | sed -e 's/git\@github.com:\(.*\)/github.com\/\1/') }
ブラウジングしてて、ふとクローンしたいと思ったときにべんりです。
あまり賢くないので正規表現でごまかしつつスクリプトを組み立てています。
ぼくの最近の.config/nvim/init.vimのはなし
init.vimはNeoVimの設定ファイルです。
ちなみに自分は最近あまり編集をしてません(最近はほぼほぼzshの設定をしている)
自分はよくタイポをするのですが、それの修正のために
iabbrev TOOD TODO iabbrev srting string iabbrev strign string iabbrev strnig string iabbrev nit int iabbrev pubric public iabbrev Pritln Println iabbrev Prit Print iabbrev pritn print iabbrev singup signup iabbrev singin signin
こんなかんじで、iabbrev
に定義をしておいて自動でタイポを直すようにしています。これはべんり。最近知った。
あとは、inccommandですね。
set incsearch set inccommand=split
これを入れると、nvim側で置換をするときにプレビューしながら置換コマンドをかけます。これは便利。下のgifでは単純な置換のみですが、正規表現は結構難しいので割とアドです。
ぼくの最近の.config/karabinerのはなし
最近はThinkpad KeyboardをBluetoothでつなげてよく使いますが、このキーボード、ミドルボタンが少し癖があります。
Chromeなどウェブブラウザで特に顕著なのですが、スクロールのために押すと、カーソル以下のリンクが別タブで開く謎の挙動をします。
なので、それの修正をkarabinerでするスクリプトや、WindowsキーボードとMacのキーボードの配置の違いである、AltとCommandの逆転なども仕込んでいます。
これらは以下の記事から持ってきたコードなので特に書きません
ref. http://k3174r0.hateblo.jp/entry/2017/12/05/202046
ぼくの最近の.tmux.confのはなし
自分の開発において、tmuxはなくてはならないもので、自分の開発時間中、彼はずっと支えてくれています。
tmuxの見た目に関しては、vimのプラグインでカラースキーマにいい感じに合わせてくれるプラグインがあるのでそれを使っています。
これはべんり。最近、tenderからspacemacs風のカラースキーマに変更したのですが、やっぱり良い。
まとめ
以上、ぼくの最近のdotfiles事情をまとめてみました。俗に言われるシェル芸とか、あまり大したことはしてないです。
「エディタはIDEで十分じゃい!」
「vim(ないしはnvim)なんかつかわない!」
「tmuxよりscreenでしょ!w」
とかいうひとでも、普段シェルやターミナル環境は少なくとも使うだろうと思いますし、JetBrainsのIDEでも、~/.ideavimrc
を置くことでIdeaVimの設定を行うことができます。
みなさんもこれを期に自分だけのdotfilesを極めてみてはどうでしょうか。いいdotfilesやtipsがあれば紹介していただけるとぼくも嬉しいです。