Movatterモバイル変換


[0]ホーム

URL:


Adwaysエンジニアブログ

業務で使用している .zshrc 大公開!!! 〜〜ちょっとした解説付き〜〜

こんにちは!!!
広告事業本部でアプリケーションエンジニアをしている森田です!!

みなさん、Zsh使ってますか??
僕は昨年、新卒で入社したタイミングでbashから乗り換えて使い始めました。
業務でMacを使用するようになり、シェルを立ち上げるたびに「デフォルトZshやから乗り換えてな」的なメッセージが出てくるのが嫌で乗り換ることになりました...
きっかけとしてはこの通り受動的なものだったのですが、使ってみると意外と高機能でプラグインも豊富で以前よりよい開発体験を得ることができています。

乗り換えたてのころ、まわりの皆さんがどんな設定にしているのかなと気になり、
「ゾッシュってどんな設定にしてますか?」
と聞いたことがあり、場が一瞬???となったことがありました。
このブログではそんな僕がZshをズィーシェルと読むことを知り、業務のためにZshの設定ファイル.zshrcをいじってきた、その積み重ねの結果を共有させていただきます。

はじめに

このブログでは、新卒入社して約1年半の僕が実際に使用している.zshrcを恥ずかしながらも公開し、その後、軽い補足やお気に入りポイントの紹介をさせていただきます。
そもそもシェルとは何か?やZsh.zshrcとは何か?、Zshの便利なプラグインの話などはこのブログでは紹介いたしません。
なので、下記のような方々はこのブログの内容が参考になるかもしれません。

  • 業務でZshを使用している方
  • Zshのカスタマイズをしてみたい方

逆に下記のような方々にはこの記事の内容は合わないかもしれません。

  • シェル??Zsh??何それ??って方
  • fishしか勝たんみたいな方
  • Zshチョットワカル方

業務で使用している.zshrc大公開

早速ですが、僕が実際に業務で使用している.zshrcのブログ用を公開いたします。

