ラベル zsh の投稿を表示しています。 すべての投稿を表示
ラベル zsh の投稿を表示しています。 すべての投稿を表示
2014/09/22

[zsh]peco で git をもっと便利にする

peco を導入しました。すごく便利です。
導入についてはコチラ↓
peco を導入した | DevAchieve

peco で色々フィルタリングして選択できるのは
ファイル、ハッシュ、ブランチを選択する事が多い Git と相性が良さそうです。

peco script を色々作るとエイリアスとか大変っぽいので
zsh のグローバルエイリアスを使ってみました。

編集されたファイルをフィルタリングする

function peco-git-changed-files(){
    git status --short | peco | awk '{print $2}'
}
alias -g F='$(peco-git-changed-files)'

使い方

git add F
Ctrl + Space で複数ファイル選択して add も可能です。

コミットのハッシュをフィルタリングする

function peco-git-hash(){
    # git log --oneline --branches | peco | awk '{print $1}'
    git lg | peco | sed -e "s/^[\*\|][ |\\\/\*]*//g" | awk '{ print $1 }'
}
alias -g F='$(peco-git-hash)'
[alias]
 lg = log --all --graph --decorate --oneline
git lg (log graph) は僕の git log を置き換えるコマンドです。
以下のようにコミットが確認できるので履歴確認、ブランチ確認、マージする際に便利なコマンドです。

peco ではこの色付けがなくなってしまうので残念です。頑張って保持して欲しいところ。

使い方

git diff F とか git cherry-pick F とか。
おおよそコミットのハッシュを指定するところ全てで使えるんじゃないですかね?
git diff で複数選択とか便利です。

ブランチをフィルタリングする

function peco-git-branch(){
    git branch | peco | sed -e "s/^\*[ ]*//g"
}
alias -g B='$(peco-git-branch)'

使い方

git checkout B とか
git merge B とか
git diff B など。

参考

pecoでgit向けの汎用的なフィルターを2つ作成してみた - Qiita
私のpeco活用事例 - k0kubun's blog

[zsh]cdr: 開いたディレクトリの履歴からディレクトリを開く

peco を導入した | DevAchieve で実は cdr を導入していました。
zsh に組み込まれているコマンドに cdr という
開いたディレクトリの履歴からディレクトリを開くコマンドがあります。
~/.zshrc で cdr を有効にしてあげれば使えるようになります。

$HOME/.cache/shell/ は用意しないといけないので
mkdir -p $HOME/.cache/shell/ しておいて下さい。
# cdr, add-zsh-hook を有効にする
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
add-zsh-hook chpwd chpwd_recent_dirs

# cdr の設定
zstyle ':completion:*' recent-dirs-insert both
zstyle ':chpwd:*' recent-dirs-max 500
zstyle ':chpwd:*' recent-dirs-default true
zstyle ':chpwd:*' recent-dirs-file "$HOME/.cache/shell/chpwd-recent-dirs"
zstyle ':chpwd:*' recent-dirs-pushd true
設定については以下を参考にして下さい。
zsh: 26. User Contributions
zshでcdの履歴管理に標準添付のcdrを使う - @znz blog

使い方

確認
cdr -l
1 ~/.zsh
2 ~/.zsh/peco-scripts
3 ~/Documents/workspace
4 ~/dotfiles

開く
cdr 3

こんな感じですね。
これだけじゃイチイチ開く前に確認しないといけないので peco で選択したいですね。

