端末から出たくない人にオススメする超個人的な設定

今回は､端末(ターミナル)からなるべく出たくない人にオススメする設定の紹介です｡基本的に、Macで動作するツールを使って紹介しますが､WindowsやLinuxでも応用できる内容になっています｡

なお、設定後は､アプリやシェルを再起動する必要や設定ファイルを読み込み直す必要があったりしますので､その辺りは気をつけてください｡


##ファイルのプレビュー、画像の閲覧など
画像関連は、端末との相性は悪いです｡ここは、外部ツールと連携することにしましょう｡


Xを使っても良いのですが､通常のデスクトップには､それなりの画像を閲覧するソフトが入っている事が多いです。よって、それを使いましょう｡

ここでは、`qlmanage`というコマンドを使ってみます｡なお、インターフェイスは[zaw](https://github.com/zsh-users/zaw)を使用します｡

###zaw-open-file

```bash:
mkdir -p ~/dotfiles/.zsh/plugin/

cd !$

git clone git://github.com/zsh-users/zaw.git

echo "source ${PWD}/zaw/zaw.zsh" >> ~/.zshrc

source ~/.zshrc && exec $SHELL
```


ここで、`~/dotfiles/.zsh/plugin/zaw/sources/open-file.zsh`を少しだけ書き換えます｡

```bash:~/dotfiles/.zsh/plugin/zaw/sources/open-file.zsh
function zaw-callback-open-file() {
	# file_path, file_dir
	filep="${(q)1}"
	filed=`echo ${filep%/*}`
 
	# TODO: symlink to directory
	if [[ -d "$1" ]]; then
		zaw zaw-src-open-file "$1"
	else
		BUFFER="qlmanage -p ${(q)1} && cd $filed"
		# BUFFER="gnome-open ${(q)1}"
		# BUFFER="open ${(q)1}"
		# accept-line
		zle accept-line
	fi
}
```

選択したファイルが存在するディレクトリに移動するように設定｡選択後、コマンドが実行されるように設定。

あとは、便利なエイリアス、キーなどを設定してみましょう｡

```bash:~/.zshrc
# alias
alias p="qlmanage -p *"
 
# key
bindkey '^f' zaw-open-file
```
これで、 `C-f`を押して､プレビューするファイルを選択します｡


フォルダ内のファイル全部を閲覧したい場合は､いったん閉じて､ `p`コマンドです｡


ちなみに、プレビューできるファイルは、画像に限らずあらゆる拡張子に対応しています｡また、対応拡張子を増やすこともできますし、プレビュー形式を変更することもできます。

[Command Line で使用しているツールまとめ vol.6](http://qiita.com/PSP_T/items/0a053f376bd57603e794)

###コマンドの編集

補完されたディレクトリを編集しやすいようにするには､以下の設定がオススメです｡

```bash:~/.zshrc
# ディレクトリごとに区切る
# http://mollifier.hatenablog.com/entry/20081214/1229229752
autoload -Uz select-word-style
select-word-style default
zstyle ':zle:*' word-chars " /=;@:{},|"
zstyle ':zle:*' word-style unspecified
```

これで、 `^w`を押すと､ディレクトリ1つを削除することが出来ます｡

###auto-fu.zshの特殊事情

なお、 [auto-fu.zsh](https://github.com/hchbaw/auto-fu.zsh)を使っている方は､以下の様なエラーが出ます。

```Error
Cannot rebind backward-kill-word: user:backward-kill-word-match
Cannot rebind kill-word: user:kill-word-match
```

よって、以下のようにして `thb` か `pu` ブランチに切り替えてください。

```bash:
cd /path/to/auto-fu.zsh
 
git checkout -b pu origin/pu

exec $SHELL
```
ちなみに、`auto-fu.zsh`を使っている方は､「-azfu-」を表示させないようにすることもできます。私は､設定していませんが...。

```bash:~/.zshrc
# 「-azfu-」を表示させない
zstyle ':auto-fu:var' postdisplay $''
```

`auto-fu.zsh`は、基本キーバインドが`Emacs`になってるところが使いやすいんですよね｡設定ファイルで`vi`にしていると、手軽に使えるキーが増えます｡

ここで、プラグインを併用して使う場合は､`auto-fu.zsh`をキャンセルするキーを設定しておくとよいです。

##アプリケーションの実行

###zaw-applications
基本的には､ `open -a`で起動できますが､面倒なので､キーで選択､起動できるようにしています。

[https://github.com/zsh-users/zaw/blob/master/sources/applications.zsh](https://github.com/zsh-users/zaw/blob/master/sources/applications.zsh)

```bash:~/.zshrc
bindkey '^a' zaw-applications
```

これで、 `C-a`を押すと､アプリを選択できると同時に､起動しやすくなります｡

###open -a
また、以下の方法でも良いと思います｡個人的には､こちらを使用することのほうが多いです｡

```bash:~/.zshrc
function openapp() {
	BUFFER="open -a "
	CURSOR=$#BUFFER
}
zle -N openapp
bindkey '^o' openapp
```

後は､ `C-o`を押した後､`Tab`若しくは､起動したいアプリのアルファベットでも入力して､補完できます(そのための設定をしている人限定ですが…詳しくは[こちら](http://qiita.com/PSP_T/items/ed2d36698a5cc314557d))



どちらを利用するかは､お好みで。

##ディレクトリ移動

よく移動するディレクトリの補完とフィルタにより、ディレクトリ移動を簡単にします｡

###percol-cdr

```bash:
sudo pip install percol
 
# 以下は必要ありません
brew install cmigemo
 
curl -O http://www.atzm.org/etc/files/pymigemo/pymigemo-0.4.tar.gz
 
sudo pip install pymigemo-0.4.tar.gz
```

[percol 入れて zsh と組み合わせたら超便利](https://gist.github.com/mitukiii/4234173)

```bash:~/.zshrc
# cdr {{{
# http://qiita.com/yoshikaw/items/c5f44ad6dcae059ea34c
autoload -Uz compinit && compinit

zstyle ':completion:*' menu select
zstyle ':completion:*:cd:*' ignore-parents parent pwd
zstyle ':completion:*:descriptions' format '%BCompleting%b %U%d%u'

typeset -ga chpwd_functions

if is-at-least 4.3.11; then
  autoload -U chpwd_recent_dirs cdr
  chpwd_functions+=chpwd_recent_dirs
  zstyle ":chpwd:*" recent-dirs-max 500
  zstyle ":chpwd:*" recent-dirs-default true
  zstyle ":completion:*" recent-dirs-insert always
fi
 
## zaw-cdr
## http://shibayu36.hatenablog.com/entry/20120130/1327937835
##autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
##add-zsh-hook chpwd chpwd_recent_dirs
##zstyle ':chpwd:*' recent-dirs-max 5000
##zstyle ':chpwd:*' recent-dirs-default yes
##zstyle ':completion:*' recent-dirs-insert both
 
## http://yagays.github.io/blog/2013/05/20/zaw-zsh/
##zstyle ':filter-select' case-insensitive yes # 絞り込みをcase-insensitiveに
##bindkey '^g' zaw-dir # zaw-cdrをbindkey
 
## percol-cdr
## http://piyopiyoducky.net/blog/2013/08/17/cdr-with-percol/
### search a destination from cdr list
function percol-get-destination-from-cdr() {
	cdr -l | \
	sed -e 's/^[[:digit:]]*[[:blank:]]*//' | \
	percol --match-method migemo --query "$LBUFFER"
}
 
### search a destination from cdr list and cd the destination
function percol-cdr() {
	local destination="$(percol-get-destination-from-cdr)"
	if [ -n "$destination" ]; then
		BUFFER="cd $destination"
		zle accept-line
	else
		zle reset-prompt
	fi
}
zle -N percol-cdr
bindkey '^g' percol-cdr
 
# }}}
```

[auto-jump](https://github.com/joelthelion/autojump)や [z](https://github.com/rupa/z) も便利ですので､そちらを使っても構いません｡

```bash:~/.zshrc
#dir {{{
## autojump
## http://ihiroky.hatenablog.com/entry/2013/01/22/114130
export FPATH="$FPATH:/opt/local/share/zsh/site-functions/"
	if [ -f /opt/local/etc/profile.d/autojump.sh ]; then
		. /opt/local/etc/profile.d/autojump.sh
	fi
 
## z
## http://qiita.com/ikm/items/0e498981c6b19ac8d19b
. /usr/local/etc/profile.d/z.sh
function _Z_precmd {
	z --add "$(pwd -P)" 61 }
	precmd_functions=($precmd_functions _Z_precmd)
# }}}
```

インデント消えてます｡対応するのは無理っぽいです｡

##クリップボード履歴

クリップボード履歴を利用するには､[ClipMenu](http://www.clipmenu.com/ja/)というアプリを使います｡インターフェイスは､先ほど入れた`percol`を利用します｡


```bash:~/.zshrc
# clipboard
## clipmenu
## http://qiita.com/dai___chi/items/b71fe99339bdbe5b5347
function searchClipBoard() {
    clipMenuPath='$HOME/Library/Application Support/ClipMenu'
plutil -convert xml1 $HOME/Library/Application\ Support/ClipMenu/clips.data -o - |\
        awk '/<string>/,/<\/string>/' |\
 
        # 15行目から最終行まで抜き出す
        sed -n '15, $p' |\
 
        sed -e 's/<string>//g' -e 's/<\/string>//g' -e 's/&lt;/</g' -e 's/&gt;/>/g' |\

        # head -5020 |tail -5000 |\
        sed '/^$/d'|cat -n |sort -k 2|uniq -f1 |sort -k 1 |\
        sed -e 's/^ *[0-9]*//g' |\
        awk '{for(i=1;i<NF;i++){printf("%s%s",$i,OFS=" ")}print $NF}' |\
 
        # ナンバリングの追加
        nl -b t -n ln |percol |sed -e "s/\ /\\\ /g" |\
 
        # ナンバリングの削除
        sed -e 's/\\ / /g' |cut -c 8- |ruby -pe 'chomp' |pbcopy
    zle reset-prompt
};
zle -N searchClipBoard
 
# C-pでクリップボード履歴の検索
bindkey '^p' searchClipBoard
```

これで、`C-p`を押すと､クリップボード履歴を利用できます｡


###ClipMenuの設定
適時使用しやすいように設定しておいてください。


##通知
通知には､[Growl](http://growl.info/)を使います。

###コマンド終了を通知する

`zsh`のコマンド終了を`Growl`で通知する方法です。経過時間は `3秒`、メッセージは `done!!`にしました。

まずは、[GrowlNotify](http://growl.info/downloads#generaldownloads)をインストールして､`growlnotify`コマンドが使えるようにします。

次に､このツールと連携する設定を書いたファイルをダウンロードし､適用します｡

```bash:
mkdir -p ~/dotfiles/.zsh/tool/
 
cd !$
 
curl -O http://growl.cachefly.net/GrowlNotify-2.1.zip
 
aunpack GrowlNotify-2.1.zip
 
open GrowlNotify.pkg
 
curl -O https://gist.github.com/syui/7112389/raw/growl.zsh
 
cat growl.zsh
 
echo "source $PWD/growl.zsh" >> ~/.zshrc
 
source ~/.zshrc && exec $SHELL
```

では、試してみましょう。

```bash:
sleep 4
```


###Growlの設定

すべての通知を閉じるショートカットを設定しておきましょう｡なお、通知は､常に画面にとどまるように設定しておくと良いです｡


では、先ほど設定したショートカットを試してみましょう｡

```bash:
sudo port install watch
 
watch -n 1 'growlnotify -m mba-hack' | sleep 6
```



ここで、 ショートカットを押します｡通知が消えました｡


スタイルはどれがいいんでしょうか｡あまりプレビューしてないので、分かりませんが､オススメのあったら教えて下さい｡

なお、`OS X Mavericks`を使っている方は､`MacPorts`が動かないと思います｡その場合は､以下の記事を参考にしてください｡


[http://mba-hack.blogspot.jp/2013/10/os-x-mavericksmacports.html](http://mba-hack.blogspot.jp/2013/10/os-x-mavericksmacports.html)

###Twitter
公式Twitterのアプリがなかなかいい感じに通知するようになっているみたいです｡通知のために起動しておくのもいいかもしれません。



クライアントは、[earthquake](https://github.com/jugyo/earthquake)が便利です｡


インストールには､`bundle install`を使いましょう｡


## Google 翻訳を端末から行う

```bash:~/.zshrc
# google_translate [-j, -e]
# $ google_translate -e power line
function google_translate() {
  local str opt arg
 
    str=`pbpaste` # clipboard
    arg=`echo ${@:2} | sed -e 's/  */+/g'` # argument
    en_jp="?hl=ja&sl=en&tl=ja&ie=UTF-8&oe=UTF-8" # url
 
    case "$1" in
        "-j") opt="?hl=ja&sl=ja&tl=en&ie=UTF-8&oe=UTF-8&text=${arg}";; # jp -> en translate
        "-e") opt="${en_jp}&text=${arg}";; # en -> jp translate
        *) opt="${en_jp}&text=${str}";; # en -> jp translate
    esac
 
  w3m +20 "http://translate.google.com/${opt}"  # goto 20 line
}
```

###クリップボードにある英語を日本語に翻訳

```bash:
# クリップボードに英語が入っていることの確認
$ pbpaste

