私のお気に入りのVimスクリプトをひとつ紹介したいと思います。
スクロールをスムーズにしてくれる、わずか25行のVimスクリプト。
Vimは標準ではスクロールのコマンドが一瞬でパッと移動してしまうので、どちらの方向に、どれだけ移動したのかが分かりづらいのですが、これを使うと解決できます。
スクロールのコマンド
ここで対象とするスクロールコマンドは以下のとおり。
- <C-D>:半画面下にスクロール
- <C-U>:半画面上にスクロール
- <C-F>:全画面下にスクロール
- <C-B>:全画面上にスクロール
「PageUp/PageDown」のキーがキーボードの押しやすい位置にあったり、マウスにボタンとして付いている場合はこれらもマッピングしておくと便利です。
"<PageDown>と<PageUp>もスムーズスクロール(smooth_scroll.vim)
nnoremap <PageDown> <C-F>
nnoremap <PageUp> <C-B>
ヘルプに載っている方法
実はわざわざsmooth_scroll.vimを使わなくても、Vimのヘルプに載っている以下のようなシンプルな方法でスムーズスクロールは実現できます。(ヘルプの確認は「:h scroll-smooth」で)
:map <C-U> <C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y>
:map <C-D> <C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E>
各コマンドの間に「:sl 2m<CR>」のようにスリープコマンドを入れると、移動速度の調整もできたりします。
実際私も一時期はこの方法を使っていたのですが、このシンプルなスムーズスクロールには画面に表示されている行数に関係なく常に一定行数移動していまうという問題がありました。
smooth_scroll.vim
そこでsmooth_scroll.vimの出番です。
このVimスクリプトは冒頭ご紹介したとおり処理部分が25行程度しかありませんが、画面に表示されている行数に応じて「半画面/全画面」のスムーズスクロールができます。
pluginフォルダに入れておけば<C-D>、<C-F>などのスクロールコマンドを置き換えてくれます。
ただ私の環境ではcursorline(カーソル行の強調表示)が有効になっている場合にスクロールが若干遅くなる現象が見られたため、以下のように修正を加えました。
function! SmoothScroll(dir, windiv, factor)
if &cursorline == 1
set nocursorline
let cursorline_changed_flag = 1
else
let cursorline_changed_flag = 0
end
let wh=winheight(0)
~~~~~~~~~~~~~~~
endwhile
if cursorline_changed_flag == 1
set cursorline
end
endfunction
状態の変化をスムーズに表すことは、使いやすいインターフェースの重要なポイントですね。
ちなみに、これと以前紹介したgdi++.dllのアンチエイリアスを併せて使うと、ちょっとWindowsとは思えないようなリッチな印象に変わります。
※ひとつだけ厄介なのは、上下ウィンドウ端へ向かってスクロールを実行したときにエラー音が連続的に鳴ってしまうことです。よい解決方法があればいいのですが。
参考ページ
- Vimでスムーズスクロール - ボクノス
こちらはヘルプに記載の方法の紹介。高速化も。同じタイトルで投稿しそうになったのでとりあえず「超」を付けてみました。
追記@2011/01/24
- Vimのsmooth scrollを改造 - namutakaの日記
バッファ端でスクロールしないのと、スクロールのスキップ行数設定を追加されています。
Comments»
こんにちは
ファイル端でスクロールするとビープとか画面がフラッシュするっていうのは
smooth_scroll.vim内を次のように修正するとよいですよ
ただし、
^EはCTRL-V、CTRL-E
^YはCTRL-V、CTRL-Y
です、よろしくおねがいします
normal ^Ej
を
normal ^E
if line(”.”) != line(”w$”)
normal j
endif
へ、さらに
normal ^Yk
を
if line(”w0″) != 1
normal k
endif
おぉ、すばらしい。うっとうしい音が消えました。ありがとうございます。後の方もnormal ^Yは必要ですよね。付け足して確認しました。ありがたく使わせていただきます(^^