最近の更新

関連


その他いろいろ

多機能フィードリーダSynapse製作中

2月までは目が回るほど忙しい

MODxでつくる! 最強のCMSサイト カバー
MODxでつくる! 最強のCMSサイト


vim: Dvorak下でもノーマルモードはQWERTYを保つ
の改良です。

langmapを使用し、Dvorak配列使用時(拙作のdvorak.ahkなど)、ノーマルモードなどではQWERTYのように振る舞うスクリプトです。

すなわち、Dvorak配列のcキーを押すと、(QWERTYならこれはiの位置にあるので)挿入モードに移行する、といった挙動を示します。
挿入モードの中では普通にDvorakで入力できます。

dvorak.ahkと併用すると、このdvorak_langmap.vimで得られる効果とは別に、Ctrl修飾はQWERTYに変換される(
例えばDvorakのCtrl-g (QWERTYのCtrl-u)で半ページUpの動作になる)ので、
Ctrl-u/dや入力モード中でのCtrl-r、Ctrl-aなどもQWERTYの気分で使えます。
まあこの辺はそもそもキーの配置よりも、頭文字の意味で決められている感じがするので、わざわざQWERTYに戻す意味は薄いかも知れませんが。

尚、なぜかautocomplpop.vimと併用すると挿入モードで上手く動かないようです。


" dvorak_langmap.vim

