Mercurialを使って最新のVimをインストールする

vim

今までは都度パッチをダウンロードしてあててビルドしてたので、いい加減Mercurialにしないとなぁと思ってやってみました。
最初からやってみました。OSはCentOS6.4です。

前準備

最初からyumで入っているVimはアンインストールします。
vim-minimalまで消しちゃうとsudoとかも消えちゃうので要注意。

yum remove vim-enhanced vim-common

必要な物も入れときます。

yum -y install gcc python python-devel ncurses-devel python-setuptools

Mercurialをインストール

Mercurialpythonのeasy_installを使いインストールします。

easy_install mercurial

http://mercurial.selenic.com/につながらなくてインストールできなかった...

Reading http://mercurial.selenic.com/
error: Download error: (110, 'Connection timed out')

なので、yumでインストールしました。

yum install mercurial

Mercurialのコマンドはhgです。

hg version
Mercurial Distributed SCM (version 1.4)

Mercurialの最新が2.5系だったのでかなり古いですが、とりあえず動けばOKなので、よしとします。

Vimの最新版をインストール

リポジトリをクローンします。

hg clone https://vim.googlecode.com/hg/ vim

ソースを最新にします。

hg pull
hg update

今後の更新はこのコマンドを実行して更新します。


CUIで使うVimなので、いつもこんな感じでconfigureしています。

./configure \
--prefix=/usr/local/vim-7.3 \
--enable-fontset \
--enable-perlinterp \
--enable-pythoninterp \
--enable-rubyinterp \
--enable-cscope \
--enable-multibyte \
--with-x=no \
--disable-gui \
--disable-xim \
--with-features=huge \
--disable-selinux \
--disable-gpm \
--disable-darwin
make && make install

prefixで指定した/usr/local/vim-7.3にインストールされるので、パスを通しておきます。

vi /etc/profile.d/vim.sh
PATH=$PATH:/usr/local/vim-7.3/bin
export PATH
alias vi='vim'


ちなみにソースをダウンロードしてパッチを当ててた方法はこうでした。

cd /usr/local/src
wget http://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
tar xf vim-7.3.tar.bz2
cd vim73
mkdir patches
cd patches
seq -f http://ftp.vim.org/pub/vim/patches/7.3/7.3.%03g 001 905 | xargs wget
cat patches/7.3.* | patch -p0
(このあと上と同じようにconfigureしてmake)


楽になりました!さっさとMercurialを使っておけば良かった!

scratch utilityで縦分割&ファイルタイプを引き継いでバッファを開く

vim

scratch utilityが便利

Vimのscratch utilityをいうプラグインをよく使っています。
スクラッチバッファを作って即時開いてくれるプラグインです。


僕はスクリプトを書くときに、どんな動きをするのか確かめながら書くことをよくするので、
このscratch utillityを使いスクラッチ用バッファにスクリプト書いてquickrun.vimで実行する方法が手放せません。
Vimを終了するときに、バッファの内容を自動保存してくれる機能も便利です。

scratch utilityにg:scratchSplitOptionを追加した

通常、scratch utilityでは横分割でスクラッチバッファを開きますが、縦分割で開きたかったのと、
上のような使い方をしているので開く直前のバッファのfiletypeのまま開きたかったのでforkしてオプションを追加してみました。

リポジトリはこちらです。

.vimrcなどに、下のようにg:scratchSplitOptionを設定します。

let g:scratchSplitOption =
      \ {
      \   'vertical'           : 1,
      \   'take_over_filetype' : 1
      \ }
  • verticalを1で設定すると、縦分割でスクラッチバッファを作ります。0や設定しない場合、デフォルトの横分割になります。
  • take_over_filetypeを1で設定すると、スクラッチバッファを作るときに直前のバッファのfiletypeを引き継ぎます。

RPGで学んだこと

「つれてゆくなら せんし そうりょ まほうつかいの 3にんが いいぜ。ひっく。」

酒場で会った剣士にそう言われた。
大魔王を倒し世界を救う旅なのに、3人しか連れて行けない。かなりの少数精鋭。


