Vrapper のインデント動作が変わった
仕事で使っている PC の Vrapper を久しぶりにアップデートしたらインデント動作が変わっていたので、試行錯誤した時のメモ *1
また、ここでのインデント動作というのは、ノーマルモードでの「<<」「>>」やインサートモードでタブキーを押した時の動作を指す。
変わったこと
アップデート前は Eclipse の設定 *2 と同じように動いていた。
そのため、.vrapperrc にはインデント関係の設定は一切書いていなかった。
しかしアップデート後はインサートモードでは Eclipse の設定通りに動いてくれるが、ノーマルモードでの「<<」「>>」が明らかに Eclipse の設定とは違う。
たとえば、Tab policy を Tabs only にしているのに「>>」するとスペースが挿入されるといった動きになる。
したこと
Eclipse と同じ動作になるように .vrapperrc に設定しておく。
例えば、タブ文字でインデントするには以下のようにする。
set noexpandtab
スペース4個でインデント、既存のタブ文字をスペース12個分の幅で表示するなら以下のようにする。
set expandtab set tabstop=12 set shiftwidth=4
Windows で UNIX の find みたいなことをする
背景
forfiles コマンドを使えば Windows でも UNIX の find コマンドみたいなことが出来る。
が、Windows XP だったりすると forfiles なにそれおいしいの?ということは珍しくないと思う*1
解決策
dir コマンドを使って劣化 find コマンドを作る。
@echo off setlocal set target=%1 set exec_cmd=%2 if "%exec_cmd%"=="" ( set exec_cmd=dir /b ) else ( set exec_cmd=%exec_cmd:"=% ) shift shift for /f "usebackq" %%i in (`dir /b /s %target%`) do ( %exec_cmd% %1 %2 %3 %4 %5 %6 %7 %8 %9 %%i )
ここでは wfind.bat としてパスを通しておく。
使う時はこんな感じ。
第一パラメータに処理対象ファイル、第二パラメータに実行コマンドを指定する*2
C:\Users\eb>wfind *.txt
abc.txt
def.txt
C:\Users\eb>wfind *.txt type
C:\Users\eb\abc.txt
C:\Users\eb\def.txt
第二パラメータの実行コマンドになんちゃって sed みたいな VBScript を、そしてこのバッチファイル自体は他のバッチファイルから呼び出す、みたいにして使っていた。
昔を思い出したので書いてみたけど、XP のサポートが終了した今となっては全く価値のないバッチファイル。
本当に今は良い時代になったものだと思う。
Mercurial をホームディレクトリにインストールする
背景
評価用に Mercurial を一般ユーザーのホームディレクトリにインストールしたので、備忘録までに。
状況としてはディストリビューションがものすごく古い、一般ユーザー権限しか持っていない、パッケージ管理コマンドが使えない…といった良くあるもので、条件は以下のような感じ。
- ソースからインストールする
- 一般ユーザーのホームディレクトリにインストールする
- 今回インストールしたマシンは Ubuntu (古い)
- HTML / man 形式のヘルプテキストは不要 (hg help が使えれば良い)
依存関係
SupportedPythonVersions - Mercurial *1
※HTML/man 形式のヘルプテキストが必要な場合は Docutils もインストールする必要がありますが、今回は hg help で賄えるのでインストールしません。
Mercurial
- Python |
ソースアーカイブの取得
- Mercurial: http://selenic.com/hg
- Python: http://www.python.jp/
- zlib: http://www.zlib.net/
- bzip2: http://www.bzip.org/
アーカイブ形式は tar.gz として *2 ~/src にダウンロード。バージョンは以下のとおり *3
- Mercurial: 2.9.2 (3f83fc5cfe71)
- Python: 2.7.6
- zlib: 1.2.8
- bzip2: 1.0.6
インストール
# zlib $ cd ~/src $ tar zxvf zlib-1.2.8.tar.gz $ cd zlib-1.2.8 $ ./configure --prefix=$HOME $ make $ make install # bzip2 $ cd ~/src $ tar zxvf bzip2-1.0.6.tar.gz $ cd bzip2-1.0.6 $ make -f Makefile-libbz2_so $ make $ make install PREFIX=$HOME # make で -fPIC オプションを指定しろ〜と言われた場合には # Makefile-libbz2_so の CFLAGS に追加する。 # (ex.) CFLAGS=-fPIC (省略) # Python $ cd ~/src $ tar zxvf Python-2.7.6.tgz $ cd Python-2.7.6 $ ./configure --prefix=$HOME $ make $ make install
~/bin にパスを通すために ~/.bash_profile を編集。
# ~/.bash_profile export PATH=~/bin:$PATH
続いて Mercurial をインストール。
# Mercurial # HTML / man 形式のヘルプテキストは不要なので make install-home-bin $ cd ~/src $ tar zxvf Mercurial-3f83fc5cfe71.tar.gz $ cd Mercurial-3f83fc5cfe71 $ make install-home-bin
確認
$ hg version Distributed SCM (version 2.9.2) (see http://mercurial.selenic.com for more information) Copyright (C) 2005-2014 Matt Mackall and others This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
まとめ
依存関係の解決等、もっときちんとしたやり方があるはず。
パッケージ管理コマンドは偉大。
謝辞
不正確な記述、冗長な手順について指摘して下さった @flyingfoozy さん、ありがとうございました><
Windows 環境で hg convert で pserver 接続の CVS リポジトリに接続できない
状況
実際にしたこと
> cvs -d:pserver:user@repository.host:/repo/path checkout somemodule
> hg convert somemodule somemodule-hg
hg convert を実行すると早々に「そんなリポジトリはない」と言われてしまいます。
なぜ?
convert extension は変換元リポジトリ (CVS) の変更履歴を取得しようとしますが、この時に接続情報として以下が必要です。
- "BEGIN AUTH REQUEST"
- CVSROOT
- ユーザー名
- パスワード (気休め程度に暗号化されたもの)
- "END AUTH REQUEST"
これらを LF で結合して送信するのですが、実際に送信したデータを見ると CVSROOT の後ろになぜか CR がありました。
これは convert extension が CVSROOT を作業ディレクトリの管理ファイル (Root) から取得するときの処理が原因でした。
self.cvsroot = open(os.path.join(cvs, "Root")).read()[:-1]
WinCVS なので Root ファイルの改行コードも CRLF になっていて、その CR を取りこぼしてしまったようです *1
「これかー」みたいなことを Twitter で呟いていたら @flyingfoozy さんに「リストから取り出すときに strip() すればいいですよ」と教えて頂いたので、早速試してみたところちゃんと接続出来ました *2
他にも落とし穴が
変換元リポジトリには接続できたのですが、その後の変更履歴を取り出す段になって cvs log コマンドの解析に失敗しているのか、変換後のリポジトリでは全てのリビジョンでファイルが "新規追加" になってしまいました。
リビジョン数も明らかに少なく、@flyingfoozy さんに相談しながら色々と試したのですが、原因究明までは至らずギブアップとなりました。
その後
cygwin の cvs コマンドでチェックアウトしたものを hg convert したら一発で出来ました。
どう見ても不注意です。@flyingfoozy さん本当にすみませんでした。
TokyoVim#18 に参加してきました。
TokyoVim#18 - connpass に参加してきました。
What's TokyoVim?
したこと
勉強会自体が1年ぶりくらいで内心緊張していたのですが、ほんの少しだけ遅刻して会場入りするといつもの TokyoVim な雰囲気でした *2
今日は長いこと更新をサボって陳腐化した vimrc をメンテしようと思っていたのですが、このところ JVM オペコードのリファレンスが欲しいと思っていたこともあり、vim-ref-jvmis を作ることにしました。
vim-ref-jvmis がそれなりに動くようになった後は、git でコミットメッセージを書く時になぜか 'c' が押された状態で Vim が起動してしまう謎現象を人力 bisect したりしていました *3
前回の KPT の Try で「中間成果発表しよう!」というのがあったようで、おやつタイムにプロジェクターを回しながら成果発表をしました。
残念ながら自分はほとんど成果がなかったのですが、周りの方々には大いに刺激を受け、そして学ぶものとても多かったです。
ぜひまた行きたいです。
JVM オペコードのリファレンスビューアが便利
使い方
" Vundle の場合 " vimrc に追記&再読込して :BundleInstall Bundle 'ebc-2in2crc/vim-ref-jvmis' " NeoBundle の場合 " vimrc に追記&再読込して :NeoBundleInstall NeoBundle 'ebc-2in2crc/vim-ref-jvmis'
Jvmis というコマンドが勝手に定義されるので、調べたいオペコードの上にカーソルを置いて :Jvmis を実行すると ref.vim インタフェースでリファレンスを閲覧出来ます。
リファレンスは The Java Virtual Machine Instruction Set から引いて来るので環境によっては一瞬もたつきますが、デフォルトでキャッシュを有効にしているので2回目以降は素早く引くことが出来ます *1
これでバイトコードリーディングがはかどりますね。
brew install mercurial で bin が入らない
現象
Homebrew で Mercurial をインストールしても /usr/local/Cellar/mercurial/<バージョン> に bin が入らない。
ログを見ても特にエラーや警告は出力されていないように見える。
手順
$ brew uninstall mercurial $ brew uninstall python $ brew install python $ brew install mercurial
補足
brew は依存関係を解決してくれるがユーザーが間違って依存関係を壊してしまうこともありえるので、上手くいかなかったら依存関係を疑ってみる、くらいはしてもいいかもしれない。
brew では deps コマンドで依存関係を確認でき、--tree オプションでツリー表示することも出来る。
使うとこんな感じ。
$ brew deps --tree mercurial mercurial |- :python $ brew deps --tree python python |- pkg-config |- openssl | |- makedepend | | |- pkg-config |- readline |- sqlite | |- readline |- gdbm