# 翻訳
$ google_translate
```

###英語を日本語に翻訳

```bash:
$ google_translate -e power line for vim
```

###日本語を英語に翻訳

```bash:
$ google_translate -j 日本人は英語ができますか。 いいえ、翻訳機がないと無理です｡
```

[http://mba-hack.blogspot.jp/2013/10/google.html](http://mba-hack.blogspot.jp/2013/10/google.html)


###tmuxでスクロールしたり、コピーしたりする方法

例えば､`w3m`からコピーをしてもいいですが、`tmux`のコピー機能も結構使える場合があります｡

`tmux`でのスクロールするには､ `C-b`、 `Fn+↑↓`を押します｡

そして、`tmux`での通常のコピー手順は以下のようになります｡

`C-b, [`...コピーモードの開始
`hjki`...カーソル移動
`Space`...コピーの始点
`Enter`...コピーの終点
`C-b, ]`...貼り付け

しかし、いくつかの設定をすることで､コピーが簡略化され､入力するキーも減らすことが出来ます｡

```bash:~/.tmux.conf
# コピーモード時のキーバインディング
set-window-option -g mode-keys vi
 
# 1行コピー
bind-key -t vi-copy Y copy-line
 
# viコピーモードのキーバインド表示
bind / list-keys -t vi-copy
 