迷った後、アドバイス通りの3人を連れて旅に出ることにした。
旅を続けて経験を積み、自分と3人の仲間は一人前に強くなった。


ふと立ち寄った神殿でまた迷う。

「まほうつかいが せんしになれば まほうもつかえる せんしに!」

「攻撃魔法が使える魔法使いが転職して回復魔法を使えるようになったら旅が楽になるよね?」
「体力のある戦士が武闘家になってすばやくなったら敵が早く倒せるかも?」


近道?果たしてそうなんだろうか?
目的は大魔王を倒して世界を救うことなんだけど。


体力のある戦士は最前線で体を張り、強い力で攻撃するのが得意。
勇者は自分しか使えない強力な武器や魔法を持っている。
僧侶は傷を癒やしながら、攻撃を補助するのが得意。
魔法使いは圧倒的な火力を誇る攻撃魔法が使える。


確かに、それぞれ複数の得意な事があれば、もし誰か倒れても総崩れする確率は低くなる。
今までわからなかった他人の苦労も分かるだろう。
しかし、本業ではなかった能力を本業並みに使えるようにする為には、時間と経験が必要になる。

早く目的を達成するためには、それぞれが得意なことをそのまま伸ばした方がいいのではないだろうか。


「ここは俺に任せろ」

それぞれ時間は限られているし、興味のある分野も違う。
自分しかできない得意なところを伸ばして戦おう。
他人の不得意なところは助けよう。



さっき風呂に入っている時に、ふと思った。人生で大事なことは昔ロープレで学んだなー。
ランチェスターの法則とか、ブルーオーシャン戦略ってやつ?

ちなみに酒は飲んでないです。

DayOneとKPTで、1年間で50個のよい習慣を身につける

2013年にやりたいこと

年始に会社で所信表明をしたのですが、今年は「いい感じの検索」をつくりたいです。

日々の振り返りに使える「Day One」

で、目標を実現するには、計画を立てて実行し、振り返り次につなげていくことが大事ですが、
これも大変なのでツールに助けてもらうとよいと思っています。

日記や私的な雑なメモをとるために、iPhoneのDay Oneというアプリを使っています。
MacのアプリにもDayOneがあり、iCloudやDropboxで同期がとれてかなり便利です。

今まではMomentoを使っていたのですが、
Macと簡単に連携がとりたかったので、乗り換えました。

UIはMomentoの方が暖かみがあって好きなんですが、残念。
Evernoteも使っていますが、Evernoteは作業ログや勉強や一人ブレストに使って、DayOneやMomentoは日記、ライフログ用といった使い分けのイメージかなぁ。

KPTで振り返る

プロジェクトの終わりなど、一つの仕事の区切りの際反省会でよく使われるのが「KPT」です。

  • KEEP ・・・よかったこと、これからも続けたいこと
  • PROBLEM ・・・問題だったこと、よくなかったこと
  • TRY ・・・次にやってみたいこと

反省会をやると、よく問題点と一緒にいいわけや解決策を発言しがちですが、
KPTでシンプルに論点を絞って振り返っていくことで、頭の中の整理ができて問題解決がしやすいです。


これを仕事以外にも使うとよいのかなと思い、2013年はDayOne+KPTをやってみることにしました。

DayOne+KPTで1週間ごとに振り返ってみる

いつやるのか。タイミングは、日曜日や、月曜日の会社へ向かう電車の中でやってみることにしました。
どうやるのか。テンプレをきめました。
Markdownで書きます。Markdownは簡単な記述できれいに整形してくれる記法です。DayOneはMarkdownに対応しています。
たとえば、#の後に半角スペースを空けた後文字を書くと、題名になったり、行頭にハイフンで書いた行を縦に並べるとリストになったりします。

#kpt 2/52

# KEEP
- 飲み会以外では酒を飲まなかったこと。結果、プログラムを書いて勉強する時間ができた。
- ...

# PROBLEM
- 英語の勉強に取りかかれていない。
- ...

# TRY
- ○○を今週中に読了する。。