# starship 有効化 ----------------------------------------------eval"$(starship init zsh)"# 補完機能有効化 ----------------------------------------------autoload-Uz compinitcompinit## 補完で小文字でも大文字にマッチさせる ===========================zstyle':completion:*' matcher-list'm:{a-z}={A-Z}'## 補完候補を一覧表示したとき、Tabや矢印で選択できるようにする ===========================zstyle':completion:*:default' menuselect=1## sudo で補完有効化 ===========================zstyle':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin\                   /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin# シンタックスハイライト有効化 ----------------------------------------------source /opt/homebrew/opt/zsh-syntax-highlighting/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh# サジェスト有効化 ----------------------------------------------source /opt/homebrew/opt/zsh-autosuggestions/share/zsh-autosuggestions/zsh-autosuggestions.zsh# コマンド履歴検索 有効化 ----------------------------------------------function peco-history-selection(){BUFFER=`history -n1| tac| awk'!a[$0]++'| peco`CURSOR=$#BUFFER  zle reset-prompt}zle-N peco-history-selectionbindkey'^H' peco-history-selection## 履歴保存管理 ===========================HISTFILE=$ZDOTDIR/.zsh-historyHISTSIZE=100000SAVEHIST=1000000# rbenv 有効化 ----------------------------------------------exportPATH="$HOME/.rbenv/bin:$PATH"eval"$(rbenv init - zsh)"# options ----------------------------------------------setopt auto_cd# alias ----------------------------------------------## global ===========================alias-gG='| grep'alias-gH='| head'alias-gL='| less'alias-gC='| pbcopy'## ls ===========================aliasls='ls -G'aliasla='ls -a'aliasll='ls -alF'## cd ===========================aliasd='cd ~/dev'alias ~='cd ~'alias ..='cd ..'alias ...='cd ../..'alias ....='cd ../../..'aliasprj='cd ~/dev/project_root'aliasplaygorund='cd /Users/morita/local/playground'## git ===========================aliasg='git'aliasga='git add'aliasgc='git commit -m'aliasgac='git add . && git commit -m'aliasgca='git commit --amend'aliasgcan='git commit --amend --no-edit'aliasgcam='git commit --amend -m'aliasgr='git reset HEAD^'aliasgco='git checkout'aliasgs='git switch'aliasgs-='git switch -'aliasgl='git log --oneline'aliasgb='git branch'aliasgcp='git cherry-pick'aliasmain='git switch main'aliasmaster='git switch master'## docker ===========================aliasda='docker attach'aliasdc_='docker-compose'aliasdup_='docker-compose up'aliasde_='docker-compose exec'aliasdc='docker compose'aliasdup='docker compose up'aliasde='docker compose exec'### container ===========================#### railsaliascrspec='docker compose exec rails bin/rspec'aliascrs='docker compose exec rails bin/rspec $(git status -s "*_spec.rb" | cut -c4-)'aliascrubocop='docker compose exec rails bundle exec rubocop'aliascrb='docker compose exec rails bundle exec rubocop $(git status -s "*.rb" | cut -c4-)'aliascrba='docker compose exec rails bundle exec rubocop -a $(git status -s "*.rb" | cut -c4-)'aliascrbA='docker compose exec rails bundle exec rubocop -A $(git status -s "*.rb" | cut -c4-)'aliascconsole='docker compose exec rails bin/rails c'aliascsandbox='docker compose exec rails bin/rails c --sandbox'aliascc='docker compose exec rails bin/rails c'aliascrails='docker compose exec rails bin/rails'aliascdb='docker compose exec rails bin/rails db'aliascr='docker compose exec rails'aliascrsh='docker compose exec rails bash'aliascspring='docker compose exec rails bin/spring'aliascss='docker compose exec rails bin/spring server'aliascsst='docker compose exec rails bin/spring stop'#### reactaliascre='docker compose exec react'aliascresh='docker compose exec react bash'aliascnpm='docker compose exec react npm'aliasccheck='docker compose exec react npm run check'aliascfix='docker compose exec react npm run check:fix'aliascbuild='docker compose exec react npm run build'aliasctest='docker compose exec react npx vitest run'## other ===========================aliaspython='python3'aliaszshrc='code ~/.zshrc'# alias ssh='~/zsh/ssh-iterm-setting'# func## ffmpegcgif () {# convert to giflocal ext=${2:-mov}local r=${3:-10}  ffmpeg-i$1.$ext-r$r$1.gif}## pbcopycwc () {# copy with commandlocal res=$(eval$@);echo$reslocal all="${@}\n\n${res}"echo$all| pbcopy}## reviewreview () {local cnt=$(gh pr list --search"review-requested:@me"| wc -l)if [$cnt-eq0];thenecho"No review request"else    gh pr list--search"review-requested:@me"-wfi}# 勝手に追加される系 ----------------------------------------------### MANAGED BY RANCHER DESKTOP START (DO NOT EDIT)exportPATH="/Users/morita/.rd/bin:$PATH"### MANAGED BY RANCHER DESKTOP END (DO NOT EDIT)exportPATH="/opt/homebrew/opt/mysql-client/bin:$PATH"exportPATH="/opt/homebrew/opt/curl/bin:$PATH"# The next line updates PATH for the Google Cloud SDK.if [-f'/Users/morita/Downloads/google-cloud-sdk/path.zsh.inc'];then . '/Users/morita/Downloads/google-cloud-sdk/path.zsh.inc';fi# The next line enables shell command completion for gcloud.if [-f'/Users/morita/Downloads/google-cloud-sdk/completion.zsh.inc'];then . '/Users/morita/Downloads/google-cloud-sdk/completion.zsh.inc';fi

解説

ここからは補足や、お気に入りポイントのお話をしていきます!!

setopt

.zshrcのsetoptでオプションをオンオフできるんですが、オプションの内容がman zshoptionsで確認できます!!

