Command Line で使用しているツールまとめ vol.3


#はじめに
`Command Line`(コマンドライン)で使用している`Tool`(ツール)を簡単にではありますが､まとめてみようと思います｡前回の続きです｡私が知らない便利ツールはまだまだたくさんありますので､ここに掲載されているもの以外で便利なものがあれば､ぜひ教えてください｡

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

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




この記事に貼り付けてあるリンクは､キーワードに関連する適切な場所へと誘導してくれます｡非常に有効なので､ぜひ参照してみてください｡

また､私は基本的にパソコンのことは何もわかっていないので､記事内には誤りを含む可能性があります｡よって､できる限り自分の環境を把握した上で､適時読み換えてもらえればと思います｡特に､設定ファイルの場所については気をつけてください｡また､`Git`や`Homebrew`､`MacPort`の導入説明などは省略していますので､注意が必要です｡

#zsh
##zshのPromptをカスタマイズする
###環境説明
`Prompt`(プロンプト)とは､いわゆる外観のことです｡`Terminal`(ターミナル)の外観をカスタマイズするには､`Terminal`そのものの設定や`Shell`(シェル)､`Virtual`(バーチャル)､`Editor`(エディタ)の設定ファイルに書くことで､実現できます｡ここで､それぞれについて私が使用している`Tool`を明示して､`zshのPromptをカスタマイズする`の説明に移りたいと思います｡

```ruby:私が使用している主要アプリ
OS ='Mac'

Terminal = 'iTerm2'

Shell = 'zsh'

Editor = 'Vim'

Virtual = 'tmux'
```