----
- 今週の感想あれこれ...
- 今週の感想あれこれ...
  • 1行目は、#kptがタグです。DayOneはTwitterのようにハッシュタグが使えるので、あとから振り返りだけ並べてみるためにタグをつけています。
  • 2/52が何週目の振り返りかです。これを書くだけでもかなりの振り返りの意識を持てるのではないかと思います。
  • KEEP, PROBLEM, TRYを簡単にリスト化して書きます。
  • 今週の感想などあれば、----で区切った下に書きます。
  • TRYの項目は多すぎると挫折しそうなので、最初はひとつにしてみることにしました。

1年間で50個のよい習慣を身につけよう

1年は約52週間あります。
2013年の年末までに毎週1つでもKEEPができると、1年間で50個のよい習慣が身につくかもしれません。

今年もあと50週間。とりあえずこれをやっていきたいと思います。
がんばろう!

cake.vim最近の改善5つ

最近、cake.vimのバージョンを2.10としてGitHubにpushしました。vimonlineにもアップしました。

そのなかの、2012年後半からやっていた改善5つを紹介します。

gfコマンドの縦分割版コマンドを追加した

ノーマルモードの時にgfと押すと、通常vimはカーソル配下に書かれたファイルパスを開こうとしますが、cake.vimではカーソル配下の記述からよしなに対象のクラスやファイルを開きます。そのあたりはcake.vim使い方まとめ - yuhei.kagayaに詳しく書いています。

gfの代わりに<C-w>fで上下分割、<C-w>gfでタブページ分割で開きますが、
gsと押して縦分割で開けるようにしました。

キーバインドを変更するには、.vimrcなどに次のように設定します。

" Ctrl-w gsで縦分割
let g:cakephp_keybind_vsplit_gf = '<C-w>gs'

gfでジャンプできるパターンが増えた

以下のように、gfでジャンプできるようになりました。

<?php
// 以下の行でgfと押すと、HogeController::fuga()へジャンプします。
array('controller' => 'Hoge', 'action' => 'fuga')
// 以下の行でgfと押すと、HogeController::admin_fuga()へジャンプします。
array('controller' => 'Hoge', 'action' => 'fuga', 'admin' => true)

アプリケーションのルーティングが一覧で定義してあるapp/config/routes.phpなどで便利です。

App::build()で追加したパスにジャンプできるようになった

アプリケーションディレクトリ直下に.cakeというファイルを作成し、次のようにJSON形式でビルドパスを書いておくと、
追加先のクラスにもジャンプできます。

{
  "build_path": {
    "models": [
      "/full/path/to/models/",
      "/next/full/path/to/models/"
    ],
    "components": [
      "/full/path/to/components/",
      "/next/full/path/to/components/"
    ],
    "helpers": [
      "/full/path/to/helpers/",
      "/next/full/path/to/helpers/"
    ]
  },
  "cake" : "/path/to/another_cakephp_core/"
}

.cakeではないファイル名にする場合には.vimrcなどで次のように設定します。

let g:cakephp_app_config_file = '.project'

CakePHPのコアディレクトリの場所はデフォルトでアプリケーションディレクトリと同じ階層にあるものとして認識しますが、そうでないパスにある場合などは.vimrcなどに次のように設定します。

let g:cakephp_core_path  = '/path/to/cakephp_core/'

アプリケーションごとに違う場所にCakePHPコアディレクトリがある場合には、g:cakephp_core_pathではなく上記の.cakeのように書いておくと便利です。


:Cviewコマンドを強化した

Cviewコマンドは、必ず第一引数にビュー名をとっていましたが(TABでビュー名の入力補完可能)、
第一引数を省略した場合、カーソルがあるカレント行に対応するビューファイルへジャンプするようになりました。

<?php
class ContentsController extends AppController {

