jump to navigation

Vimで超スムーズスクロール

2008-02-10 09:45 Posted by
nase
in : プログラミング
snowman.jpg

私のお気に入りの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とは思えないようなリッチな印象に変わります。

※ひとつだけ厄介なのは、上下ウィンドウ端へ向かってスクロールを実行したときにエラー音が連続的に鳴ってしまうことです。よい解決方法があればいいのですが。

参考ページ

追記@2011/01/24

Comments»

1. ゲスト - 2008-9-17

こんにちは
ファイル端でスクロールするとビープとか画面がフラッシュするっていうのは
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

2. nase - 2008-9-17

おぉ、すばらしい。うっとうしい音が消えました。ありがとうございます。後の方もnormal ^Yは必要ですよね。付け足して確認しました。ありがたく使わせていただきます(^^


*Comments and trackbacks will appear after it is approved by the administrator.