intime o'

宇宙のありとあらゆる知的生命体のみなさんこんにちわ。(ダグラス・アダムス著・安原和見訳「銀河ヒッチハイクガイド」より)
vim script についていくつか 2012/02/07(Tue.)
もうそろそろvimを使い始めて一年になるかもうとっくに一年経ってるかもしれない。
最初に教えてくれればもっと使えるようになってたのに、ということをいくつか。

setコマンド
optionというsetオプションがあり、valueという値を設定する系のset
:set option=value
この=の前後に半角スペースを挟むことは許されない。
また許されないvalueを設定してもすぐにエラーにならない(なることがあるのかも)。

optionが長い単語である場合大抵省略語バージョンが存在する。
例えばfiletypeに対してft、fileencodingに対してfencなど。
その場で一時的に使う場合は略語を使っていけばいいが、個人的にはVim scriptを
外部ファイルとして書いておく場合は後で見て分かりやすいように略語はほどほどにし
できるだけ完全な状態の単語を使う。

optionに入ってる値は
&option で参照できるし代入もできる。
参照して確認するには
:echo &option とすればいいし、setコマンドを使う代わりに
:let &option = value とも出来てしまう(ついさっき自分で見つけた。あんまり驚いたのでこんな記事を
書いている)。letにおいては=の前後に半角スペースがあっても無くても良い。
あった方が個人的には好みだ。

Vimを初めて始める人に何をするべきか。
tutorialを読ませる。辛抱強く読んでくれるならそれが確実に決まっている。
すぐに何か触ってみたい場合はカーソルの動かし方だとかw, b, (, ), % みたいな
少し特殊なカーソルの動かし方(ジャンプのさせ方)とかを使ってみる。

それで満足してvimに興味を持ったら、日本語ヘルプの導入とヘルプの使い方を
覚えること。これは本当に、さっさとするべきだ。ヘルプの使い方なんて長いこと
知らなかった。ずっとデフォルトの、英語のヘルプだったので読もうという
気になれなかった。
日本語ヘルプドキュメントを導入したら :h help をすること。

レジスタ。
全てのアプリケーションはクリップボードにテキストや画像データなんかを
取得、代入することが出来て、そのデータは全てのアプリケーションで共有
しているがVimではテキストを", 0-9, a-z, *, +, =, :, / という名前を
持つ変数に格納し、この変数をレジスタと呼ぶ。
aというレジスタは文脈によって"a, @a, a として用いる。
"というレジスタは無名レジスタであり、レジスタを指定しないときは
このレジスタを利用するのである。
0-9, :, /というレジスタはvimが勝手に代入するものであり、ユーザーは
基本的には取得する場合にしか使わない。
 :reg というコマンドで実際に入っているテキストを一覧で見ることができる。

レジスタの値は、ひとつのウィンドウで表現されるvimの中でローカルである。
違うウィンドウで開いたvimでは共有できない。
但し+はクリップボードである。 これはレジスタとクリップボードがいつも
一致するようになっているので、他のアプリケーションとテキストをやり取り
するのに必須である。

他の大抵のテキストエディタがCopy/Pasteであるのに対し、VimではYank/Putで
ある。言葉の意味はともかく、複数のレジスタから一つを選んでそこに代入、
取得して貼付け、という意味で異なる。

はじめは、自分はこれが面倒に思われて無名レジスタがクリップボードになる
ように設定していた。
:set clipboard+=unamed とこうすればよい。無名レジスタは前述した通り、何も指定せずに切り取りを
すれば保存される先であり、何も指定しなければココにあるテキストを貼り付け
することになるので非常によく使う。だから普通のテキストエディタでいう
クリップボードに実際、相当する。のだが、あんまりにもよく使うので時々困る。
例えばカーソルにあるところの一文字だけを削除はコマンドxで実現されるが、
それで削除された一文字がいちいち無名レジスタに格納される。
クリップボードにテキストを「保存」していたつもりがそれで壊されてしまう
ということが度々起こった。レジスタの使い方もひと通り慣れたので、
これはやめた。つまりクリップボードを使うときは
"+yy "+p などとするようにした。慣れれば大したことじゃない。

今までWindowsのショートカット、おそらくは Ctrl+C、Ctrl+V、Ctrl+Xというこの3つのコマンド
のことであろう、これに慣れてきた人のために、香り屋で配布されているvimには
"mswin.vim"が同梱されている。これは+レジスタをあれこれしているが、
個人的には、こんなのに頼らないほうがよい。それよりもCtrl+AとCtrl+Vには
もともとviのコマンドが割り当てられていたのでそれを使うべきだ。
"mswin.vim"はその二つを壊している。

レジスタの指定方法であるが、大体、ノーマルモードでは"を前に付け、
コマンドモードでは@を前に付け、いくつかのほとんどないコマンドでは何も付けずにそのまま使う

コマンドモード
:let @a = "test" でaレジスタにtestというテキストを代入する。
ノーマルモードで
"ap とすると今aレジスタに入っているテキストをputする。pasteのpではない。
コマンドモードで
;put a これはひとつ前の"apと同じである。

ノーマルモードにおけるコマンドに対応するコマンドモードにおけるコマンド
は大抵存在する。ヘルプ見たってわからない。
:h dd としてみたって、deleteの文字はない。日本語版だとね。
しかしddに対して:deleteが存在する。
:delete とすると
dd とするのと同じ結果になる。もちろんその場で実際にわざわざ冗長な:deleteを使う
機会は無いが、Vim scriptでは大変有用である。

同様にyyに対してyank、pに対してputなど。
Pに対してPutなのかといえばそうではない。Putなんて存在しないのだ。