> man zshoptionsZSHOPTIONS(1)          General Commands Manual      ZSHOPTIONS(1)NAME       zshoptions - zsh options~~~   Changing Directories       AUTO_CD(-J)          If acommand is issued that can't be executed as a normal        command, and the command is the name of a directory, perform the        cd command to that directory.  This option is only applicable if        the option SHIN_STDIN is set, i.e. if commands are being read        from standard input.  The option is designed for interactive        use; it is recommended that cd be used explicitly in scripts to        avoid ambiguity.~~~

調べても散文的で網羅的に確認する方法が分からず困っていましたが、社内向けChatGPTに聞いたところ教えてもらいました!!便利!!

エイリアス

ここからはエイリアスについてお話ししていきます!!

詳しい説明は省かせていただくのですが、エイリアスを設定することでショートカット的にコマンドを実行できます!!

例えばalias g='git'だと下記2コマンドが同等の挙動をします。

> git switch blog
> g switch blog

プロジェクトへのcd

aliasprj='cd ~/dev/project_root'

この部分、お気に入りです!!
どのディレクトリにいてもすごく短いコマンドで目的のディレクトリに行けます!!

複数プロジェクトでいろんなディレクトリに行ったりするので満足度が高いです!!!!
設定も簡単でコスパもいいです。

コンテナ内でコマンド実行

### container ===========================#### railsaliascrspec='docker compose exec rails bin/rspec'~~~

このあたりですね、このコンテナ内でコマンド実行するエイリアスが一番使っているかもしれないです!!

現在関わっている全ての開発でDockerを使用しており、コンテナ内でコマンドを実行したいことがよくあります。
ですが、普段はホストでイケてるプロンプトのZshで作業しています。
コンテナ内のシェルがbashで何のカスタマイズもしていないので、コンテナ内のシェルに入るだけで なんかな〜 という気持ちになります。
だからといって毎回docker compose exec container_name ~~をタイピングするのも長すぎて大変です。

そこで、よく使うコマンドをエイリアス設定することで、コンテナ内のシェルで打つコマンドと同じ長さ、むしろ短かったりする長さで実行できます!!
タイポも減るし、最高です。

↓↓↓イケてるプロンプトのZsh↓↓↓

コミットしていないファイルをリント、テスト

aliascrb='docker compose exec rails bundle exec rubocop $(git status -s "*.rb" | cut -c4-)'

このgit status -s "*.rb" | cut -c4-の部分です!!
git status -s "*.拡張子"の部分でコミットしていない特定の拡張子のファイルをステータスを伴って取得しています。
cut -c4-でファイル名のみを抽出しています。
こうして得たファイル名の一覧をここではrubocopに渡して、リント、フォーマットしています。
一ファイルずつやるのはなかなか時間がかかるのでこれも重宝しています!!

ただ、削除したりリネームしたファイルも持ってきちゃうので、それでエラーになってしまいます。
伸び代ですね。

関数

ここからは.zshrcに定義している関数についてお話ししていきます!!

ここでも関数の詳細については省かせていただくのですが、.zshrcに関数を定義することでコマンドっぽく使うことができるようになります。

review () {local cnt=$(gh pr list --search"review-requested:@me"| wc -l)if [$cnt-eq0];thenecho"No review request"else    gh pr list--search"review-requested:@me"-wfi}

例えば上記のようにreview関数を定義すると、コマンドラインからreviewを実行できるようになります!!

> reviewNo review request

review関数

僕が所属する組織では、Findy Team+を用いた開発サイクルタイムの改善施策を進めています。
その中でレビューの優先度を意識的に上げようと考えたのですが、ブラウザを開いてGitHubを開いてレビュー依頼がきているPRを見つける流れが煩わしかったです。
レビュー依頼がきているPRのリストがサクッと開けたらいいのになぁーーと思って調べていました。
そこでghでいい感じにできそう、でも、レビュー依頼がない時もブラウザ開くの微妙やなというところに行きつきました。
そんな微妙やなを解決するのにちょっとした関数を.zshrcに定義するのがいいんです!!
これで僕のレビュー体験も上がるし、チームとしての開発サイクルの改善にもつながるので最高ですね!!

