2014/02/28

君の知らないVimレジスター

この記事は Vim Advent Calendar 2013 90日目の記事になります。

どうも、一足早い春休みに突入したもぷりです。
しかし春と言っても、まだまだ、寒いですねー。
先日からneovimの話題でもちきりですが、Vim本体についての紹介です。


今回はレジスタの話です。
まずは、ヘルプを見てみましょう。
:help registers
レジスタには 9 種類ある: *registers* *E354*
1. 無名レジスタ ""
2. 10個の番号付きレジスタ "0 から "9
3. 小削除用レジスタ "-
4. 26個の名前付きレジスタ "a から "z または "A から "Z
5. 4個の読み取り専用レジスタ ": と ". と "% と "#
6. expression 用レジスタ "=
7. 選択領域用レジスタ "* と "+ と "~
8. 消去専用レジスタ "_
9. 最終検索パターン用レジスタ "/

意外と種類がありますね。
詳しくはそのままヘルプを読めばわかると思います。

そして、このレジスタはなんとインサートモードから呼び出すことが可能です。
やり方はインサートモードで
<C-R> レジスタ
です。


これを使ったテクニックを紹介します。
まずは、実践Vimにも記述されているものです。
<C-R>={何か式}
インサートモードにて入力すると、コマンドモードに=が現れて続けて入力ができます。
例えば、四則演算などの簡単な式を埋め込みたいときなどに有用です。
メモリアドレスの計算なんかしたいときなど
「<C-R>=0xA000 - 0x0909」と打てば「38647」と表示されます。
おっと、これは10進数です。メモリアドレスなんだから当然16進数がいいですね。

ここで、入力できるのは計算式ではなくVimにとっての式であるというのが便利ポイントです。
「<C-R>=printf('0x%x', 0xA000 - 0x0909)」とすると「0x96f7」で入力されます。


次によく使うのは「*」と「+」レジスタの2つです。
このレジスタはシステムのクリップボードの内容を表します。
<C-R>+
これでブラウザなどからコピペできますね。
ターミナルなどを使っていて、普通にインサートモードでコピペを使用とすると、
インデントやPluginなどが動作して崩れる場合があります。
MacとWindowsでは2つは同値らしいですが、Unixでは「+」を使ってください。

これはかなり便利なのでマップしておいたりすると便利です。
逆にシステムクリップボードにヤンクするにはノーマルモードで
「"+yy」でできます。これもマップしておくとよいですね


次には、何かした時に「あー、今のやつをテキストとして入力したい」ということがあると思います。
そういう時に使うのが以下です。
編集中のファイル名 <C-R>%
直前のテキスト     <C-R>.
直前のコマンド     <C-R>:
直前の検索         <C-R>/
このあたりを使いこなすととても便利力があがりますねー


と、今日はここまでにしておきます。

2014/02/20

.vimrcでありがちなミスとかおすすめとか

この記事は Vim Advent Calendar 2013 82日目の記事になります。

\アドベント!/

今回は、みんなの大好きなvimrcの話です。
人のvimrcを見ているととても面白いですが、「あ、これはこうしたほうがいいよな〜」なんて思うことが稀にあります。

そんな間違いや個人的にこうしたほうがいいよって言うものをまとめて見ました。

1. ファイル形式別機能の有効無効設定

これはかなり頻繁に見かける間違いです。
間違い

filetype plugin indent on
filetype indent on
正しい

filetype plugin indent on 
これはhelpを引けばわかります。
:help :filetype-overview
有効無効の設定は一括でできます。



2. カラースキームとシンタックスの有効


これは自分もハマりました。

間違い
colorscheme mopkai
syntax enable
正しい
syntax enable
colorscheme mopkai
順番が大事なのです、逆にするとうまく色がつかない場合があります。
原因は不明です…



3. インデント

この記事を書いていて自分のvimrcのミスに気が付きました

間違い
set smartindent
set cindent

正しい
set smartindent
or
set cindent
これはこちらに書いてあります。
:help smartindent
smartindentはcindentかindentexprが有効なときは意味が無いようです。



4. nocompatible

set nocompatible
これはvimrcを書き始めたらまず書くと思います。
別に間違いではありませんが、これは不要です。
:help compatible
を見てみると、「既定では オン、ファイルvimrcまたはgvimrcが発見されたらオフ」とあります。
つまり、vimrcを書いた時点でnocompatibleになります。


5. 複数の設定値

set backspace=2
set autoindent
set cindent
set expandtab    
set shiftwidth=4
 
これは以下と同様です。
set backspace=2 autoindent cindent expandtab shiftwidth=4  
好きな方を書くといいと思います。
ちなみに自分は末尾にコメントを書くので前者が好きです。


6. 設定値の反転

これも意外と知られていないと思います。
set paste!
set invpaste
ペーストオプションのトグルを行います、2つは同じ意味です。
これをマッピングしておくととても便利です。


7. mapの違い
これはvimrc成長させはじめの人に見受けられます。
Vimのmapまず、「展開するmap」と「展開しないmap」に二分されます。
ちょうどいいので自分のvimrcのメモ書きを貼っておきます。
どのモードでマップするかも大事ですからね。
どうぞコピペしてください。


これのnoreが付いている方が展開しないほうで、ついていないのが展開するものです。
するものは、マップ先にマップされているものがあればそれも評価して実行します。
どちらを使うか考えながらマップしましょう。

2014/02/18

Vimの:makeの引数補完機能付き:Makeを作った。

この記事は Vim Advent Calendar 2013 80日目の記事になります。
書かぬなら、私が書こう、アドベント

はい、もぷりです。
今回も、自作Pluginの紹介です。

Vimには:makeというコマンドがあります。
意外と知らない人もいるかも知れませんので軽く説明を。

このコマンドはいろいろ設定出来るのですが、何も設定しない状態で実行すると

$ make

を実行したのと同じ動作をします。

つまり、Vimを終了せずとも自分で書いたMakefileを実行出来るわけです。
これだけでも結構便利ですね。

しかし、自分の環境では:makeはファイル名の補完しか行ってくれません。
Makefileは生成ファイル名を書くのだからこれでもまあ、悪くはないのですが

$ make clean
$ make all
$ make run

とかの.PHONYをつけるようなターゲットも補完してほしいわけです。

更に、READMEなどもファイルなので候補に上がりますが、個人的に出てきてほしくないです。

なのでPluginを作りました。
こちらです。


ちょっとわかりづらいですがこんなかんじで動きます。

これでmakeしやすくなりましたー