📟

Macのaliasを設定して手を労ろう

2023/04/18に公開

動機

最近、タイピングをしていて腕や指が痛くなることが増えてしまいました。

同じコマンドを何百回、何千回、何万回と打っていて、この作業を今後もずっとやるのしんどいなーと。

以前から最適化をしたいとは思っていたのですが、シェルスクリプト初級者で
簡単なものを書くのにも時間がかかってしまい、もどかしい思いをしていました。
しかしこの度、ChatGPT という最強のメンターを手に入れたので、手伝ってもらいつつ
色々設定してみました。

それはalias「エイリアス」です。

aliasとは

.zshrc
alias my='cd ~/'

こういうやつです。

cd ~/

要するにこういう風に打っていたやつを

my

でいけるようになります。
この記述だとあまり旨味はないですが、複雑な処理になればなるほど重宝します。
現実世界だと以下みたいに使っていると思います。

「冷蔵庫にある○○○○○○会社のウスターソース」を持ってきて
↓
「アレ」持ってきて

タイピング量とミスが結構減るので、aliasを設定しましょう!

補足

alias コマンドで、現在設定されている一覧が表示されます。

事前準備

事前準備として、以下の記述を追加してください。
これは  ${HOME}/.zsh.d ディレクトリ以下の.zshファイルを読み込む記述です。
何故かというと、全ての記述を.zshrcに書いてしまうと1ファイルのコードが肥大化して
管理しにくくなるため、ファイルを分割したいというわけです。

.zshrc
#################
# zsh設定ファイル(.zshrc)を分割する
#################

ZSHHOME="${HOME}/.zsh.d"

if [ -d $ZSHHOME -a -r $ZSHHOME -a \
     -x $ZSHHOME ]; then
    for i in $ZSHHOME/*; do
        [[ ${i##*/} = *.zsh ]] &&
            [ \( -f $i -o -h $i \) -a -r $i ] && . $i
    done
fi

こんな感じで.zshrcが全ての.zsh.d以下のディレクトリのファイルを全読み込みします。

.zshrc    # 大元で読み込む
.zsh.d/ # ディレクトリ名はなんでもOK
	hoge.zsh
	huga.zsh
	foo.zsh

なお、.zshrcを編集したら以下のコマンドを打って、変更を反映するようにしましょう。

source ~/.zshrc

参考

https://fnwiya.hatenablog.com/entry/2015/11/03/191902

移動編

.zshrc

# 移動 共通
alias my='cd ~/'
alias des='cd ~/Desktop'
alias job='cd ~/Desktop/job'

# 移動 プロジェクト毎
alias projecta='cd ~/Desktop/job/project_a/data'
alias projectb='cd ~/Desktop/job/project_b/data'
alias projectc='cd ~/Desktop/job/project_c/data'

job    # jobフォルダへ移動!
projectb  # projectbフォルダへ移動!

1つのプロジェクトが3〜4ヶ月続くとして、毎日Finderを辿っていくのはしんどいですよね。
これを1度設定すれば、ターミナルで一発で行けます。
また、「project_a」 「project_b」 「project_c」の間を素早く移動したい時なども重宝します。

ですが、aliasを都度手動で、「.zshrc」に追加するのは結構面倒です。
タイポして、ミスったりもあるので、簡単に cdエイリアスを追加、削除 出来るスクリプトを書きました。 
以下のコードを.zshrc(.bashrcの場合はそちら)に追加してください

.zshrc

######################
# set_alias
######################

function set_alias() {

  # エイリアスに設定する名前
  name=$1
  # 保存先は、bashや、zshで読み込めればどこでも良いです
  save_file=~/.zsh.d/alias_cd.zsh

  if [ -z "$name" ]; then
      echo "please input alias name!"
      return
  fi

  # エイリアス名がすでに存在するかどうかをチェック
  if grep -q "alias $name=" $save_file; then
      echo "Error: Alias name '$name' already exists!"
      return 1
  fi

  # ディレクトリが重複しているかどうかをチェック
  current_dir="$(pwd)"
  shortened_dir="${current_dir/$HOME/~}"

  if grep -q "cd $shortened_dir" $save_file; then
      echo "Error: The directory '$shortened_dir' has already been aliased!"
      return 1
  fi

  # エイリアスを保存
  echo "alias $1='cd $shortened_dir'" >> $save_file

  echo "==================================="
  echo "Alias created successfully."
  echo "==================================="

}

######################
# remove_alias
######################

function remove_alias() {
    name=$1
    save_file=~/.zsh.d/alias_cd.zsh

    if [ -z "$name" ]; then
        echo "please input alias name!"
        return
    fi

    if ! grep -q "alias $name=" $save_file; then
        echo "Error: Alias name '$name' does not exist!"
        return 1
    fi

    sed -i.bak "/alias $name=/d" $save_file
    rm -f $save_file.bak

    unalias "$name"

    echo "==================================="
    echo "Alias '$name' removed successfully."
    echo "==================================="
}

補足

~/zsh.d/alias_git.zsh 
というファイルを作成してください。
このファイルに、aliasを追加していきます。
実行権限をつけるのも忘れずに。

chmod +x ~/zsh.d/alias_git.zsh

使い方

ターミナルで、
cdエイリアスとして設定したいディレクトリに移動して、設定したいエイリアス名を引数で入れて以下を入力

set_alias project1 

と打ち込んでください。

エイリアス名かディレクトリが他と重複している

場合は失敗します。

