NoahOrblog

某・福島にある大学のコンピュータ理工学部の大学生のお話。

ぼくのdotfilesの軌跡

Noahです。

この記事は Aizu Advent Calendar 8日目の記事です。

adventar.org

前の記事は id:culumn さんの記事です。自分はiOS開発を行う際によくStoryboardをつかうのですが、Xibも触ってみようという気持ちになりました。

culumn.hatenablog.com

次の記事は id:Nozomi_M さんです。楽しみです。

本題

ところで、早いもので自分ももう学部三年です。

AizuAdventCalendar、自分が学部1年のとき投稿したのはHaskellの遅延評価の話、学部2年のときにはNeoVim/go-clientの記事と書きましたが、来年は忙しくて振り返ってられないと思うのと、

今年は学部一年が結構居たので、あまり小難しい記事は書かずに、僕のdotfilesの軌跡を辿っていきたいと思います。

github.com

序盤、若干ポエム入るので読みたくない人はGoBack!

ぼくのdotfiles黎明期

黎明期っていうけど、最初にdotfilesを上げたのが2015/9/9らしい。

f:id:NoahOrberg:20181206182219p:plain

ちょうど自分が高校3年の秋ですね。僕はこの頃から会津大学の受験勉強を始めていました(推薦入試の3ヶ月くらい前でかなり遅い)

この頃は Qiitaやどこかからコピペしたreferenceすらない .vimrc をお遊びで入れていたくらいで、そもそもGitHubというツールがどのようにつかわれるものかを把握していませんでした。

dotfiles/.vimrc at a1a4a1d449f7ff1219c114f53ebd62b5c0e09ddd · NoahOrberg/dotfiles · GitHub

僕自身、大学に入ってからチーム開発というものを触れたのでしかたがないですね。コミットメッセージも最初の頃はひどいものです。

f:id:NoahOrberg:20181206182858p:plain

ひどいコミットメッセージ

何が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なりをつかえばいい)なので、 unameDarwin, 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パス配下にあるディレクトリに移動できるので心強い

github.com

これ以外によく使うのは、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プラグインでカラースキーマにいい感じに合わせてくれるプラグインがあるのでそれを使っています。

github.com

これはべんり。最近、tenderからspacemacs風のカラースキーマに変更したのですが、やっぱり良い。

まとめ

以上、ぼくの最近のdotfiles事情をまとめてみました。俗に言われるシェル芸とか、あまり大したことはしてないです。

「エディタはIDEで十分じゃい!」

vim(ないしはnvim)なんかつかわない!」

「tmuxよりscreenでしょ!w」

とかいうひとでも、普段シェルやターミナル環境は少なくとも使うだろうと思いますし、JetBrainsのIDEでも、~/.ideavimrc を置くことでIdeaVimの設定を行うことができます。

みなさんもこれを期に自分だけのdotfilesを極めてみてはどうでしょうか。いいdotfilesやtipsがあれば紹介していただけるとぼくも嬉しいです。