  public function index() {

    // ここで:Cviewコマンドを引数なしで実行すると、indexビューへジャンプします

  }

gfでジャンプするときと同様、テーマビューを使っていて複数のジャンプ候補がある時には選択肢が出るので、
数字を選んでください。

:Cview 
Which file do you jump to?
(1): Contents/index.ctp, (2): Themed/admin/Contents/index.ctp: 

プラグイン読み込み時間の短縮

ソースを見直して、プラグインの設定値の初期化、コマンドの定義の記述以外をautoloadに寄せました。
結果、Vimの起動時にcake.vimの読み込みにかかる時間が短縮されて、約180%程度速度が向上しました。


以上でした。
次は入力系の機能、CakePHPのメソッドの入力補完を作ってみたいなー。

WindowsのGitbashで、Githubをssh経由で操作できるようにセットアップした

画面キャプチャはクラシックな感じですが、環境はWindows7でやりました。

1. Gitをインストール

http://git-scm.com/ からDownload for Windowsをクリックして、インストーラをダウンロードします。
※バージョンは1.8.0-preview20121022でした。

2.インストーラをすすめる

ダウンロードしたインストーラのアイコンをダブルクリックして起動して、進めていきます。
f:id:yuhei_kagaya:20121211215915j:plain

f:id:yuhei_kagaya:20121211215957j:plain

f:id:yuhei_kagaya:20121211220032j:plain

↓ここもこのままでオッケー
f:id:yuhei_kagaya:20121211220055j:plain

f:id:yuhei_kagaya:20121211220129j:plain

↓「Run Git from the Windows Command Prompt」を選びます。
f:id:yuhei_kagaya:20121211220158j:plain

↓「Use OpenSSH」を選びます
f:id:yuhei_kagaya:20121211220248j:plain

↓「Checkout as-is, commit as-is」を選びます
f:id:yuhei_kagaya:20121211220416j:plain

f:id:yuhei_kagaya:20121211220504j:plain

3. 設定

デスクトップにできた、「Git Bash」のアイコンをダブルクリックしてGitBashを起動します。
コマンドラインで個人の識別情報を設定していきます。
core.quotepathはgit logなどでUTF-8の日本語コメントを見る為に必要です。

git config --global user.email 'メールアドレス'
git config --global user.name '名前'
git config --global core.quotepath off

exit

C:\Users\ウィンドウズのログイン名\.gitconfig に設定ファイルが作成されます。

4.秘密鍵と公開鍵を作る

もういちど、GitBashを起動します。

mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -C 'メールアドレス'
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/ウィンドウズのログイン名/.ssh/id_rsa): #←エンターを押します
Enter passphrase (empty for no passphrase): #←パスフレーズを入力してエンターを押します。
Enter same passphrase again: #←パスフレーズを再入力してエンターを押します。

5. 公開鍵をGithubに登録します。

そのままコマンドで、公開鍵の内容をクリップボードにコピーします。

clip < ~/.ssh/id_rsa.pub

ブラウザで、GithubのAccount settingsページを開きます。
左メニューのSSH Keysをクリック、「Add SSH Keys」をクリックします。

Titleには、何か自分でわかりやすい名前を入力します。
Keyに、先ほどクリップボードにコピーした公開鍵の内容を貼り付けます。
「Add key」をクリックしたあと、Githubのパスワードが聞かれますので、正しく入力してConfirm passwordをクリックします。

これで公開鍵が登録されました。

6. リポジトリをcloneする

GitBashを使って、デスクトップに既存のリポジトリをcloneしてみます。

cd ~/Desktop/
git clone git@github.com:Githubのユーザ:リポジトリ名.git

The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is XX:XX:XX:XX:.....
Are you sure you want to continue connecting (yes/no)? yes #yesと入力してエンターを押します。
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Enter passphrase for key '/c/Users/ウィンドウズのログイン名/.ssh/id_rsa': # ←上記4で決めた、パスフレーズを入力してエンターを押します。

cloneできました。これでオッケー。


2012.12.14追記です

7. Pagentを使ってパスフレーズの入力を省く

「git pullや git push するときにいちいちパスフレーズを入力するのがめんどくさい」
という場合には、Pagentを使うと入力を省くことができて便利です。

PuTTYのPagentとTortoiseSVNのTortoisePlinkを使います。

※TortoiseGitのPlinkではバグがあるようですので、あえてTortoiseSVNのほうを使います。実際にTortoiseGitのPlinkでやってみたのですが、うまく接続できませんでした。

以下はPagentを動かすまでの手順です。

8. PuttyTortoiseSVNをインストール

