t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

viという素晴らしくて変なエディタの話

久々にviをいじりたくなった。
といっても会社のPCにはセキュリティの縛りがあってダウンロードできないので、自宅でVBA以外の言語をさわるときくらいしか使っていない。

vi(ブイアイ)というのはUnix系のOSに標準装備されているテキストエディタである。
ほとんどの操作は手をキーボードのホームポジションに置いたままできる。
カーソル移動は矢印キーでもできるが、矢印キーはホームポジションから遠いため、普通はhjklキーでカーソル移動を行う。

viにはノーマルモードと入力モード、EXコマンドモード、ビジュアルモードなどのモードがあり、ノーマルモードでは文字入力はすべてviコマンドとして扱われる。
iで入力モードに移行し、エスケープキーでノーマルモードに戻る。

私が一番気に入っている機能は、あらゆる操作に繰り返し回数が指定できることだ。
たとえば、5jと入力すれば5行下に移動する。
20と入力した後にiで入力モードに入り、例えば--+を入力する。
エスケープを押すと、次のように--+が20個繰り返されて飾りラインが描ける。

--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

yyで現在行をコピー。そのあとに10pとすると、10行分張り付けされる。

慣れるまでとにかく使いづらいエディタであるが、数カ月使っていると、以降vi無しでは生きられなくなる。

さて、そのviの進化形がvimである。
もともとUnix系エディタであるが、Windows版もMac版も存在する。

これをマスターすると何ができるかというのは、以下の動画を見ていただくと分かるかと思う。

画面が黒々として分かりづらいが、最大化してよく見てみると、画面上のコードがパタパタと変化していくのがわかる。
これは早送りしているわけでも、コードがスクロールしているわけでもない。
vimコマンドによって、実際にそのスピードでコードが変更されているのだ。

このように、操作を覚えることで極めて高速にテキスト編集ができる。

まあ、さすがにVBAをわざわざvimで書いたりはしないので最近は触ってなかったが、直近でC系の言語を学びなおそうと思っているのでちょうどリハビリに良いかもしれない。

おまけ 私の_gvimrc

_gvimrcとは、GUI版のvim(gvim)の設定ファイルである。
他のvim使いの方々に比べると全然カスタマイズしていない。
ほぼGUI版のgvimしか使ってないので設定ファイルは_gvimrcにまとめてある。
本当は共通部分は_vimrcに書いたほうが良いがそのへんは適当。

_gvimrc自体をよくいじるので、F12で_gvimrcが開き、F11で_gvimrcを再読み込みするスクリプトを組んである。
_vimrcでも同じことができるので、設定をよくカスタマイズする方にはおすすめ。

また、F5で現在行をコマンドとみなして実行する機能を付けている。
例えば、5jと書いた行でF5を押すと、5行下にジャンプする。

それと、文書編集用とプログラミング用で設定を切り替えられるようにfunctionを作っている。
それぞれ、;dで文書用、;pでプログラミング用へ切り替えできる。

:winpos 380 50
:set number
:set go=none
:colorscheme beachcomber
:map <F12> :80vnew C:\Users\thom\_gvimrc<CR>
:map <F11> :source C:\Users\thom\_gvimrc<CR>
:map <F5> 0y$@"
:map <F9> :set transparency=200<CR>
:map <F10> :set transparency=0<CR>
:set browsedir=last
:set tabstop=3
:set shiftwidth=3
:set nobackup

function! DocumentMode()
	set guifont=HG明朝B:h14
	set linespace=7
endfunction

function! PickUpGal()
	:v/<td/d
	:%s/^.*=&quot;//g
	:%s/&quot.*$//g
	:%s/^.*src="//g
	:%s/".*\n/\t/g
endfunction


function! ProgramMode()
	set guifont=Migu\ 1M:h14
	set linespace=2
endfunction
nmap <silent> ;d :call DocumentMode()<CR>
nmap <silent> ;p :call ProgramMode()<CR>
:call ProgramMode()

:let g:user_emmet_settings = {
\  'indentation' : '  ',
\  'lang' : 'ja'
\}

PickUpGal関数は何だったか忘れた。
たぶん、一時的に特定のHTMLを編集するのに使った残骸だと思う。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。