surround.vimの使い方で気づいたこと

surround.vimがいつからかVisual mode+sで起動しなくなり、Visual mode+Sにキーバインドが変更になった。

Visual mode+sを普通に使っていた僕にとってこれは手痛い変更。Visual選択してからShift押してsなんて、かったるくてやってられない。

しかし改めてドキュメントを読んでいると、ys+[なんたら]が強力であることが分かって、そっちに乗り換えるのが正しい使い方なんだろうなと思った。

例えばこれを

<h1>大見出し</h1>

こうしたいとする

<h1><a href="#">大見出し</a></h1>

今までは

vits<a href="#"<Enter>

とやっていた(Visual modeでタグの内側を選択してからsでsurround.vimを起動してタグを打ち込んでEnter)。 でも今はこうしなきゃいけない。

vitS<a href="#"<Enter>

途中でShift+sは苦痛。 しかしこうできることが分かった。

ysit<a href="#"<Enter>

(タグの内側に対してsurround.vimを起動。タグを打ち込んでEnter)
久しぶりに「おおっ」と思った気づきなので、思わす記事を書いてしまった。

世間ではVim Advent Calendar 2011をやってるみたいです。Check it out!!

Re: gVim でウィンドウの位置とサイズを記憶する

マルチモニタ環境で、セカンドモニタにVimを開いた状態で:tabeとか:vspするとメインモニタにVimが何故か強制的に移動してしまい困っていました。それを見事解決できたのがこちらのVim Script。

Vim-users.jp – Hack #120: gVim でウィンドウの位置とサイズを記憶する

このスクリプトを.gvimrcに書き込んでおけば、$HOME.vimwinposというファイルが作られそこに前回Vim終了時のウィンドウのX座標、Y座標、横幅、縦幅が保存されます。

1点気をつけるべき点がありました。.gvimrc内にtransparencyオプションの設定がしてある場合、それより後に書かないとウィンドウの位置が強制的にメインモニタ内に移動してしまいます。
(理由は定かではありませんがtransparencyオプションが使用するWindowsの描画機能の影響・・・?)
これを回避できれば全く問題なしです。ありがとうございました!

autocomplpop.vimでclass属性値入力時に出るエラーを回避する

KaoriYaのWindows版Vimにautocomplpop.vimを入れると以下のスクリーンショットのようなエラーが出るようになります。

スクリーンショット:class属性値を入力するとエラーが出て鬱陶しい

コレ、HTMLのclass属性値を入力しようとすると出るエラーなのですが、どうやら編集中のHTMLファイルに関連付けられているCSSを見に行って、そこに定義されていないクラスを入力しようとすると出るようです。便利なようですが、スクリプトのために書くclass属性値もなんかもあるわけで、そういうのでいちいちエラー窓が開いていては入力しにくくて仕方ありません。
そこで、このエラーが出ないようにする、というか、class属性値をいちいちチェックしないようにする方法を。

まずVimのホームディレクトリから runtime/autoload/ とたどっていくと htmlcomplete.vim というファイルがあります。つまり、コレですね $VIMRUNTIME/autoload/htmlcomplete.vim
コレの中身を以下のように編集します。

245〜256行目

        "let headclasslines = filter(copy(styleheadlines), "v:val =~ '\\([a-zA-Z0-9:]\\+\\)\\?\\.[a-zA-Z0-9_-]\\+'")
else
let stylesheet = split(headjoined, '[{}]')
" Get all lines which fit id syntax
"let classlines = filter(copy(stylesheet), "v:val =~ '#[a-zA-Z0-9_-]\\+'")
" Filter out possible color definitions
"call filter(classlines, "v:val !~ ':\\s*#[a-zA-Z0-9_-]\\+'")
" Filter out complex border definitions
"call filter(classlines, "v:val !~ '\\(none\\|hidden\\|dotted\\|dashed\\|solid\\|double\\|groove\\|ridge\\|inset\\|outset\\)\\s*#[a-zA-Z0-9_-]\\+'")
"let templines = join(classlines, ' ')
"let headclasslines = split(templines)
"call filter(headclasslines, "v:val =~ '#[a-zA-Z0-9_-]\\+'")

294〜313行目

            "let classlines = filter(copy(stylesheet), "v:val =~ '\\([a-zA-Z0-9:]\\+\\)\\?\\.[a-zA-Z0-9_-]\\+'")
else
let stylesheet = split(stylefile, '[{}]')
" Get all lines which fit id syntax
"let classlines = filter(copy(stylesheet), "v:val =~ '#[a-zA-Z0-9_-]\\+'")
" Filter out possible color definitions
"call filter(classlines, "v:val !~ ':\\s*#[a-zA-Z0-9_-]\\+'")
" Filter out complex border definitions
"call filter(classlines, "v:val !~ '\\(none\\|hidden\\|dotted\\|dashed\\|solid\\|double\\|groove\\|ridge\\|inset\\|outset\\)\\s*#[a-zA-Z0-9_-]\\+'")
"let templines = join(classlines, ' ')
"let stylelines = split(templines)
"let classlines = filter(stylelines, "v:val =~ '#[a-zA-Z0-9_-]\\+'")
endif
endif
" We gathered classes definitions from all external files
"let classes += classlines
endfor
if internal == 1
"let classes += headclasslines

つまり、classlinesというコードが登場する行を全てコメントアウトします。こうしたら、エラーが出なくなりました。

スマートな方法ではありませんが、とりあえず普通に動くのでOKってことで。

vimrcをリローダブルにしてみた

Vimの極め方を読んで、ごにょごにょといろいろやったことの中から、リローダブルなvimrcに関する部分をメモ。

vimrcにキーマップを書き込む時、以下のように書くとコマンドが登録できます。
以下の例はノーマルモードの時に<Space>s.と入力するとコマンドを実行する例。<Space>はスペースキーのこと。

nnoremap <Space>s.
\        :<C-u>任意のコマンド<CR>

こっちの書き方でもOK。

nnoremap <Space>s. <Esc>:<C-u>任意のコマンド<CR>

というわけで、vimrcをリローダブルにしてみました。

私の環境ではWindowsにKaoriyaのGVimという環境なので、以下のように書きました。<Space>s.でvimrc、<Space>gs.でgvimrcを<Space>s.でvimrcとgvimrcをリロードします。

nnoremap <Space>s.
\        :<C-u>source $VIM\vimrc<CR> :<C-u>source $VIM\gvimrc<CR>

こっちの書き方でも(ry

nnoremap <Space>s. :<C-u>source $VIM\vimrc<CR> :<C-u>source $VIM\gvimrc<CR>

それからこの設定をしただけだと、このコマンドを実行しようとするとなぜか「コマンドが既にあります: 再定義するには ! を追加してください」というエラーが出ましたので、エラーメッセージにある vimディレクトリ\runtime\vimrc_example.vim の85行目、commandcommand!に修正です。

「コマンドが既にあります: 再定義するには ! を追加してください」というエラー

これでvimrc、gvimrcがリローダブルになりました。やった!
そういえばVimのネタをブログに書くのは初めてかも。

追記 – 2009-08-09

  • $VIMとすればvimディレクトリに、$HOMEとすればホームディレクトリが表現できることに気づいたので、コードを修正。
  • vimrcとgvimrcを両方いっぺんにリロードした方がいいじゃん!ということに気づき、こちらも修正。