それぞれをダウンロードして、インストーラにしたがってデフォルトのままインストールします。

9. GIT_SSH環境変数を設定

コントロールパネル>システムとセキュリティ>システムのメニューを開き、
「システムの詳細設定」をクリックしてシステムのプロパティを開きます。

環境変数ボタンを押します。
f:id:yuhei_kagaya:20121214182552j:plain

新規のボタンを押すと、次のような画面が出ます。
ユーザー環境変数、システム環境変数のどちらでもよいです。
f:id:yuhei_kagaya:20121214182904j:plain

変数名に、GIT_SSH と入力します。
変数値は、C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe と入力します。
TortoiseSVNをインストールしたパスを変更した場合には、適切なTortoisePlink.exeのパスを入力します。

10. 秘密鍵をppkファイルに変換する

4で作成したOpenSSH形式の秘密鍵を、Pagentが読むファイル形式に変換します。
スタートメニュー>puttyから、「PuTTYgen」を起動します。
f:id:yuhei_kagaya:20121214181407j:plain

変換>鍵のインポートから、id_rsaを指定して読み込みます。
場所は、C:\Users\ウィンドウズのログイン名\.ssh\id_rsaです。
秘密鍵を作成したときのパスフレーズを聞かれますので、入力します。

秘密鍵の保存ボタンを押して、適当な名前を付けてPuTTY秘密鍵ファイル(*.ppk)を保存します。
f:id:yuhei_kagaya:20121214181653j:plain

11. Pagentを起動して秘密鍵を追加

スタートメニュー>puttyから、Pagentを起動します。
タスクバーに帽子を被ったコンピューターのようなマークがでてくるので、ダブルクリックします。
f:id:yuhei_kagaya:20121214182134j:plain

鍵の追加ボタンを押して、10で作成したppkファイルを指定したあと、閉じます。
これで秘密鍵が登録されました。

12. Gitbashからgit cloneなどしてみる

Gitbashから、git cloneしてみます。すると、Pagentから「次の鍵への照会を許可しますか?」と聞かれるので、Yesを選択します。
f:id:yuhei_kagaya:20121214183456j:plain

これでオッケー。いちいちパスフレーズを入力する必要がなくなりました。

13. PagentをWindows起動時に鍵を登録した状態で自動起動させる

さらに、Pagentをいちいち立ち上げるのも面倒なので、
Windows起動時に鍵を追加した状態でPagentが自動で起動する状態にしておきます。


デスクトップで、右クリック>新規追加>ショートカットの作成 を選びます。
f:id:yuhei_kagaya:20121214184553j:plain

項目の場所に次のように「pagent.exeのパス」+「半角スペース」+「ppkファイルのパス」を入力し、ショートカットを作成します。

"C:\Program Files (x86)\PuTTY\pageant.exe" "ppkファイルのパス"

作成したショートカットをドラッグして、スタートメニュー>スタートアップに入れておきます。


これでPagentを起動して鍵を追加する作業も省くことができました。

vimのgfコマンドで、縦分割版をやってみた

vim

「gf」と押すとカーソル下のファイル名を瞬時に開く

vimのノーマルモードの「gf」はとても便利です。
例えば、次のようなときに*の場所にカーソルがありノーマルモードの時に「gf」と押すと、対象のファイルを開くことができます。

<!-- *の位置にカーソルがあるとき、gfでindex.htmlを開きます。-->
<a href="in*dex.html">トップページへ</a>
# *の位置にカーソルがあるとき、gfでhttpd-vhosts.confを開きます。
Include *onf/extra/httpd-vhosts.conf

コマンドの覚え方は、"goto file" です。

横分割やタブで開くこともできます。

  • <C-w>f で横分割して開く
  • <C-w>gf で新しいタブに開く

縦分割もしたい

パソコンのモニターは横に長いことが多いので、僕は縦に分割することが多いです。
特に最初から決まったコマンドがなかったので、空いていた「gs」にあててみました。
.vimrcに次のようにマッピングを定義すればオッケーです。

" 縦分割版gf
nnoremap gs :vertical wincmd f<CR>

とても便利だったので、cake.vimにもgsコマンドを追加してみました。