# Enterでクリップボードに
# http://qiita.com/kkabetani/items/e37ac1e4e0b53c418a35
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
```

[http://mba-hack.blogspot.jp/2013/10/tmux.html](http://mba-hack.blogspot.jp/2013/10/tmux.html)


##参考
過去に書いた記事と関連する部分も多いので､もしよろしければどうぞ｡

###コマンドライン

[Command Line で使用しているツールまとめ vol.1](http://qiita.com/items/10a9086de309cef5e185)

[Command Line で使用しているツールまとめ vol.2](http://qiita.com/items/8fab37433f8b9606f75c)

[Command Line で使用しているツールまとめ vol.3](http://qiita.com/items/bd319bdaffb403d5e605)

[Command Line で使用しているツールまとめ vol.4](http://qiita.com/items/e0870756171c0f72ff63)

[Command Line で使用しているツールまとめ vol.5](http://qiita.com/items/80c95f442d6c5c639bc1)

[Command Line で使用しているツールまとめ vol.6](http://qiita.com/items/0a053f376bd57603e794)

[Command Line で使用しているツールまとめ vol.7](http://qiita.com/PSP_T/items/6bf7e65d6a0437954514)

[コマンドラインで使用しているTips](http://qiita.com/PSP_T/items/5fb952ae0bdbd50d9ed7)

###Windows

[Windowsのターミナル環境を整える vol.1](http://qiita.com/items/2c51a33a3ca82999bea2)

[Windowsのターミナル環境を整える vol.2](http://qiita.com/PSP_T/items/22250a9aca4c0b7cee12)


###Zsh

[zshでの移動をとにかく楽にする](http://qiita.com/PSP_T/items/0678178be19ea99c33f7)

[zshの補完を強化するTips](http://qiita.com/PSP_T/items/ed2d36698a5cc314557d)

[zshのhistoryを便利に使うためのTips](http://qiita.com/PSP_T/items/c1a1567b2b76051f50c4)


###Mac
[Macの初期設定に便利なコマンドとツール](http://qiita.com/PSP_T/items/87d7d5d6bf4d71bc40e5)