このwebページと同じように、ブログの一つの記事を使って、vimのコマンドの一覧
を書いてあるサイトなんてのはググればいっくらでも見つかる。でもあれは
最低限それさえ使えれば、というコマンドしかない。Vim scriptを見て、ヘルプを
駆使して自分で勉強するしかない。ステップアップする為の中間を解説する
サイトって、Vimに限らず、どんなプログラミング言語でもそうだよね。
これが一番苦しい時期であり。

で、タブって恥ずかしいことについ最近まで知らなかった。
ウィンドウ分割
:sp
:vsp このへんはどこにでも書いてあるのに
:tabnew これはあんまり書いてなかった。自分はGUI版のgVimを使っているのだが、
メニューの「ファイル」の中身を見てみると、普通にタブがあるんだよね。
CUi版のvimでもタブは使える。
vimは複数のファイルを開くためにいくつもウィンドウを広げたりするような
ものではないから、ウィンドウ分割とタブを駆使しなければならない。
ウィンドウ分割しか知らなかったので大変だった。あーああ。

内部エンコーディング。
自分は香り屋で配布されているvimを使っているが、内部エンコーディング、
プログラム自体が使ってる文字エンコードはcp932である。cp932は
ShiftJISを拡張したもので基本的にそれでもいいのだけど、Unicode文字が
いくつか表示されない。?になる。正直、使い物にならない。
http://sites.google.com/site/fudist/Home/vim-nihongo-ban
これを使うべきだ。
自分はここにあるencode.vimをいただいてプラグインとして導入して、
香り屋のvimを使っている。でも今度はメニューバーの文字列が文字化けした。
つまり、内部エンコーディングってのはそういうことなのね。
メニューバーの文字列はきっとcp932なのかな。
確か解決方法は昔見つけた。適当にググれば見つかるはず。
でも個人的には、メニューバーなんてまず使わない。
だって、キーボードだけで操作できるのが良いのに、メニューバーだなんて。
まあ、Alt+で使うコトもあるけれど、そんな小手先の技をわざわざ使いたく
ない。基本的に使う必要などない。どうしてもできないなら
コマンドをmapしておけばよいのだから。
set guioptions-=m これでメニューバーを隠す。同様にツールバーも
set guioptions-=T 消しちゃう。

カーソル移動はhjklであるが、実際カーソルキー←↓↑→でもカーソル移動は
可能である。でもhjklに十分なれたら、というかさっさと慣れて、カーソルキー
を何か違うものに割り当てたい。
自分はウィンドウ分割した時のウィンドウ移動に割り当てている。
noremap <UP> <C-w>k
noremap <LEFT> <C-w>h
noremap <RIGHT> <C-w>l
noremap <DOWN> <C-w>j
そうだ。mapも初めはよくわからなかった。

mapはノーマルモード用、コマンドモード用、挿入モード用、あとなんかあったけど
主にこの3つ用のmapを使う。あと実際はそれを使ってコレとコレのモードで有効とか
あるけど、もうそんなん気にしてられるか。
ノーマルモード→nmap
コマンドモード→cmap
挿入モード→imap
単にmapとするとどのモードでも有効だが後で乱雑になるので、丁寧にモードを
指定するべきだ。
デフォルトではF1キーはヘルプを開くコマンドに割り当てられているが、
:nmap <F1> ;%yank<CR>
大した意味のあるコマンドじゃないが、例えばこのようにmapすることができる。
F1を押すと半角スペースで区切られた以降右側をユーザーが手で入力する
のを再現する。
:%yank
は全文に対して :yankするという意味。
:から始まるコマンドは最後にエンターキーを押す必要があるので
<Enter>もしくは<CR>を最後に書く。CRのほうが短いし
EnterやReturnがCRの意味であるようなのでCRを使うコトにする。

mapに対してnoremapがある。
:nmap h hこのくらいなら問題ないのに、
:nmap h l
:nmap l h こうするとmapによる展開が無限に繰り返される。
「再帰的マッピング」としてエラーを吐いて実際には実行されない
ので安全。試し見てると良い。
一度展開したらもう展開しないmapがnoremapである。
それ以上展開する必要があるのか、無限の再帰呼び出しにならないか考えて
できるだけnoremapを使うべきだ。
ノーマルモード→nnoremap
コマンドモード→cnoremap
挿入モード→inoremap

またmapにはflagというオプションが用意されている。ヘルプファイルを読んでおくべき。

フォルダ構造。
vimはプラグインをどんどん導入していくことで便利度が増すことが魅力の一つだと思う。
ただはじめはファイル構造を理解していないままプラグインを入れていったので
ゴチャゴチャしていた。
$VIMRUNTIME 実行ファイルvim、即ち本体が保存されているフォルダ。
$VIMRUNTIME/plugin
$VIMRUNTIME/autoload
など autoloadにある*.vimをまず読み込み実行し、vim自体の何かロードをして?、その次に
pluginにある*.vimを読み込み実行していく。

$VIMRUNTIME/../vimfiles/ には何かデータが保存されている。../はひとつ上のディレクトリを表す。

基本的にこっちはユーザーは触らないようにしたい。
それは、他のVimを使う時に設定ファイルなんかは共有したいから。

$HOME OSにもよるがいわゆるホームと呼ばれるフォルダであり、~として表されるディレクトリ。
Windowsなら C:\Users\(ユーザー名) だと思う。
$HOME/vimfiles/plugin
$HOME/vimfiles/autoload なんかにプラグインを入れる。
また設定ファイルは
$HOME/.vimrc (Linuxの場合)
$HOME/_vimrc (Windowsの場合) としてテキストファイルである。
GUIバージョン専用の設定ファイルとしてそれとは別に
_gvimrcなんかもある。自分はどうせgVimしか使わないので全部まとめて書いちゃってる。

というのが、自分が一年程vimを使ってきた感想です. 

コメ(0) | トラ(0)