社内技術勉強会 「 Linux における開発環境」 2008/02/27  Tomohiro MITSUMUNE (a.k.a. Kiske)
本日のアジェンダ 開発環境について Linux での開発環境 zsh screen vim (or Emacs)
開発環境 GUI (Windows) マウス操作を主体とした直感的な操作 文字だけでなく画像を利用し、動作を明確化 インストールしてすぐ使える 設計で想定されたことしかできない 重い、遅い CUI (Unix, Linux) 覚える事が多くて、敷居が高い 多くのことを自分で設定する必要がある 軽い、早い
Windows>Linux での 開発環境の問題 シームレスな開発ができない Windows 側でコード修正 scp, sftp, svn とかで Linux 側にアップロード 変更の度に deploy 作業が生じるため、効率悪 文字エンコード ,  改行コードの違い アップロード後に「動かねー」と叫ぶ理由の 1 つ
Linux での開発 Linux 環境での開発効率向上アイテム zsh screen vim (or Emacs) 開発効率が上がると 早く帰れる 友人 / 家族 / 恋人と団欒 趣味の時間 リア充への第一歩!
zsh Unix のコマンドシェルの 1 つ bash + tcsh + ksh =  「究極のシェル」 主な機能 コマンド補完機能 プロンプト表示 スペル修正機能 コマンドラインスタック 拡張されたファイル選択 参考記事  [http://journal.mycom.co.jp/column/zsh]
autocomplete コマンド自動補完 autoload –U compinit compinit さまざまなコマンド補完に対応 シェルコマンド  ( ls, tar, diff, etc…) ソフトウェア ( apache, php, ruby, etc…) 自分でコマンド補完リストも作成可能
プロンプト表示 RPROMPT コマンドライン右側に出るプロンプト カレントディレクトリとか出すと便利 コマンドが長くなってくると勝手に消える local GREEN=$'%{\e[1;32m%}' local BLUE=$'%{\e[1;34m%}' local DEFAULT=$'%{\e[00;m%}‘ PROMPT=$BULE'[${USER}@${HOSTNAME}] %(!.#.$) '$DEFAULT RPROMPT=$GREEN'[%~]'$DEFAULT
グローバルエイリアス コマンドライン上の全ての要素をエイリアスとして展開 通常のエイリアスは第 1 要素のみ alias -g L="| $PAGER" alias -g G="| grep" alias -g T="| tee -a logfile“ alias -g H="| head" alias -g TL="| tail“ abbreviation という更に便利な機能もある
コマンドラインスタック M-q 入力中のコマンドを一時保存できる ./configure --prefix=/usr/local/php-5.2.5 --with-config-file-path=/etc --enable- と、打った後に chmod 744 /usr/local/php-5.2.5 と、したいときに有効 スタックなので 2 重 3 重に格納することも可能
その他便利な機能  -  コマンド コマンドシェルのミススペルを指摘 setopt correct cd 打つのがメンドクサイ setopt auto_cd 勝手に pushd setopt auto_pushd ディレクトリスタック内をユニークに保つ setopt pushd_ignore_dups
その他便利な機能  -  スクリプト処理 data000 ~ data255 というファイル作成 touch data{000..255} sample.sql 以外の sql ファイル削除 rm *.sql~sample.sql カレント以下のシンボリックリンク削除 rm **/*(@)
screen GNU screen 1 つの端末から複数の端末を仮想的に同時に扱えるようになる 主な機能 同時に複数の端末を扱えるようになる バックスクロールでログが見れ、コピペもできる 柔軟な接続機能
うれしい機能 バックスクロール autodetach セッション終了時にプロセスをバックグラウンドへ 突然回線が切れても大丈夫 1 プロセスに複数 attach も可能なので、違う端末からでも全く同じ環境での作業が可能になる 画面分割 vim や emacs のように仮想ターミナルを水平分割 なんちゃってデュアルディスプレイ
.screenrc ( 設定ファイル ) escape ^z^z hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w" autodetach on startup_message off # copy mode 時のバッファ量を設定 defscrollback 3000 scrollback 3000 term xterm-256color markkeys "h=^B:l=^F:$=^E" #  ウィンドウ分割設定 bind -c REGION 2 split bind -c REGION 1 only bind -c REGION 0 remove bind -c REGION o focus bind -c REGION ^ resize bind x command -c REGION
vim テキストエディタ Unix 系 OS には大抵標準で入ってます 主な機能 マルチバッファ ウィンドウ分割 動的単語補完 400 以上の文法に対応した highlighting 40 以上の言語に対応したオートインデント ctags を利用したタグジャンプ 独自スクリプト実装 (vim script)
vim の問題点 操作が変態的 hjkl で移動 さまざまなモード ( normal, visual, insert ) どうやって習得するか チュートリアルモードが用意されている vimtutor とタイプするといきなり開始 日本語で良いチュートリアルだと思うのでオススメ
基本操作  -  モード 3 種類のモード ノーマルモード デフォルトモード カーソル移動、文字の編集、コマンド入力 インサートモード 文字を挿入 ビジュアルモード 文字を範囲選択 ノーマル インサート ビジュアル
基本操作  -  カーソル移動 カーソル移動 h ← j ↓ k ↑ l -> 0 行頭にジャンプ $ 行末にジャンプ ^ 行の最初の文字へジャンプ H 表示画面の 1 行目へジャンプ M 画面中央へジャンプ L 表示画面の最下行へジャンプ % 対応する括弧へジャンプ gg ファイルの先頭へジャンプ G ファイルの末尾へジャンプ gj 表示行下に移動  gk 表示行上に移動
基本操作  -  編集 編集 x 1 文字切り取り dd カーソル行を切り取り yy カーソル行をヤンク D カーソル位置から行末を切り取り p カーソルの後ろに貼り付け P カーソルの前に貼り付け J 行連結  ( インデントは削除 ) gJ 行連結  ( 空白はそのまま ) ~ 大文字 / 小文字を切り替える >>,  << カーソル行をインデント ,   逆インデント <C-a>,<C-x> カーソル位置の数字の加減 u アンドゥ <C-r> リドゥ :w[!] [file] 上書き保存  (! を付けると readonly でも上書き保存、 file 名指定の場合は名前を付けて保存 ) :q[!] 終了  (! を付けると変更点があっても保存せず強制終了 )
基本操作  -  インサートモード ここで軽くまとめると 操作がパズル的 突き詰める楽しさがある インサートモード i カーソルの前からインサート I カーソル行の行頭からインサート a カーソルの後ろからインサート A カーソル行の行末からインサート o カーソル行の下に新しい行を作りインサート O カーソル行の上に新しい行を作りインサート
基本操作  -  ビジュアルモード ビジュアルモードと編集を組み合わせると非常に強力 コピペ カット & ペースト 置換 範囲置換 範囲を選択後、「 :s/foo/bar 」で範囲置換 ビジュアルモード v 文字単位のビジュアルモード V 行単位のビジュアルモード <C-v> 矩形ビジュアルモード gv 最後に利用したビジュアルモードを復元
基本操作  -  その他 検索 / keyword keyword  を検索 n 次の候補に移動 N 前の候補に移動 置換 :%s/ from / to /[g] 全行に対してパターンマッチング (g を付けると複数マッチ ) :m,ns/ from / to /[g] m 行目から n 行目の範囲に対してパターンマッチング 画面分割 :sp 画面を水平に分割 :vs 画面を垂直に分割 <C-w>[h,j,k,l] 分割したウィンドウ間を移動 :only カーソルがあるウィンドウ以外を閉じる ファイル操作 :e [file] file を開く ZZ 保存して閉じる :ls  バッファ一覧を表示 :bn, :bp バッファ間を前後に移動 ヘルプ :h [command] command のヘルプを表示
単語補完機能 インサートモード時に利用可能 キーワード補完 <C-x C-n>, <C-x C-p> 開いているバッファ内から補完 タグ補完 <C-x C-]> ctags ファイルによる補完 ファイル名補完 <C-x C-f> ファイル名による補完 コマンドライン補完 <C-x C-v> vim のコマンドラインから補完 行全体補完 <C-x C-l> バッファ内から行全体による補完 オムニ補完 <C-x C-o> インテリジェンスな補完
テキストオブジェクト テキストのオブジェクト単位で選択 ビジュアルモードで主に利用 ノーマルモードで編集コマンドと組み合わせる テキストオブジェクト i 対象の内側のオブジェクトを選択 a 対象を含んだオブジェクトを選択 ip パラグラフ単位で選択 di 対象の内側のオブジェクトを削除 it タグの内側のオブジェクトを選択
テキストオブジェクトの便利な例 i $this->setAttribute('error', ' エラーです '); () 内にカーソルがある状態で vi $this->setAttribute('error', ' エラーです '); dit <h2>PHOTOHITO へようこそ </h2> <h2> タグ内にカーソルがある状態で dit <h2></h2>
vim プラグイン 機能拡張するための仕組み 中身は vim スクリプトで記述 vim 起動時にオートロードされる Firefox Extension みたいなもの 種類は 2 つ グローバルプラグイン 全種類のファイルで利用される ファイルタイププラグイン 特定ファイルのみで利用される 公式サイトで公開されている
minibufexpl.vim タブエディタ風にバッファを管理 vim デフォルトのバッファ管理は貧弱 配布元 http://www.vim.org/script.php?script_id=159 設定 :let g:miniBufExplMapWindowNavVim = 1 :let g:miniBufExplMapWindowNavArrows = 1 :let g:miniBufExplMapCTabSwitchBuffs = 1
surround.vim テキストオブジェクト操作を拡張 配布元 http://www.vim.org/scripts/script.php?script_id=1697 拡張されたところ 対象とする文字列自体を削除したり置換 ds, cs, ys, vs というコマンド 囲っている HTML タグ自体を削除したり置換 インサートモードから使える <C-G>S で利用
fuzzyfinder.vim あいまい検索ファイルエクスプローラ 部分検索一致も可能 配布元 http://vim.g.hatena.ne.jp/keyword/fuzzyfinder.vim 検索モード ファイルモード MRU モード  (MRU = Most Recently Used) タグモード ディレクトリモード
autocomplpop.vim キーワード補完を自動でポップアップ デフォルトだと都度 <C-n> を押す必要がある 配布元 http://hiki.ns9tks.net/?autocomplpop.vim 便利な点 自動でポップアップ ファイル名補完と Ruby のオムニ補完にも対応
commentout.vim 範囲選択した箇所をコメントアウト いろんなコメントフォーマットに対応 配布元 http://nanasi.jp/articles/vim/commentout_source.html 対応してる代表的なコメントフォーマット # <!-- --> // > % -
ご清聴ありがとうございました http://photohito.com/ もよろしくお願いします

Linuxにおける開発環境

  • 1.
    社内技術勉強会 「 Linuxにおける開発環境」 2008/02/27 Tomohiro MITSUMUNE (a.k.a. Kiske)
  • 2.
    本日のアジェンダ 開発環境について Linuxでの開発環境 zsh screen vim (or Emacs)
  • 3.
    開発環境 GUI (Windows)マウス操作を主体とした直感的な操作 文字だけでなく画像を利用し、動作を明確化 インストールしてすぐ使える 設計で想定されたことしかできない 重い、遅い CUI (Unix, Linux) 覚える事が多くて、敷居が高い 多くのことを自分で設定する必要がある 軽い、早い
  • 4.
    Windows>Linux での 開発環境の問題シームレスな開発ができない Windows 側でコード修正 scp, sftp, svn とかで Linux 側にアップロード 変更の度に deploy 作業が生じるため、効率悪 文字エンコード , 改行コードの違い アップロード後に「動かねー」と叫ぶ理由の 1 つ
  • 5.
    Linux での開発 Linux環境での開発効率向上アイテム zsh screen vim (or Emacs) 開発効率が上がると 早く帰れる 友人 / 家族 / 恋人と団欒 趣味の時間 リア充への第一歩!
  • 6.
    zsh Unix のコマンドシェルの1 つ bash + tcsh + ksh = 「究極のシェル」 主な機能 コマンド補完機能 プロンプト表示 スペル修正機能 コマンドラインスタック 拡張されたファイル選択 参考記事 [http://journal.mycom.co.jp/column/zsh]
  • 7.
    autocomplete コマンド自動補完 autoload–U compinit compinit さまざまなコマンド補完に対応 シェルコマンド ( ls, tar, diff, etc…) ソフトウェア ( apache, php, ruby, etc…) 自分でコマンド補完リストも作成可能
  • 8.
    プロンプト表示 RPROMPT コマンドライン右側に出るプロンプトカレントディレクトリとか出すと便利 コマンドが長くなってくると勝手に消える local GREEN=$'%{\e[1;32m%}' local BLUE=$'%{\e[1;34m%}' local DEFAULT=$'%{\e[00;m%}‘ PROMPT=$BULE'[${USER}@${HOSTNAME}] %(!.#.$) '$DEFAULT RPROMPT=$GREEN'[%~]'$DEFAULT
  • 9.
    グローバルエイリアス コマンドライン上の全ての要素をエイリアスとして展開 通常のエイリアスは第1 要素のみ alias -g L=&quot;| $PAGER&quot; alias -g G=&quot;| grep&quot; alias -g T=&quot;| tee -a logfile“ alias -g H=&quot;| head&quot; alias -g TL=&quot;| tail“ abbreviation という更に便利な機能もある
  • 10.
    コマンドラインスタック M-q 入力中のコマンドを一時保存できる./configure --prefix=/usr/local/php-5.2.5 --with-config-file-path=/etc --enable- と、打った後に chmod 744 /usr/local/php-5.2.5 と、したいときに有効 スタックなので 2 重 3 重に格納することも可能
  • 11.
    その他便利な機能 - コマンド コマンドシェルのミススペルを指摘 setopt correct cd 打つのがメンドクサイ setopt auto_cd 勝手に pushd setopt auto_pushd ディレクトリスタック内をユニークに保つ setopt pushd_ignore_dups
  • 12.
    その他便利な機能 - スクリプト処理 data000 ~ data255 というファイル作成 touch data{000..255} sample.sql 以外の sql ファイル削除 rm *.sql~sample.sql カレント以下のシンボリックリンク削除 rm **/*(@)
  • 13.
    screen GNU screen1 つの端末から複数の端末を仮想的に同時に扱えるようになる 主な機能 同時に複数の端末を扱えるようになる バックスクロールでログが見れ、コピペもできる 柔軟な接続機能
  • 14.
    うれしい機能 バックスクロール autodetachセッション終了時にプロセスをバックグラウンドへ 突然回線が切れても大丈夫 1 プロセスに複数 attach も可能なので、違う端末からでも全く同じ環境での作業が可能になる 画面分割 vim や emacs のように仮想ターミナルを水平分割 なんちゃってデュアルディスプレイ
  • 15.
    .screenrc ( 設定ファイル) escape ^z^z hardstatus alwayslastline &quot;[%02c] %`%-w%{=b bw}%n %t%{-}%+w&quot; autodetach on startup_message off # copy mode 時のバッファ量を設定 defscrollback 3000 scrollback 3000 term xterm-256color markkeys &quot;h=^B:l=^F:$=^E&quot; # ウィンドウ分割設定 bind -c REGION 2 split bind -c REGION 1 only bind -c REGION 0 remove bind -c REGION o focus bind -c REGION ^ resize bind x command -c REGION
  • 16.
    vim テキストエディタ Unix系 OS には大抵標準で入ってます 主な機能 マルチバッファ ウィンドウ分割 動的単語補完 400 以上の文法に対応した highlighting 40 以上の言語に対応したオートインデント ctags を利用したタグジャンプ 独自スクリプト実装 (vim script)
  • 17.
    vim の問題点 操作が変態的hjkl で移動 さまざまなモード ( normal, visual, insert ) どうやって習得するか チュートリアルモードが用意されている vimtutor とタイプするといきなり開始 日本語で良いチュートリアルだと思うのでオススメ
  • 18.
    基本操作 - モード 3 種類のモード ノーマルモード デフォルトモード カーソル移動、文字の編集、コマンド入力 インサートモード 文字を挿入 ビジュアルモード 文字を範囲選択 ノーマル インサート ビジュアル
  • 19.
    基本操作 - カーソル移動 カーソル移動 h ← j ↓ k ↑ l -> 0 行頭にジャンプ $ 行末にジャンプ ^ 行の最初の文字へジャンプ H 表示画面の 1 行目へジャンプ M 画面中央へジャンプ L 表示画面の最下行へジャンプ % 対応する括弧へジャンプ gg ファイルの先頭へジャンプ G ファイルの末尾へジャンプ gj 表示行下に移動 gk 表示行上に移動
  • 20.
    基本操作 - 編集 編集 x 1 文字切り取り dd カーソル行を切り取り yy カーソル行をヤンク D カーソル位置から行末を切り取り p カーソルの後ろに貼り付け P カーソルの前に貼り付け J 行連結 ( インデントは削除 ) gJ 行連結 ( 空白はそのまま ) ~ 大文字 / 小文字を切り替える >>, << カーソル行をインデント ,  逆インデント <C-a>,<C-x> カーソル位置の数字の加減 u アンドゥ <C-r> リドゥ :w[!] [file] 上書き保存 (! を付けると readonly でも上書き保存、 file 名指定の場合は名前を付けて保存 ) :q[!] 終了 (! を付けると変更点があっても保存せず強制終了 )
  • 21.
    基本操作 - インサートモード ここで軽くまとめると 操作がパズル的 突き詰める楽しさがある インサートモード i カーソルの前からインサート I カーソル行の行頭からインサート a カーソルの後ろからインサート A カーソル行の行末からインサート o カーソル行の下に新しい行を作りインサート O カーソル行の上に新しい行を作りインサート
  • 22.
    基本操作 - ビジュアルモード ビジュアルモードと編集を組み合わせると非常に強力 コピペ カット & ペースト 置換 範囲置換 範囲を選択後、「 :s/foo/bar 」で範囲置換 ビジュアルモード v 文字単位のビジュアルモード V 行単位のビジュアルモード <C-v> 矩形ビジュアルモード gv 最後に利用したビジュアルモードを復元
  • 23.
    基本操作 - その他 検索 / keyword keyword を検索 n 次の候補に移動 N 前の候補に移動 置換 :%s/ from / to /[g] 全行に対してパターンマッチング (g を付けると複数マッチ ) :m,ns/ from / to /[g] m 行目から n 行目の範囲に対してパターンマッチング 画面分割 :sp 画面を水平に分割 :vs 画面を垂直に分割 <C-w>[h,j,k,l] 分割したウィンドウ間を移動 :only カーソルがあるウィンドウ以外を閉じる ファイル操作 :e [file] file を開く ZZ 保存して閉じる :ls バッファ一覧を表示 :bn, :bp バッファ間を前後に移動 ヘルプ :h [command] command のヘルプを表示
  • 24.
    単語補完機能 インサートモード時に利用可能 キーワード補完<C-x C-n>, <C-x C-p> 開いているバッファ内から補完 タグ補完 <C-x C-]> ctags ファイルによる補完 ファイル名補完 <C-x C-f> ファイル名による補完 コマンドライン補完 <C-x C-v> vim のコマンドラインから補完 行全体補完 <C-x C-l> バッファ内から行全体による補完 オムニ補完 <C-x C-o> インテリジェンスな補完
  • 25.
    テキストオブジェクト テキストのオブジェクト単位で選択 ビジュアルモードで主に利用ノーマルモードで編集コマンドと組み合わせる テキストオブジェクト i 対象の内側のオブジェクトを選択 a 対象を含んだオブジェクトを選択 ip パラグラフ単位で選択 di 対象の内側のオブジェクトを削除 it タグの内側のオブジェクトを選択
  • 26.
    テキストオブジェクトの便利な例 i $this->setAttribute('error',' エラーです '); () 内にカーソルがある状態で vi $this->setAttribute('error', ' エラーです '); dit <h2>PHOTOHITO へようこそ </h2> <h2> タグ内にカーソルがある状態で dit <h2></h2>
  • 27.
    vim プラグイン 機能拡張するための仕組み中身は vim スクリプトで記述 vim 起動時にオートロードされる Firefox Extension みたいなもの 種類は 2 つ グローバルプラグイン 全種類のファイルで利用される ファイルタイププラグイン 特定ファイルのみで利用される 公式サイトで公開されている
  • 28.
    minibufexpl.vim タブエディタ風にバッファを管理 vimデフォルトのバッファ管理は貧弱 配布元 http://www.vim.org/script.php?script_id=159 設定 :let g:miniBufExplMapWindowNavVim = 1 :let g:miniBufExplMapWindowNavArrows = 1 :let g:miniBufExplMapCTabSwitchBuffs = 1
  • 29.
    surround.vim テキストオブジェクト操作を拡張 配布元http://www.vim.org/scripts/script.php?script_id=1697 拡張されたところ 対象とする文字列自体を削除したり置換 ds, cs, ys, vs というコマンド 囲っている HTML タグ自体を削除したり置換 インサートモードから使える <C-G>S で利用
  • 30.
    fuzzyfinder.vim あいまい検索ファイルエクスプローラ 部分検索一致も可能配布元 http://vim.g.hatena.ne.jp/keyword/fuzzyfinder.vim 検索モード ファイルモード MRU モード (MRU = Most Recently Used) タグモード ディレクトリモード
  • 31.
    autocomplpop.vim キーワード補完を自動でポップアップ デフォルトだと都度<C-n> を押す必要がある 配布元 http://hiki.ns9tks.net/?autocomplpop.vim 便利な点 自動でポップアップ ファイル名補完と Ruby のオムニ補完にも対応
  • 32.
    commentout.vim 範囲選択した箇所をコメントアウト いろんなコメントフォーマットに対応配布元 http://nanasi.jp/articles/vim/commentout_source.html 対応してる代表的なコメントフォーマット # <!-- --> // > % -
  • 33.