蛇足なんですが、↓のURLでレビュー依頼きてるPRの一覧を開くことはできます。
https://github.com/:organization/:repository/pulls?q=is%3Apr+is%3Aopen+reviewer%3A%40me
ただ、やっぱりターミナルで作業している時にブラウザに移動するのが煩わしいのと、ブラウザに移動して依頼がきていないときに微妙な気持ちになるのが嫌だったんですよね。

今後やりたいこと

ここまでいくつかお気に入りポイントを紹介させていただきました。
もっと紹介したいくらい、お気に入りポイントがいっぱいあります。
ですが、もっとよくなるやろ!!!!!!ってところもいっぱいあります。
ここではそんな伸び代を挙げておきます。

aliasをabbrにリプレイスしたい

aliasだとhistoryに省略した形で残ってしまうのですが、abbrを使用すると、実行時に省略形から実際のコマンドに展開されます!!
作業ログを共有したりする時に便利なんですが、シェルの立ち上げ時が微妙な感じなので試行錯誤中です...

カレントブランチと派生元ブランチ間で差分があるファイルを取得してリント、テストしたい

コミットしていないファイルをリント、テストの項で変更しているファイルをまとめてリントしている、とお話しさせていただきました。
実は色々妥協していて、本来は

  1. 派生元ブランチを自動取得
  2. 派生元ブランチとカレントブランチでのファイルの差分を取得
  3. まとめてリントする

が理想でした。
だったんですが、派生元ブランチの自動取得が難しくて妥協しちゃいました...
いつか理想の形に持っていきたい...

派生元ブランチさえ取得できたらファイルの一覧はgit diff --name-only $parent_branchで取得できるはず、なのでもう一歩な感じはあります。

差分があるファイルのテストファイルを抽出してテストしたい

前項とコミットしていないファイルをリント、テストの項に関わりがあるのですが、これはどちらも変更があったファイルのみを持ってきています。
ただ、これだとテストする時に、実はテストファイル変更し忘れてた!!をカバーできないです。
なので、変更があったプロダクトコードのファイルからテストコードファイルを特定して、それらをテストしたいんです!!
テストコードファイルの特定自体は、ファイルの命名規則がしっかりしていればsedなど使ってすぐにできるとは思います。
ただ、テストコードにすでに差分があったら?とかパターンを考えて実装まで行かないところで止まっちゃっています...
よくないですね!!!!

関数をファイル分割したい

.zshrcが肥大化してきているので、関数をファイル分割したいなと思ってます。
先ほども出てきた社内ChatGPTに教えてもらったところ、.zshrcファイル内でsource function_file.shすればいいみたいです!!
簡単そう!!でもディレクトリ構成どうしよ!!ってなってます。こんなんばっかですね。

おわりに

このブログでは恥ずかしながら僕が業務で使用している.zshrcを公開し、お気に入りポイントを紹介させていただきました。
Zshはプロンプトや拡張機能をいじるだけでも開発体験が爆増するのですが、一歩踏み込んでカスタマイズすることでより好みの使い心地になっていきますね。

本ブログを最後までお読みいただきありがとうございました!!

検索
購読
ABOUT
id:AdwaysEngineerBlog

株式会社アドウェイズのエンジニアによるブログです!このブログでは、アドウェイズのエンジニアがざっくばらんに技術のことや日常生活について書いていきますので、みなさんよろしくお願いいたします。
公式Twitter:@ADWAYS_ENGINEER

カテゴリー

引用をストックしました

引用するにはまずログインしてください

引用をストックできませんでした。再度お試しください

限定公開記事のため引用できません。

読者です読者をやめる読者になる読者になる

[8]ページ先頭

©2009-2025 Movatter.jp