function peco-cdr() {
    local selected_dir=$(cdr -l | awk '{ print $2 }' | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-cdr
2行目で何をしているか。
cdr -l
1 ~/.zsh
2 ~/.zsh/peco-scripts
3 ~/Documents/workspace
4 ~/dotfiles
↑を awk でディレクトリ名だけ抜き出して
cdr -l | awk '{ print $2 }'
~/.zsh
~/.zsh/peco-scripts
~/Documents/workspace
~/dotfiles
peco で選択して cd する。
シンプルなコマンドの組み合わせで凄く便利に!
これなら自分でも何か作れそうでワクワクします。

peco を導入した

コマンドラインの行選択ツール peco を導入しました。
peco - Simplistic Interactive Filtering Tool
どんなものかわからないと思うので上のリンクから Demo の gif 画像を見て下さい。
なんとなく便利そうな雰囲気がしますよね?

インストール

それではインストールしてみましょう。Mac では Homebrew で以下の通り。
brew tap peco/peco
brew install peco
それ以外の場合は上のリンクからインストール方法を確認して下さい。
Go で作られているのでインストールが簡単らしいです。

peco のカスタマイズ

peco はパイプでコマンドの出力を行選択して、パイプで次のコマンドに渡すコマンドラインツールなわけだけど
ある程度頻繁に使いそうなものについてはスクリプトファイルを書いておいたほうが便利ですね。
こういうものはどんどん拡張したくなるのでスクリプトファイルの保存場所を決めておきます。
~/.zshrc
~/.zsh/peco-scripts/ の読み込みやキーバインドの設定
~/.zsh/peco-scripts/
peco のスクリプトファイルの保存場所

# load peco scripts (require cdr)
for f (~/.zsh/peco-scripts/*) source "${f}"
% tree peco-scripts
peco-scripts
├── peco-cdr.zsh
└── peco-select-history.zsh

peco-cdr.zsh: 開いたディレクトリの履歴からディレクトリを選択する

[zsh]cdr: 開いたディレクトリの履歴からディレクトリを開く | DevAchieve
function peco-cdr() {
    local selected_dir=$(cdr -l | awk '{ print $2 }' | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-cdr
# 履歴から cd
bindkey '^@' peco-cdr

peco-select-history.zsh: コマンドの履歴からコマンドを選択する

function peco-select-history() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi
    BUFFER=$(history -n 1 | eval $tac | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    # zle clear-screen
}
zle -N peco-select-history
# 履歴からコマンド選択
bindkey '^r' peco-select-history

追記: 2014/12/10
コマンド履歴の重複を削除して peco で選択できるようにしました。
[peco]peco-select-history.zsh で表示されるコマンド履歴の重複を削除する - Qiita

まとめ

使ってみるとわかりますが、すごく便利です!

参考: pecoを使い始めた - $shibayu36->blog;
2014/05/08

sudoでリダイレクトをしたい

環境移行中なのですが、ログインシェルを zsh に変更したくなりました。
GitHub の README.md にコマンドを書いておいて
移行時に実行するだけにしたかったので
MacにHomeBrewとzshを導入してみた | DevAchieveの工程を
以下のように変更してみました。
echo '/usr/local/bin/zsh' >> /etc/shells
以下のように見事に拒否されます。
zsh: permission denied: /etc/shells
以下のように sudo を付けても同様に拒否されます。
sudo echo '/usr/local/bin/zsh' >> /etc/shells

shのオプションに-cを付ける

sudoでリダイレクトをしたいとき - Yuta.Kikuchiの日記
回避策1 : shのオプションに-cを付ける

man sudoを見てみます。そうすると以下のように実行せよという記述がありました。-cとして実行したいコマンドを""でくくるみたいです。
To make a usage listing of the directories in the /home partition.
Note that this runs the commands in a sub-shell to make the cd and file
redirection work.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
というわけで以下のように記述すると成功しました。
sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells"
chsh -s /usr/local/bin/zsh
活用事例:wada811/dotfiles#change-default-shell-to-zsh
2014/04/24

[Mac][zsh]時間のかかるコマンドが終わったら自動で通知する

巨大なプロジェクトの clone とか時間のかかるコマンドを実行したりすると
待ってるのが暇なので他のことをやり始めたりするんですが、
気がついたらコマンドが実行完了してて時間を浪費してしまうので
コマンドが終わったら自動で通知してくれるようにしました。

参考: Macで時間のかかるコマンドが終わったら、自動で通知するzsh設定 - Qiita

Requirements

Mac OS X 10.8 以上
Terminal.app または iTerm2.app

Terminal-notifier.app をインストールする

alloy/terminal-notifier

Download

Prebuilt binaries are available from the releases section.

Or if you want to use this from Ruby, you can install it through RubyGems:
[sudo] gem install terminal-notifier

You can also install it via Homebrew:
brew install terminal-notifier
HomeBrew で インストールしようと思ったらフォルダ構成が変わったのか 404 になってしまったので
Releases · alloy/terminal-notifier から緑のボタンの zip をダウンロードしました。
解凍して /Applications にDrag&Drop でインストール完了です。

zsh-notify をインストールする

marzocchi/zsh-notify を zip でダウンロードしてきて解凍して ~/.zsh/ とかに入れます。
以下のように ~/.zshrc に記述して zsh-notify を有効にします。
# add-zsh-hook を有効にする | zsh-notify を有効にする
autoload -Uz add-zsh-hook
source ~/.zsh/zsh-notify/notify.plugin.zsh
参考: zsh-notify x Growl - 人生いきあたりばったりで生きてます@はてな

zsh-notify をカスタマイズする

SYS_NOTIFIER に Terminal-notifier のパスを指定したり、
NOTIFY_COMMAND_COMPLETE_TIMEOUT(※)で閾値を変更したり、
通知のタイトルを変えたりしてみました。
(※実行時間がこの秒数を超えたコマンドが実行完了した際に Terminal がバックグラウンドだったら通知される)
# vim: set nowrap filetype=zsh:
#
# See README.md.
#
fpath=($fpath `dirname $0`)

SYS_NOTIFIER="/Applications/terminal-notifier.app/Contents/MacOS/terminal-notifier"
NOTIFY_COMMAND_COMPLETE_TIMEOUT=3

# Default timeout is 30 seconds.
[[ $NOTIFY_COMMAND_COMPLETE_TIMEOUT == "" ]]  \
  && NOTIFY_COMMAND_COMPLETE_TIMEOUT=30

# Notify an error with no regard to the time elapsed (but always only
# when the terminal is in background).
function notify-error {
  local icon
  icon="/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/AlertStopIcon.icns"
  notify-if-background -t "Failed!" --image "$icon" < /dev/stdin &!
}

# Notify of successful command termination, but only if it took at least
# 30 seconds (and if the terminal is in background).
function notify-success() {
  local now diff start_time last_command

  start_time=$1
  last_command="$2"
  now=`date "+%s"`

  ((diff = $now - $start_time ))
  if (( $diff > $NOTIFY_COMMAND_COMPLETE_TIMEOUT )); then
    notify-if-background -t "Success!" <<< "$last_command" &!
  fi
}

# Notify about the last command's success or failure.
function notify-command-complete() {
  last_status=$?
  if [[ $last_status -gt "0" ]]; then
    notify-error <<< $last_command
  elif [[ -n $start_time ]]; then
    notify-success "$start_time" "$last_command"
  fi
  unset last_command start_time last_status
}

function store-command-stats() {
  last_command=$1
  last_command_name=${1[(wr)^(*=*|sudo|ssh|-*)]}
  start_time=`date "+%s"`
}


autoload -U tell-terminal
autoload -U tell-iterm2
autoload -U notify-if-background
add-zsh-hook preexec store-command-stats
add-zsh-hook precmd notify-command-complete
こういうの読めばわかる気がしてくるので ShellScript 勉強しようって思います。
途中まで読んで積ん読になっている入門UNIXシェルプログラミングを読んで色々できるようになりたい。

変更を反映する

source ~/.zshrc
忘れずに。

通知をテストする

成功
sleep 31
実行時間が 30秒 (デフォルトの NOTIFY_COMMAND_COMPLETE_TIMEOUT の値)を超え、
バックグラウンドなら通知されます。
失敗
sleep 3 && ls nofile
実行時間が 30秒 (デフォルトの NOTIFY_COMMAND_COMPLETE_TIMEOUT の値)を超えなくても
失敗時は(バックグラウンドなら)通知されます。

大変便利です!
2013/06/03

[zsh]Gitのコマンドやブランチ名を補完できるようにする

zshでgitのコマンドやブランチ名を補完できるようにする - QNYP Blogを見て、
記事中の動画のブランチ名がターミナルに常に表示されているせいか
何故かブランチ名をターミナルに常に表示させる方法として記憶が刷り込まれて
設定完了するまで気が付かなかった @wada811 です。

とりあえず色々補完ができたら便利そうなので設定しました。
Mac に最初から Git 入っていたと思う(とりあえず HomeBrew でインストールした記憶はない)ので
補完定義ファイルをダウンロードして設定する方式で設定しました。

まずは ~/.zsh/completion/ に補完定義ファイルを入れるためのディレクトリを作成します。
mkdir -p ~/.zsh/completion/
次は以下の2つの補完定義ファイルをダウンロードしてきます。
cd ~/.zsh/completion/
curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.zsh
curl -Oでリモートファイルをローカルファイルに書き込み保存してくれるらしい。Output か。
git-completion.zsh を _git にリネームする。
mv git-completion.zsh _git
以下のような構造になっていれば良いらしい。
tree ~/.zsh/completion
/Users/wada/.zsh/completion
├── _git
└── git-completion.bash

0 directories, 2 files
と、tree とか出てきて、なにこれ便利!いいな!と思ったらbrew install treeで使えるようになります。
あとは、vi ~/.zshrcで以下のように記述してsource ~/.zshrcする。
fpath=(~/.zsh/completion $fpath)

autoload -U compinit
compinit -u
rm -f ~/.zcompdump; compinitもした方が良いらしい。

ブランチ名の補完が効くようになったので今度はブランチ名を常に表示させる設定をしたい。
2013/05/10

[zsh]Terminalでhistoryからのコマンド補完

Terminal で history からのコマンド補完ができるよ!
という記事を読んだので設定してみたが動かなかったので
漢のzsh から該当部分を見つけ出して設定した。
【コラム】漢のzsh (4) コマンド履歴の検索~EmacsとVi、どっちも設定できるぜzsh
漢のzsh 読まなきゃなぁ。

vi .zshrc で以下を記述して
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end
source .zshrc で設定を読み込んだら Ctrl + p で遡ったりできる。便利。
2013/03/23

HomeBrew を zsh で使えるようにする。ついでに hub コマンドも。

HomeBrew を zsh で使えるようにする

MacにHomeBrewとzshを導入してみた | DevAchieveでログインシェルを zsh に
変更したは良いけど brew コマンドが使えなくなっていた…。
よくわからないが zsh-completions をインストールすれば良いらしい。

とりあえずシェルを bash に変更する。
chsh -s /usr/local/bin/bash
HomeBrew で zsh-completions をインストールする。
brew install zsh-completions
.zshrc に以下の記述を追加する。
vi .zshrc
# zsh補完を有効化
fpath=(/usr/local/share/zsh-completions $fpath)
変更した .zshrc の設定を有効にする。
source .zshrc

ついでに hub コマンドも

むしろメインの目的だった hub コマンドを使えるようにする。
hub コマンドで GitHub がもっと便利になるらしい。
hub コマンドについては以下の記事がわかりやすい。
GitHubをさらに便利に使う、hubコマンドを活用しよう! | Act as Professional - hiroki.jp

とりあえず上記で HomeBrew を zsh で使えるようにしたので以下のコマンドでインストールする。
brew install hub
インストールできたか確認する。
hub --version
git version 1.7.9.6 (Apple Git-31.1)
hub version 1.10.2
こんな感じに出ればOK!

更についでに GitHub のリポジトリを作る

すでに Git で管理されていることが条件で、まだの場合は適当に作る。
mkdir Sample
cd Sample
git init
hub create
初回はID/PWを尋ねられるので答えたらリポジトリが作られる。
そうしてできたリポジトリこちら。wada811/Sample
以下のコマンドで GitHub のリポジトリのページを開けるのでリポジトリが作成されているか確認できる。
hub browse

おわり。
2013/01/12

ターミナルからSublime Text 2を起動するための設定

僕は zsh を使用しているので違うシェルの人は読み替えてください。
vi ~/.zshrc
alias st="/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl"
source ~/.zshrc

これで、あんまりないかもしれないけど
ターミナルからSublime Text 2で開きたい時のためにエイリアスの設定ができたので
st hoge.txtとか打てばSublime Text 2が起動して編集できる。
起動が軽快で素晴らしい。
2012/09/24

MacにMySQLを導入してみた

MySQL :: Download MySQL Community Serverから Mac OS X ver.~ DMG Archive をダウンロードする。
32bit / 64bit の判別方法はターミナルでgetconf LONG_BITを入力して返ってきた値らしい。
適当にパッケージっぽいもの開いてインストールしたら以下のコマンドを入力する。
sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
参考: MySQL :: MySQL 5.1 リファレンスマニュアル :: 2.5 Mac OS X に MySQL をインストールする

これで/usr/local/mysql/bin/mysqlと入力すれば mysql が使える。
しかし、こんなの毎回入力してたら死ねるので alias の設定をする。

僕は zsh を使っているので /Users/wada/.zshrc に alias mysql=/usr/local/mysql/bin/mysqlを記述した。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 2.5 Mac OS X に MySQL をインストールするによると
以下の2行を書いておくといいらしい。
alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin
.zshrc に記述したら設定を反映するためにsource /Users/wada/.zshrcと入力する。
参考: bash から zsh に乗り換えた【その仕事、蠍は留守です】

これでどこでもターミナル上で mysql と打つだけで MySQL が使えるようになる。
これでやっと SQL の勉強を始めることができそうだ。
2012/09/23

MacにHomeBrewとzshを導入してみた

Macのパッケージ管理ならHomeBrewでしょ、と誰かが言うのでインストールしてみた。
Homebrew — MacPorts driving you to drink? Try Homebrew!の最下部の
Install HomeBrew のコマンドをターミナルで入力すればインストールできるみたい。
よくわからず色々グチャグチャやってたら入ったからよくわからないけどたぶんそう。
たぶんコレ↓が役に立つと思う。
[Mac] Mountain Lionへパッケージ管理「Homebrew」をインストールする手順のメモ

zsh とは … なんかすげー便利なコマンドシェル、らしい。zsh - Wikipedia
zsh は インストールした HomeBrew を使えば
ターミナル上で以下のコマンドだけでインストールできる。
brew install zsh
このままではインストールしてもターミナルを起動するとデフォルトの bash が起動してしまうので
sudo vi /etc/shells/usr/local/bin/zshを追記する。
バージョン名付きのがあったらソッチのほうがいいかも。
chpass -s /usr/local/bin/zshでデフォルトを zsh に変更する。
chpassコマンドを入力してパスワードを入力したら変更が確認できる。
Shell:部分が /usr/local/bin/zsh になっているはず。
システム環境設定 > ユーザーとグループ から鍵を開いて編集できるようにして
ユーザー名の上で右クリックで詳細オプションをクリックし、開いた画面でログインシェルを変更しても良い。

使えるようになったかどうかの確認としてzsh --versionと入力してみるといいかも。
参考
Mac (Lion) にzshをインストール | CAPH TECH
MacのログインシェルをHomebrew等で入れたzshやbashに変更する方法 | Macとかの雑記帳

zsh の設定をするために一旦ターミナルを終了し、再起動する。
何やら色々聞かれるのでよくわからないまま設定するも良い。
とりあえず 0 をタイプして保存すると/Users/[ユーザー名]/.zshrcが生成されると思う。
巷で流れる .zshrc の設定はココに記述すれば良さそうだ。

タグ(RSS)