[vim] 検索時に正規表現を使う
一度にいくつものキーワードをハイライト表示したい場合に正規表現をどう書けばいいのかわからなかった。いや、正規表現の書き方は知っていたけどエスケープすることまでは知らなかった。
/\(keyword1\|keyword2\)
とすると一度に keyword1 と keyword2 の両方をハイライトできる。でもデフォルトで色分けは無理。調べると色分けも可能なようだけどなんかが必要らしい。エスケープするということに関しては普通の正規表現の書き方をして、正規表現に含まれる普通の文字以外をエスケープすればいいような気がする。例えば次のような感じ。
普通の正規表現 | vi の正規表現 |
---|---|
[a-z] | \[a\-z\] |
^.*\.wav$ | \^\.\*\\.wav\$ |
[vim] 自動コミット
オレオレリポジトリにコミットするのにコンパイルチェックなんて必要なのか知らないけれど、とにかくこうするとコミットする回数が増えて、あたかも自分が仕事をしているかのように感じられて嬉しかったりする。:make するときのコマンドを適当なシェルスクリプトに変えて、シェルクスクリプトの中でmakeを呼ぶ。
:set makeprg=sh\ make.sh
$ cat make.sh #!/bin/bash make && svn commit
いつもどおり:makeすると、makeに成功した場合のみmakeが終わってからsvnのログを書けと言われるので、書けばコミットできる。問題は、vimを起動して毎回設定変更しないとだめだということだ。カレントディレクトリに常にmake.shがあるわけではないからな。
[vim] vsplit (縦分割) の幅変更
まずは縦分割して、横幅を変更したいウィンドウにカーソルを移動させる。そして、Ctrl + W >でウィンドウの横幅が広がる。Ctrl + W <でウィンドウの横幅が狭くなる。これだと1文字幅ごとに変更することになるので、Ctrl + W 10>で10文字幅だけウィンドウの横幅を広くすることが出来る。また、Ctrl + W 10<で10文字幅だけウィンドウの横幅を狭くすることが出来る。
[vim] 検索結果の強調表示 (ハイライト)
ハイライトしないとよくわからんが etch の vim はあんまりいろいろ世話を焼いてくれないので自分で設定しておく。
$ echo set hlsearch >> ~/.vimrc
[vim] 色分け (シンタックスハイライト) して表示
もっとも簡単で一時的な変更の場合はvimを起動してesc + :syntax onと入力する。これで当該ウィンドウで開く文書については色分け表示される。
:syntax on
初期状態のvimrcでは色分け表示されていないのでコメントの多い設定ファイルをいじるときに不便。ということで色分け表示をONにしておく。ユーザのホームディレクトリで~/.vimrcにsyntax onを追加すると設定したユーザのみに反映される。
$ echo syntax on>>~/.vimrc
vimrcの大元である/etc/vim/vimrcに追加するとマシンを使う全てのユーザで有効になる。
# echo syntax on>>/etc/vim/vimrc
ubuntuのvim.tinyでは色分け表示できないのでapt-get install vimをする必要があるそうな。debianでもそうなのかな。先にvimパッケージ導入してしまったので良くわからないが。
[vim] 色わけして表示(シンタックスハイライト)
色分けしてくれると良いこといっぱい。例えば、書きながらにしてコンパイル通らない箇所とかを指摘してくれる(全部ではないけれど)。ちょいミスが減らせて便利だと思う。下のようにすれば、ファイル名が*.htmlでないけれど、内容はhtml文書のファイルも色分けして表示してくれて便利。
:set filetype=html
[vim] GNU indent でコード成型
インデントするときはいつもindent -kr hoge.cとかしていたけど、vimでもすぐにできることに気づいた。コマンドモードでgg=GすればOK。気分的な問題だけど、indent -krしてからgg=Gすればいい感じ。indentだけだとなんだかうまくいかない。まぁindentコマンドで制御すればOKなんだけど、そんな根性ないので。
[vim] オートインデントを無効にしてペースト
vimへの流し込みやペーストのとき、キルリングからのペーストだと問題ない。しかし、puttyでマウス選択したものをShift + Insertしたり、screenでC-a {したものをC-a }したりするとオートインデントが効いてしまうため、整形済みテキストをペーストする場合には、せっかくの整形が崩れてしまうので不都合。そんな場合はペーストモードになればよし。
:set paste
これで挿入モードなどの場合にpasteモードになっていることがわかる。この状態でペーストするとオートインデント無でペーストされるので整形済みテキストを形を変えずにペーストできる。
-- INSERT (paste) --
ペーストモードから抜けるには下のようにする。
:set nopaste
[vim] ファイル内容の流し込み
たまに使うが忘れると面倒なものだ。
:r hoge.txt
これを知る前は下のようにしていた。コマンドモードで!を2回。
:.!cat hoge.txt
この方法だと、単純に流し込みする場合はメリット無だが、シェルを起動しているので、HTMLエスケープするためのパイプを通して流し込む場合(html文書のpreタグ中にcのソースを貼る場合)とかは結構つかえる。
:!cat hoge.c | perl htmlescape.pl
htmlescape.plの中身は下のような感じ。
#!/usr/bin/perl -p use HTML::Entities; encode_entities($_,"<>&");
[vim] savevers.vimを使って編集ファイルの世代バックアップを取る
世代バックアップを取るのに前は、bash の関数を ~/. bashrc に追加して使っていました。適当に作った関数だったので、less から vi に渡したときに vi の起動に失敗しました。確か下のような感じだったと思います。
vi(){ cp $1 $1.`date +%Y%m%d%H%M%S`; command vi $1; }
これではまずいので、savevers.vim を導入しました。
$ wget http://www.vim.org/scripts/download_script.php?src_id=261 -O ~/.vim/plugin/savevers.vim $ echo 'set backup' >> ~/.vimrc $ echo ':set patchmode=.clean' >> ~/.vimrc $ echo ':let savevers_types = "*"' >> ~/.vimrc $ echo ':let savevers_dirs = &backupdir' >> ~/.vimrc $ echo ':let versdiff_no_resize=1' >> ~/.vimrc $ echo ':nmap <silent> <F5> :VersDiff -<cr>' >> ~/.vimrc $ echo ':nmap <silent> <F6> :VersDiff +<cr>' >> ~/.vimrc $ echo ':nmap <silent> <F8> :VersDiff -c<cr>' >> ~/.vimrc
削除系のコマンドはこわいのでショートカット登録 (というのかは不明) しなかった。詳しい使い方は savevers.vim の配布ページに載っているのでそこを参照してほしい。
:Purge | 編集中のファイルのバックアップの内最も古いもの以外を全て削除 |
:Purge 0 | 編集中のファイルのバックアップを全て削除 |
:Purge -a 0 | 編集中のファイルのバックアップがあるディレクトリの中にあるバックアップを全て削除(編集中のファイルも編集中でないファイルもとにかく全て) |
ひとつ気付いた事がある。それは、:Purge する場合、削除されるのは新しいファイルからということだ。例えば、:Purge -v N とした場合。1 番目から N 番目までが残り、N + 1 番目以降は消去される。新しいファイルのほうが、数が大きくなるので、古いファイルが残り、新しいファイルが消去されることになる。手動でバックアップファイルを消去して、わざと欠番を作った場合、その欠番を数が小さいほうから順に埋めるようにしてバックアップが作成されるようだ。
[vim] savevers.vimでできたファイルをバックアップしておく
savevers.vimを使っています。プログラムの開発とか、文書書くときに。過去に戻りたい時には最適です。でも、編集して保存した回数だけファイルができるので、ディスクスペースを結構食います。古い履歴ファイルに関して、削除する勇気がいないので、とりあえず圧縮しました。
$ tar cfj FILENAME.tar.bz2 FILENAME.????.clean $ rm -f FILENAME.????.clean
解凍したい時は、下のように。
$ tar xfj FILENAME.tar.bz2
savevers.vimは欠番を埋めるように履歴ファイルを作ります。なので、最も古い0001-0999のファイルだけ圧縮して、それらを削除すると、次は0001番から履歴ファイルが作られてしまいます。0999番と1000番の関係がおかしくなるので全て圧縮しました。