エイリアスを削除したい場合は、
ディレクトリはどこでもいいので、削除したいエイリアス名を引数で入れて以下を入力

remove_alias project1 

また、unalias というaliasを削除するLinuxコマンドもあるのですが、
.zshrcからしか削除をしてくれません。
今回はファイル分割をやっているので、使えません!

git編(初級)

gitにも標準でエイリアスを設定することが出来るのですが、それだと
デフォルトで、 git ○○○ と打たなくてはならず面倒です。
ここは極限まで短くしたいところです。
各々の環境で他のコマンドと衝突しない範囲で改良してみてください。
なお、git pushは慎重にやったほうがいいという観点からエイリアスは作成してません。

以下の記述を追加してください。

~/zsh.d/alias_git.zsh

# git ##################################

alias gad='git add .'
alias gst='git status'

alias gbr='git branch'
alias gbrm='git branch -m'
alias gbrv='git branch -vv'

alias gck='git checkout'
alias gckb='git checkout -b'

alias gco='git commit'

alias glog1='git log -1'
alias glog2='git log -2'
alias glog3='git log -3'
alias glogo='git log --oneline'
alias glogn='git log --name-status --oneline'

alias gempty='git commit --allow-empty -m'

alias grebi='git rebase -i'
alias grebc='git rebase --continue'
alias greba='git rebase --abort'

alias gup='git remote update -p'

alias gpl='git pull'

alias gres='git reset'
alias greso='git reset --soft'
alias gresh='git reset --hard'


# gh ##################################
alias ghb='gh browse'
alias ghpc='gh pr create'

git編(中級編)

別ファイルの.shを実行も出来ます。
以下でやっていることはgitの初期化処理です。
(1),(2),(3)をコマンド一発で実行します。

以下の記述を追加

~/zsh.d/alias_git.zsh
alias ginit='~/.zsh.d/sh/git-init.sh'

新規で読み込むシェルスクリプトのファイルを作成

~/.zsh.d/sh/git-init.sh
#!/bin/sh

# リポジトリを初期化 --- (1)
git init

# 大文字と小文字を区別する設定を有効にする --- (2)
git config core.ignorecase false

# 基本的な .gitignore ファイルを作成 --- (3)
cat > .gitignore <<EOL
# システムファイル
.DS_Store
Thumbs.db

# プログラム言語やフレームワークに関連する一般的な無視すべきファイル
*.log
*.tmp
*.bak
*.swp
*.pyc
*.pyo
*.pyd
__pycache__
node_modules/
dist/
.cache
*.class

# ビルドファイル
build/
bin/
obj/
EOL

git編(上級編)

以下の記述を追加

~/zsh.d/alias_git.zsh
alias gupdel='~/.zsh.d/sh/git-update-delete.sh'
alias gmain='gupdel main' # 適宜変更
alias gmaster='gupdel master' # 適宜変更
alias gdevelop='gupdel develop' # 適宜変更

新規で読み込むシェルスクリプトのファイルを作成

~/.zsh.d/sh/git-update-delete.sh
#!/bin/sh

update_delete() {
  current_branch=$(git symbolic-ref --short HEAD)
  target_branch=$1
  git checkout "$target_branch"
  git pull
  git branch --merged | egrep -v '(\*|develop|master|main)' | xargs -r git branch -D
  git remote update -p
}

update_delete "$1"

使い方

(A).issue-hogeブランチでpullRequest&mergeをする
(B).github上でリモートissue-hogeブランチを削除
まで行ったとします。

その後

gmain

# or master or develop

とコマンドを打つと

(1). カレントをmainブランチに切り替え
(2). pullしてmainブランチを最新にする
(3). すでにマージされたローカルブランチを削除(develop、master、mainは除外)
(4). リモートリポジトリの情報を更新して、削除されたブランチを削除
をやってくれます。

マージ済みのブランチが残っていたのがとてもストレスだったのでとてもストレスフリーになりました。

utils編

####################
# utils
####################

# npm
alias ndev='npm run dev'
alias ydev='yarn run dev'

# python
alias python='python3'
alias pip='pip3'
alias pServer='python3 -m SimpleHTTPServer 7777'

# vim zshrc
alias zvi='vim ~/.zshrc'

# source zshrc
alias so='source ~/.zshrc'

# ローカルIP表示
alias ipc='ipconfig getifaddr en0'

# ブラウザのopen
alias chrm='open -a Google\ Chrome'
alias fx='open -a Firefox'
alias saf='open -a Safari'

# dsstore、ゴミファイルの削除
alias dsstore="find . -name '*.DS_Store' -type f -ls -delete"

# current dir copy
alias ppc='pwd | pbcopy'

# vscodeでカレントを開く
alias co='code .'

# vscodeで開く系
alias cgit="code ~/.gitconfig"
alias czsh="code ~/.zshrc"
alias dzsh="code ~/.zsh.d"

注意

全体の作業的に、

(1). 外部ファイルにしたら、実行権限をつける
(2). 変更が反映されない場合はsourceコマンドを使う or ターミナルのウィンドウを開き直す

を忘れずに。

最後に

ChatGPTはシェルスクリプトなどは比較的得意なのかなと感じました。

枯れた技術はAIに聞くのが一番ですね。とはいい、一発で生成されるわけでもなく
対話しながら作っていく感じでした。

AIの力を借りて、日々の作業をaliasに設定すると、タイピングやミスも減り
体にも時間にもやさしいエンジニアライフを送れます。

おすすめのエイリアスなどありましたら、是非教えてください🙏

Discussion