" 1
set langmap=[-,]=,[_,]+,\\+,`\\|

" 2
set langmap+='q,\,w,.e,pr,yt,fy,gu,ci,ro,lp,/[,=]
set langmap+=\"Q,<W,>E,PR,YT,FY,GU,CI,RO,LP,?{,+}

" 3
set langmap+=aa,os,ed,uf,ig,dh,hj,tk,nl,s\\;,-'
set langmap+=AA,OS,ED,UF,IG,DH,HJ,TK,NL,S:,_\\"

" 4
set langmap+=\\;z,qx,jc,kv,xb,bn,mm,w\,,v.,z/
set langmap+=:Z,QX,JC,KV,XB,BN,MM,W<,V>,Z?

コメントでlangmapを教えてくださったkanaさま、ありがとうございます。

QWERTYからDvorakに移行する場合、問題になるのがviのキーバインド。Ctrl修飾で区別できるEmacsと違って、ノーマルモードでhjkl等を使うviは覚え直すことが多くなります。
そこでノーマル・ヴィジュアル・入力待ちではDvorakをQWERTY配列に変換するスクリプトを書いてみました。
dvorak.vim

これで本当に常時Dvorak縛りで練習できます。(ちなみにこの文もいらいらしながらDvorakで打っています)

追記: 考えてみたらfやtまで効くのはマズい。可能ならそのうち修正します

標準でありそうで(多分)ないので書いてみた。

nnoremap <C-K><C-K> cw<C-R>0<C-[>
nnoremap <C-K><C-I> ciw<C-R>0<C-[>

ciwを使っているのでVim7.0以降くらい。wbvesに変更すれば多分もっと前のバージョンでも動く。

2007 12 2

OpenGL補完辞書

近々GLをごりごり書くことになりそうなので、vimのn_C-X_C-K補完用のOpenGL辞書を作ってみました。

OpenGL dict

cat /usr/include/w32api/GL/*.h|sed -r '/^GL.*API/{s/.* \*?([a-zA-Z0-9_]+)\s*(\(|;).*/\1/;p};/^#define (GL|gl)/{s/#define ((GL|gl)[a-zA-Z0-9_]+).*?/\1/;p};d'|sort|uniq>gl.dict

(Cygwinの例。他の環境では/usr/include/w32apiの部分を適宜書き換える)

_vimrcに

autocmd BufRead *.c,*.h,*.cpp if search('<GL','n')>0|set dict=$VIMRUNTIME/dict/gl.dict|endif

と記述すると、OpenGLを使用するC/C++ファイルで辞書が有効になります。

GL, GLU, GLEXT, GLUT, GLEWで作ってみた例: gl.dict.gz
なぜか妙なvoidが残るので消してあります。

追記: あれこれやってGLEW on Cygwinに成功したので含めておきました&typo修正

gVim背景画像パッチのセンタリング不具合を修正し、20071127版を公開しました。
今回のバイナリはgVim7.1+KaoriYa版20071028にパッチを当てた物です。

GVim7 for Win32 background image patchを更新し、等倍表示時のセンタリング(縦横独立)に対応しました。

センタリングの例
センタリング

拡大縮小の例
拡大縮小

元画像 [happytreefriends.atomfilms.com (グロ注意)]

視認性のため、やる気を維持するため、Vimの背景にビットマップを表示するパッチを書きました。
タイル・等倍・拡大縮小に対応。
タイル表示の例
ダウンロードは以下のページから。Vim background image patch

vimで<C-W><C-W>でウィンドウ移動するのはよく使いますが、[count]<C-W><C-W>で[count]番目のウィンドウに移れることはあまり知られていないようです。というか自分が知らなかっただけか…

しかし縦だけ、横だけの分割なら左上から1,2,..とウィンドウ番号が振られますが、縦横に分割した場合は一目には番号との対応が分かりづらい。

そこでステータスラインにウィンドウ番号を表示すると少し便利になります。

set statusline=%{winnr('$')>1?':'.winnr().'/'.winnr('$'):''}

勿論これではファイル名も何も表示されなくなってしまうので、すでに書かれているものに適宜加筆します。

ついでにバッファ番号以下よくあるステータスラインとマージした例。

set statusline=[%n%{bufnr('$')>1?'/'.bufnr('$'):''}%{winnr('$')>1?':'.winnr().'/'.winnr('$'):''}] %< %f %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l/%L,%c%V%8P

同SS
vimステータスライン

ただ頻繁に使う1~3の数字がQWERTYではCtrlやWと近く、入力しにくいので<C-W>以外にもマップしておくといいかもしれません。

vimではCursorLine, CursorColumnグループをハイライトすることで罫線が引けますが、ウィンドウ分割するとすべてのウィンドウに表示されて鬱陶しいのでカレントウィンドウにのみ表示するようにしました。

罫線

" カレントウィンドウにのみ罫線を引く
augroup cch
  autocmd! cch
  autocmd WinLeave * set nocursorcolumn nocursorline
  autocmd WinEnter,BufRead * set cursorcolumn cursorline
augroup END

highlight CursorLine ctermbg=black guibg=black
highlight CursorColumn ctermbg=black guibg=black

少し見やすくなった…かもしれない。

Linuxなら端末でF11すればタスクバー等も全部表示されない本物の全画面になりますが、Windows等でgVimを使っていると:FullScreenではタスクバーもタイトルバーも残って画面領域が無駄になります。

Vimのヘルプを眺めていたらguioptionsにキャプションバーを隠すCオプションを見つけたので、全画面最大化トグルスクリプトを書いてみました。

" fullscreen
"-----------------------------------------------------------
nnoremap <F11> :call ToggleFullScreen()<CR>
function! ToggleFullScreen()
  if &guioptions =~# 'C'
    set guioptions-=C
    if exists('s:go_temp')
      if s:go_temp =~# 'm'
        set guioptions+=m
      endif
      if s:go_temp =~# 'T'
        set guioptions+=T
      endif
    endif
    simalt ~r
  else
    let s:go_temp = &guioptions
    set guioptions+=C
    set guioptions-=m
    set guioptions-=T
    simalt ~x
  endif
endfunction

上のスクリプトをvimrcに加えればF11でメニュー・ツールバーは勿論、キャプションもタスクバーも隠した最大化が出来ます。
もう一度F11を押せばメニュー・ツールバーを(元々存在していれば)復元し、元に戻ります。

加えて


set guioptions-=T "ツールバーなし
set guioptions-=m "メニューバーなし
set guioptions-=r "右スクロールバーなし
set guioptions-=R
set guioptions-=l "左スクロールバーなし
set guioptions-=L
set guioptions-=b "下スクロールバーなし

も設定しておくと普段から広くて少し嬉しいかもしれません。

ちなみに自分はAutoHotKeyで普通のアプリケーションのF11最大化トグルを設定していますが、そのままでは今回のスクリプトと衝突するので回避するよう変更しました。

; F11で最大化トグル
F11::
  WinGetClass, className, A
  if(className="Vim") {
    Send,{F11}
    return
  }
  WinGet, State, MinMax, A
  if State != 0
    WinRestore, A
  else
    WinMaximize, A
  return