###Prompt
`zsh`のPromptの設定については､[clear-code/zsh.d](https://github.com/clear-code/zsh.d/)がとても参考になります｡設定ファイルに日本語で設定方法が詳しく書き込んであるからです｡




###Setting File

```shell:~/.zshrc
### PROMPT# {{{
# https://github.com/clear-code/zsh.d/
setopt prompt_subst
setopt prompt_percent
setopt transient_rprompt

color256()
{
    local red=$1; shift
    local green=$2; shift
    local blue=$3; shift

    echo -n $[$red * 36 + $green * 6 + $blue + 16]
}

fg256()
{
    echo -n $'\e[38;5;'$(color256 "$@")"m"
}

bg256()
{
    echo -n $'\e[48;5;'$(color256 "$@")"m"
}

zstyle ':vcs_info:*' max-exports 3
zstyle ':vcs_info:hg:*' get-revision true # hg で check-for-changes を有効にするには
zstyle ':vcs_info:hg:*' use-simple true  # この2つの設定が必要

autoload -Uz is-at-least
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "⚡" # 適当な文字列に変更する
zstyle ':vcs_info:git:*' unstagedstr "±" # 適当の文字列に変更する

# Gitブランチ名や作業状態を表示する
zstyle ':vcs_info:git:*' formats '%K{green}%F{black}⮀%k%f%{%F{white}%K{green}%}  %s  %{%k%f%}%K{blue}%F{green}⮀%k%f%{%F{white}%K{blue}%}  %b  %{%k%f%}%K{black}%F{blue}⮀%k%f%{%F{white}%K{black}%} %c%u %{%k%f%}'


autoload -Uz vcs_info
# プロンプトの左
prompt_bar_left_self="%{%F{white}%K{blue}%}  %n%{%k%f%}%{%F{white}%K{blue}%}@%{%k%f%}%{%F{white}%K{blue}%}%m %{%k%f%}%{%B%F{blue}%K{blue}%}%{%b%f%k%}%K{cyan}%F{blue}⮀%k%f%{%B%F{white}%K{cyan}%}  [%~]  %{%k%f%b%}%{%k%f%}%K{red}%F{cyan}⮀%k%f%(?.%F{white}%K{red}%}  COMP  %k%f.%B%K{red}%F{red}%}  ERROR  %b%k%f)%{%K{green}%F{red}⮀%k%f%F{white}%K{green}%}  -%h  %{%k%f%}%K{green}%F{white}⮂%k%f"


prompt_bar_left="${prompt_bar_left_self} ${prompt_bar_left_status} ${prompt_bar_left_date}"
# プロンプトの左下
prompt_left='%{%F{white}%K{black}%}  $SHELL  %{%k%f%}%{%K{white}%F{black}⮀%k%f%B%F{black}%K{white}%} %# %{%b%k%f%f%}%K{black}%F{white}⮀%k%f >  '

count_prompt_characters()
{
    print -n -P -- "$1" | sed -e $'s/\e\[[0-9;]*m//g' | wc -m | sed -e 's/ //g'
}

update_prompt()
{
    local bar_left_length=$(count_prompt_characters "$prompt_bar_left")
    local bar_rest_length=$[COLUMNS - bar_left_length]

    local bar_left="$prompt_bar_left"
    local bar_right_without_path="${prompt_bar_right:s/%d//}"
    local bar_right_without_path_length=$(count_prompt_characters "$bar_right_without_path")
    local max_path_length=$[bar_rest_length - bar_right_without_path_length]
    bar_right=${prompt_bar_right:s/%d/%(C,%${max_path_length}<...<%d%<<,)/}
    bar_right="%${bar_rest_length}<<${separator}${bar_right}%<<"

    PROMPT="${bar_left}${bar_right}"$'\n'"${prompt_left}"

    # プロンプトの右下
    RPROMPT="%K{white}%F{black}⮀%k%f%{%F{black}%K{white}%} %l  %K{black}%F{white}⮀%k%f%{%k%f%}%{%F{white}%K{black}%}  $LANG  %{%k%f%}%K{black}%F{white}⮂%k%f"
    case "$TERM_PROGRAM" in
        Apple_Terminal)

            RPROMPT="${RPROMPT}"
            ;;
    esac

    LANG=C vcs_info >&/dev/null
    if [ -n "$vcs_info_msg_0_" ]; then
        RPROMPT="${vcs_info_msg_0_}${RPROMPT}"
    fi
}

precmd_functions=($precmd_functions update_prompt)
# }}}
```

###tmuxの自動起動
私は`tmux`を起動することが多いので､Terminal Appを起動すると同時に､`tmux`を自動的に起動するようにしています｡

```~/.zshrc
## tmux自動起動
# http://d.hatena.ne.jp/tyru/20100828/run_tmux_or_screen_at_shell_startup
is_screen_running() {
    # tscreen also uses this varariable.
    [ ! -z "$WINDOW" ]
}
is_tmux_runnning() {
    [ ! -z "$TMUX" ]
}
is_screen_or_tmux_running() {
    is_screen_running || is_tmux_runnning
}
shell_has_started_interactively() {
    [ ! -z "$PS1" ]
}
resolve_alias() {
    cmd="$1"
    while \
        whence "$cmd" >/dev/null 2>/dev/null \
        && [ "$(whence "$cmd")" != "$cmd" ]
    do
        cmd=$(whence "$cmd")
    done
    echo "$cmd"
}


if ! is_screen_or_tmux_running && shell_has_started_interactively; then
    for cmd in tmux tscreen screen; do
        if whence $cmd >/dev/null 2>/dev/null; then
            $(resolve_alias "$cmd")
            break
        fi
    done
fi
```


#tmux
##tmuxのPromptをカスタマイズする
###tmux-powerline
[tmux-powerline](https://github.com/jedipunkz/tmux-powerline)というものを使うことで､`tmux`のPromptは簡単にカスタマイズできます｡



```
mkdir ~/dotfiles/ && cd ~/dotfiles/

git clone https://github.com/jedipunkz/tmux-powerline.git

sudo port install bash
```

```~/.tmux.conf
### tmux-prompt# {{{
# https://github.com/jedipunkz/tmux-powerline
# http://d.hatena.ne.jp/yonchu/20120414/1334422075
# tmux-powerline
set-option -g status on
set-option -g status-interval 2
set-option -g status-utf8 on
# set-option -g status-justify "centre"
set-option -g status-left-length 80
set-option -g status-right-length 90
set-option -g status-left "#(~/dotfiles/tmux-powerline/status-left.sh)#[bg=red]#[fg=black]⮀#[bg=red]#[fg=white]  mem #(used-mem) %% #[bg=black]#[fg=red]⮀"
set-option -g status-right "#(~/dotfiles/tmux-powerline/status-right.sh)"

# 文字色と背景色
set -g status-fg white
set -g status-bg black

# 256色ターミナル
set-option -g default-terminal "screen-256color"

# P-rで再起動
bind r source-file ~/.tmux.conf; display-message "Reload Config!!"
# }}}
```

ただし､上では､`used-mem`というシェルスクリプトを使って､メモリの使用率を表示するようにしてます｡これは､[よんちゅBlog版プロンプト](http://d.hatena.ne.jp/yonchu/20120414/1334422075)のものを使用します｡

また､`tmux-powerline/status-left.sh`と`tmux-powerline/status-right.sh`も多少カスタマイズしています｡これらのファイルを編集することで､容易に独自のカスタマイズが反映されるようになっています｡

カスタマイズ方法は以下のようになります｡自分がカスタマイズしたものを表示してもいいのですが､途中で切れそうで怖い(投稿制限のため)｡

```~/dotfiles/tmux-powerline/status-right.sh
# カスタマイズの一例
declare -A uptime 
uptime+=(["script"]="${segments_path}/uptime.sh") # tmux-powerline/segments/ にあるスクリプトを指定します｡ `uptime.sh`
uptime+=(["foreground"]="colour255") # フォントカラーを指定します｡ `colour255`
uptime+=(["background"]="colour37") # バックグラウンドカラーを指定します｡ `colour37`
uptime+=(["separator"]="${separator_right_thin}") # 表示する矢印パターンを指定します｡ `separator_right_thin`
register_segment "uptime" # ここをコメントアウトすると､無効にできます｡
```

天気は､`Google`がAPIを変更したようで､`Error`(エラー)が出ます｡また､ここで紹介している`tmux-powerline`は無線接続をする`MacBookAir`などの`LAN IP Address`(ローカルIPアドレス)を取得するように原作者以外の方が改善されたものを使っています｡

#Vim
##VimにPowerlineを入れる
`Vim` `Plugin`(プラグイン)には､[Powerline](https://github.com/Lokaltog/vim-powerline)というものがあり､このPluginを導入することで､`Vim`のステータスラインがとてもカッコよくなります｡

```
git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

vim ~/.vim/bundle/vundle/test/minirc.vim
```

```~/.vim/bundle/vundle/test/minirc.vim
set nocompatible
syntax on
filetype off
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
Bundle 'gmarik/vundle'

" ステータスラインをカッコよくする
Bundle 'Lokaltog/vim-powerline'

filetype plugin indent on
```

あとは､`:BundleInstall`とすれば､Pluginがインストールされます｡なお､プラグインのアップデートは､以下の様にして`alias`(エイリアス)を設定しておくと便利です｡

```
echo "alias bi!='vim +BundleInstall! +qall'" >> ~/.zshrc && exec $SHELL
```

#iTerm2
##iTerm2によるPromptの微調整
上で紹介したPromptの表示には､`iTerm2`などのTerminalにより微調整が必要になってくる場合があります｡

また､`fillchars`によりフォントにパッチを当てる必要も出てきます｡

```shell:
sudo port install fontforge

fontforge -script /path/to/fontpatcher MyFontFile.ttf
```

##使用しているフォント
私は､[Ricty](http://save.sys.t.u-tokyo.ac.jp/~yusa/fonts/ricty.html)というフォントを使用しています｡

```
git clone https://github.com/yascentur/Ricty.git
 
cd Ricty
 
brew install fontforge
 
wget http://levien.com/type/myfonts/Inconsolata.otf
 
w3m http://mix-mplus-ipa.sourceforge.jp/download.html
('Migu 1M'をダウンロードします｡)
 
unzip migu-1m-20120411-2.zip
 
sh ricty_generator.sh Inconsolata.otf migu-1m-regular.ttf migu-1m-bold.ttf
 
cp -f Ricty*.ttf ~/Library/fonts
```

#Blogger
私は､`Blogger`というGoogleのブログサービスでブログをやっています｡そこで､いろいろな操作を自動化しているのですが､参考までに設定しているエイリアスなどを紹介できたらと思います｡

## ドットインストールのレッスンを開始する
`ドットインストール`とは､プログラミングが動画で学習できるサイトのことです｡ブログをやるには､`HTML`や`CSS`の知識が必要らしいので､まずは､それらをドットインストールで学習してみようかなと思いました｡動画は`YouTube`にアップロードされているので､ファイルとしてローカルに保存したほうが何かと扱いやすい思いましたので､この度､ローカルなレッスン環境を整えてみることにしました｡

```
sudo port install youtube-dl wget mplayer

mkdir -p ~/Movies/dt/ && cd ~/Movies/dt/ && wget -r http://dotinstall.com/lessons
```

```shell:~/Movies/dt/lesson-dl
#!/bin/zsh
until cd ~/Movies/dt/dotinstall.com/lessons/"$1" && touch test.mp4 test.part && rm *.mp4 *.part && cat [0-9]* [0-9]* > filename.txt && grep videoId filename.txt > videoid.txt && sed "s|videoId: '|http://jp.youtube.com/watch?v=|" videoid.txt > url.txt && sed "s/',//g" url.txt > url2.txt && youtube-dl -A -t -a url2.txt && mkdir -p ~/Movies/dt/"$1" && mv *.mp4 ~/Movies/dt/"$1" && cd ~/Movies/dt/"$1" && find `pwd` -maxdepth 1 -mindepth 1 | grep -v "\/\." > mylist && mplayer -playlist mylist -x 680 -y 360 -geometry +1+40

do
    echo "ダウンロードが失敗しました｡もう一度ダウンロードします｡終了する場合は､Ctrl+Cを押してください｡"

done
```


```~/.zshrc
## ドットインストールで学習する
# help:lessonコマンドで学習したいレッスンを選び､クリップボードにコピーします｡Vimを閉じると､選択したレッスンがダウンロードされます｡
# 開始したいレッスンを表示する
alias lesson-ls='cd ~/Movies/dt/ && vim lesson.txt'

# 開始したいレッスンをダウンロードする
alias lesson-dl='~/Movies/dt/lesson-dl'

# レッスンを選択し､ダウンロード､再生する
alias lesson='lesson-ls && pbpaste | xargs ./lesson-dl'
```


##Bloggerでブログを始めよう
ファイルを作成したり､記事をポストしたり､画像をアップロードする作業は､定型的な作業ですので､自動で行うのが望ましいですね｡以下､Bloggerでブログをやる際に便利な`alias`(エイリアス)やToolを紹介していきたいと思います｡

```
sudo port install googlecl imagemagick exiftool wkhtmltoimage
```

```~/.zshrc
## Blogger
# Picasaに画像をアップロードする
# help:まずは､アップロードする画像を圧縮しています｡次に､EXIF情報を削除し､アップロードを実行します｡その後､画像があるURLを一覧で表示します｡なお､アップロード後は画像を削除するように設定していますので注意が必要です｡
alias picasa='cd ~/Pictures/picasa/ && mogrify -quality 75 *.png && exiftool -overwrite_original -all= ~/Pictures/picasa && touch ~/Pictures/picasa/test.html && rm ~/Pictures/picasa/*.html && google picasa post -n "picasa" ~/Pictures/picasa/*.png && rm ~/Pictures/picasa/*.png && google picasa list -n "picasa" --delimiter " " > ~/Pictures/picasa/img_link.html && vim -c "e ~/Pictures/picasa/img_link.html" +/http'

# YouTubeに動画をアップロードする
# help:"~/Movies/youtube/"にある.mp4をYouTubeにUpladeします｡その後､動画があるURLを一覧で表示します｡なお､アップロード後は動画を削除するように設定していますので注意が必要です｡
alias youtube_post='touch ~/Movies/youtube/test.html && rm ~/Movies/youtube/*.html && google youtube post --category People ~/Movies/youtube/*.mp4 && rm ~/Movies/youtube/*.mp4 && google youtube list --delimiter " " > ~/Movies/youtube/url.html && vim ~/Movies/youtube/url.html'

# アイキャッチ画像を取得する
# help:アイキャッチ画像を簡単に使えるようにしています｡
# おすすめのアイキャッチ画像を紹介したページをダウンロードして表示する
alias blogicat='cd ~/blog/ && touch blogicat.test && rm blogicat* && curl -o blogicat.html http://mba-hack.blogspot.jp/2012/08/blogicat.html && wkhtmltoimage http://mba-hack.blogspot.jp/2012/08/blogicat.html blogicat.jpg'
# ダウンロードしたページを検索する
alias blogicat1='cd ~/blog/ && display blogicat.jpg & vim blogicat.html'

# 記事を書いて､Bloggerにポストする
# help:記事を書いて､それを保存し､｢タイトル タグ｣をクリップボードに保存して終了すれば､自動でBloggerにポストしてくれます｡なお､個人的な事情によりまずは使用したいアイキャッチ画像を選択するようにしています｡アイキャッチ画像を使用したい人は､`blogicat &&'を外してください｡
alias blogger='blogicat1 && cd ~/blog/ && touch blogpost.test.html && rm blogpost* && vim blogpost.html && pbpaste | xargs ./blogger'
```

Bloggerにポストする`blogger`コマンドを使いたい場合は､以下のシェルスクリプトを作成し､指定の場所に置いてください｡

```
mkdir ~/blog/ && cd ~/blog/ && vim blogger

chmod +x blogger

```

```blogger
#!/bin/zsh
google blogger post --blog "ブログタイトル" --title "$1"  --tags "$2" ~/blog/blogpost.html && google blogger --blog "ブログタイトル" list --delimiter " " > ~/blog/mba_hack_list.html && vim -c "e ~/blog/mba_hack_list.html" +/http && rm ~/blog/mba_hack_list.html
```


なお､URLを開くには､`Vim Plugin`があると便利です｡これでURL上で`gx`を押せば､当該URLがブラウザで開きます｡

```~/.vim/bundle/vundle/test/minirc.vim
Bundle 'tyru/open-browser.vim'
```

```~/.vimrc
" gx を押してカーソル下のURLを開くようにする
" http://vim-users.jp/2011/08/hack225/
let g:netrw_nogx = 1 " disable netrw's gx mapping.
nmap gx <Plug>(openbrowser-smart-search)
vmap gx <Plug>(openbrowser-smart-search)
```

##HTMLなどの編集に便利なvimrcの設定例

```~/.vimrc

" ### プラグイン bundle"{{{
filetype off
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()

" プラグイン管理
Bundle 'gmarik/vundle'
"Bundle 'Shougo/neobundle.vim'

Bundle 'YankRing.vim'
Bundle 'Shougo/neocomplcache'
Bundle 'Shougo/neocomplcache-snippets-complete'
Bundle 'Smooth-Scroll'
Bundle 'smartword'
Bundle 'thinca/vim-quickrun'
Bundle 'tpope/vim-markdown'
Bundle 'Shougo/unite.vim'
Bundle 'mrtazz/simplenote.vim'
Bundle 'yuratomo/w3m.vim'
Bundle 'Shougo/vimfiler'
Bundle 'mattn/zencoding-vim'
Bundle 'mattn/excitetranslate-vim'

filetype plugin indent on"}}}

"### プラグイン設定 plugin"{{{1
"## str2htmlentity.vim "{{{2
"" 範囲指定し sx でHTMLの特殊文字を変換する
" http://www.serendip.ws/resource/str2htmlentity.vim
vmap <silent> sx :Str2HtmlEntity<cr>
vmap <silent> sr :Entity2HtmlString<cr>

"}}}
"}}}

"### 基本設定 setting"{{{
" :CopyCmdOutput でコマンド欄をクリップボードへコピー
" http://d.hatena.ne.jp/hide04/20111223/1324621495
func! s:func_copy_cmd_output(cmd)
  redir @*>
  silent execute a:cmd
  redir END
endfunc
command! -nargs=1 -complete=command CopyCmdOutput call 
<SID>func_copy_cmd_output(<q-args>)

" F5 でHTMLのプレビュー for Safari
" http://vim.wikia.com/wiki/Preview_current_HTML_file
nnoremap <F5> :!open -a Safari %<CR><CR>

" foldmethod の折りたたみ
set foldmethod=marker

" カッコ内に自動的に移動すし､カッコを補完すし､カッコを範囲指定する｡
" http://d.hatena.ne.jp/spiritloose/20061113/1163401194
inoremap { {}<LEFT>
inoremap [ []<LEFT>
inoremap ( ()<LEFT>
inoremap " ""<LEFT>
inoremap ' ''<LEFT>
vnoremap { "zdi^V{<C-R>z}<ESC>
vnoremap [ "zdi^V[<C-R>z]<ESC>
vnoremap ( "zdi^V(<C-R>z)<ESC>
vnoremap " "zdi^V"<C-R>z^V"<ESC>
vnoremap ' "zdi'<C-R>z'<ESC>

"}}}
```

#最後に
投稿の上限がきそうなので､今回はココら辺で｡最後に､今回は､主に､ブログに関連する内容になったので､ブログをやっている人は､以下の企画にぜひ参加してほしいと思います｡

動画でブログを更新する時の様子を解説していますので､文章よりも分かりやすいかと思います｡

[私がブログを書くときに使っているツール #blogvideo9](http://mba-hack.blogspot.jp/2012/09/blogvideo9_8.html)

[私がBloggerを更新するために使っている方法](http://mba-hack.blogspot.jp/2012/09/blogger.html)

次回はこの続きからになりそうです｡よろしくお願いします｡