vimのスクロールバー(curviベースのもの、gvimではない)?


10

Linuxユーザーとして、私はCLIおよびTUIツールにかなり慣れていますが、ほとんどすべてのGUIプログラムにある小さなスクロールバーがありません。「9752行、24%」ではなく、ファイルの長さとスクロールバーからの移動先を知るのが常に簡単になりました。

私が期待しているのは、次のようなASCIIスクロールバーです

|
|
|
|
#
#
#
|
|
|

左側または右側に表示されるように構成できます(左側にある場合は、行番号および折りマークとの相対位置)。これを行うためのVimプラグインはすでにありますか、またはどのようにして自分で作成できますか?Vimのプラグインフレームワークは、このようなUIの変更を直接サポートしていないようです。

回答:


3

「独自のプラグインを作成する」ルートを検討している場合は、Vimの「署名」機能から始めるのがよいでしょう。この機能は、たとえば、構文チェックプラグインがエラーを強調表示する方法です。

vimサインの例

標識を配置する簡単な方法は次のとおりです。

  1. ファイル内のどこにいるのかをパーセンテージで判断する p
  2. vimウィンドウに表示される行の数を決定する L
  3. 最も近い行番号に標識を配置します int(p*L)
  4. ファイルの動きに基づいて再計算する

ありがとう!これは私の指定された要件に非常に近いですが、ドキュメントからは、標識は左側にのみ描画できるようです。良い答えですが、受け入れられました!
xiaq 2012

10

ステータスラインをスクロールバーとして使用することができます。以前は、スクロールバーをエミュレートする.vimrcに次のものを使用していました(これも水平方向だけですが、驚くほどうまく機能します)。これは数年前にvim_useメーリングリストで最初に議論されました。

func! STL()
  let stl = '%f [%{(&fenc==""?&enc:&fenc).((exists("+bomb") && &bomb)?",B":"")}%M%R%H%W] %y [%l/%L,%v] [%p%%]'
  let barWidth = &columns - 65 " <-- wild guess
  let barWidth = barWidth < 3 ? 3 : barWidth

  if line('$') > 1
    let progress = (line('.')-1) * (barWidth-1) / (line('$')-1)
  else
    let progress = barWidth/2
  endif

  " line + vcol + %
  let pad = strlen(line('$'))-strlen(line('.')) + 3 - strlen(virtcol('.')) + 3 - strlen(line('.')*100/line('$'))
  let bar = repeat(' ',pad).' [%1*%'.barWidth.'.'.barWidth.'('
        \.repeat('-',progress )
        \.'%2*0%1*'
        \.repeat('-',barWidth - progress - 1).'%0*%)%<]'

  return stl.bar
endfun

hi def link User1 DiffAdd
hi def link User2 DiffDelete
set stl=%!STL()

laststatusオプションが2に設定されていることを確認してください。


コーディングウィンドウからスペースをとらない場所にスクロールバーを配置するので、私はこのソリューションが本当に好きです。ありがとう、クリスチャン!
dotancohen 2012

私はアイデアが好きで、おそらく水平方向の疑似スクロールバーを使用することもできます。しかし、@ redactedは私の指定した要件により近い解決策を提示しました。でもあなたの答えを+1してください。ありがとう!
xiaq 2012

スクロール位置マーカーのBGの色をどのように設定しますか?kdeのsolarizedテーマを使用する他のバーとほとんど区別がつきません。
マイク

最後の行から、強調表示グループUser1およびUser2が使用されていることを推測します。それらを再定義できます。
クリスチャンブラバンド2015年

6

私の以前ののどのパスの償還の私の試み....

私はアイデアが好きだったので、今日はvimの署名機能を使用してスクロールバーの「サム」を表示するVIMのプラグインを作成しました。

それはまだ非常にベータ版ですが、現在は使用可能です。すべてのドキュメントやコメントなどを入力するなど、私はまだそれに取り組む必要があります。

ここにソースを掲載しますが、私のHg Repoからソースをプルしてもかまいません。(他のものよりも強く笑いすぎないでください)

覚えておいてください。非常にベータ版です。これまでプラグインを作成したことがないので、長年VimLに手を出しています。(コンセプトから実用的なプロトタイプまで12時間未満です。そうです!)

少しきちんと作業を続けます。色が理由で派手で、何が変わるかが分かりやすいです。今は大きなバグがあり、それをオフに切り替えることで標識をすべて消すことはできません。私はこれを実装する方法を知っています、ただ共有したかっただけです。


写真は役に立ちます:

動作中のVim-Scrollbar


VIM Cursesスクロールバー-v0.1-L Nix-lornix@lornix.com Hg Repo

" Vim global plugin to display a curses scrollbar
" Version:      0.1.1
" Last Change:  2012 Jul 06
" Author:       Loni Nix <lornix@lornix.com>
"
" License:      TODO: Have to put something here
"
"
if exists('g:loaded_scrollbar')
    finish
endif
let g:loaded_scrollbar=1
"
" save cpoptions
let s:save_cpoptions=&cpoptions
set cpoptions&vim
"
" some global constants
if !exists('g:scrollbar_thumb')
    let g:scrollbar_thumb='#'
endif
if !exists('g:scrollbar_clear')
    let g:scrollbar_clear='|'
endif
"
"our highlighting scheme
highlight Scrollbar_Clear ctermfg=green ctermbg=black guifg=green guibg=black cterm=none
highlight Scrollbar_Thumb ctermfg=red   ctermbg=black guifg=red   guibg=black cterm=reverse
"
"the signs we're goint to use
exec "sign define sbclear text=".g:scrollbar_clear." texthl=Scrollbar_Clear"
exec "sign define sbthumb text=".g:scrollbar_thumb." texthl=Scrollbar_Thumb"
"
" set up a default mapping to toggle the scrollbar
" but only if user hasn't already done it
if !hasmapto('ToggleScrollbar')
    map <silent> <unique> <leader>sb :call <sid>ToggleScrollbar()<cr>
endif
"
" start out activated or not?
if !exists('s:scrollbar_active')
    let s:scrollbar_active=1
endif
"
function! <sid>ToggleScrollbar()
    if s:scrollbar_active
        let s:scrollbar_active=0
        " clear out the autocmds
        augroup Scrollbar_augroup
            autocmd!
        augroup END
        "call <sid>ZeroSignList()
    else
        let s:scrollbar_active=1
        call <sid>SetupScrollbar()
    endif
endfunction

function! <sid>SetupScrollbar()
    augroup Scrollbar_augroup
        autocmd BufEnter     * :call <sid>showScrollbar()
        autocmd BufWinEnter  * :call <sid>showScrollbar()
        autocmd CursorHold   * :call <sid>showScrollbar()
        autocmd CursorHoldI  * :call <sid>showScrollbar()
        autocmd CursorMoved  * :call <sid>showScrollbar()
        autocmd CursorMovedI * :call <sid>showScrollbar()
        autocmd FocusGained  * :call <sid>showScrollbar()
        autocmd VimResized   * :call <sid>showScrollbar()
    augroup END
    call <sid>showScrollbar()
endfunction
"
function! <sid>showScrollbar()
    " not active, go away
    if s:scrollbar_active==0
        return
    endif
    "
    let bnum=bufnr("%")
    let total_lines=line('$')
    let current_line=line('.')
    let win_height=winheight(0)
    let win_start=line('w0')+0 "curious, this was only one had to be forced
    let clear_top=float2nr((current_line * win_height) / total_lines) - 1
    if clear_top < 0
        let clear_top=0
    elseif clear_top > (win_height - 1)
        let clear_top=win_height - 1
    endif
    let thumb_height=float2nr((win_height * win_height) / total_lines)
    if thumb_height < 1
        let thumb_height=1
    elseif thumb_height > win_height
        let thumb_height=win_height
    endif
    let thumb_height=thumb_height + clear_top
    let linectr=1
    while linectr <= clear_top
        let dest_line=win_start+linectr-1
        exec ":sign place ".dest_line." line=".dest_line." name=sbclear buffer=".bnum
        let linectr=linectr+1
    endwhile
    while linectr <= thumb_height
        let dest_line=win_start+linectr-1
        exec ":sign place ".dest_line." line=".dest_line." name=sbthumb buffer=".bnum
        let linectr=linectr+1
    endwhile
    while linectr <= win_height
        let dest_line=win_start+linectr-1
        exec ":sign place ".dest_line." line=".dest_line." name=sbclear buffer=".bnum
        let linectr=linectr+1
    endwhile
endfunction
"
" fire it all up if we're 'active'
if s:scrollbar_active != 0
    call <sid>SetupScrollbar()
endif
"
" restore cpoptions
let &cpoptions=s:save_cpoptions
unlet s:save_cpoptions
"
" vim: set filetype=vim fileformat=unix expandtab softtabstop=4 shiftwidth=4 tabstop=8:

あなたは意味guioptionsし、助けを明確に述べて、これが唯一のvimのGUIバージョンで動作します。
クリスチャンブラバンド

いいね。DynamicSignsプラグインに同様のものを実装しました。ところで:折れ線にはサインが描かれていないことに注意してください。
クリスチャンブラバンド

ありがとうございました!私は自分のfoobarを早く埋め合わせるべきだと思ったので、それにもっと興味を持った...それを書いた。いつものように、最初の作業は簡単です。すべてをかっこよくクールに見せることは、イライラする部分です。(折り目にサインはありません...注記)
lornix 2012

ありがとう!しかし、@ redactedのデータから判断すると、署名機能はあなたより早く登場したので、彼の答えを受け入れるのはおそらくより礼儀正しいでしょう。回答を+1しました。
xiaq 2012

1
リポジトリが削除されました。これをgithubのような場所に置いて、他の人に貢献してもらうことができれば素晴らしいでしょう。本当に素晴らしいと思います。
マイク

0

理想的な解決策ではありませんが、ファイルのどこにあるかをステータス行で確認することができます

set statusline=%<%m\ %f\ %y\ %{&ff}\ \%=\ row:%l\ of\ %L\ col:%c%V\ %P

またはset number、各行の前に行番号を付けるために使用します。

vimソース(ncurses)を変更しない限り、これは可能ではないと思いますが、私は間違っている可能性があります。


おかげで、私はすでにこれを知っていました...私は目に優しいものを探していました。
xiaq 2011

ロングショットでした。
サルダトリオン-SEの悪用に反対

0

これは、マウスでドラッグできるバージョンです。また、スクロールホイールが使用されている場合にのみ更新されます-スクロールバーが必要な場合は、とにかくあなたの手がマウスの上にあるはずです。

sign define scrollbox texthl=Visual text=[]
fun! ScrollbarGrab()
    if getchar()=="\<leftrelease>" || v:mouse_col!=1
        return|en
    while getchar()!="\<leftrelease>"
        let pos=1+(v:mouse_lnum-line('w0'))*line('$')/winheight(0)
        call cursor(pos,1)
        sign unplace 789
        exe "sign place 789 line=".(pos*winheight(0)/line('$')+line('w0')).b:scrollexpr
    endwhile
endfun
fun! UpdateScrollbox()
    sign unplace 789
    exe "sign place 789 line=".(line('w0')*winheight(0)/line('$')+line('w0')).b:scrollexpr
endfun
fun! ToggleScrollbar()
    if exists('b:opt_scrollbar')
        unlet b:opt_scrollbar
        nun <buffer> <leftmouse>
        iun <buffer> <leftmouse>
        nun <buffer> <scrollwheelup>
        nun <buffer> <scrollwheeldown>
        iun <buffer> <scrollwheelup>
        iun <buffer> <scrollwheeldown>
        exe "sign unplace 789 file=" . expand("%:p")
        exe "sign unplace 788 file=" . expand("%:p")
    el
        let b:opt_scrollbar=1
        nno <silent> <buffer> <leftmouse> <leftmouse>:call ScrollbarGrab()<cr>
        ino <silent> <buffer> <leftmouse> <leftmouse><c-o>:call ScrollbarGrab()<cr>
        nno <buffer> <scrollwheelup> <scrollwheelup>:call UpdateScrollbox()<cr>
        nno <buffer> <scrollwheeldown> <scrollwheeldown>:call UpdateScrollbox()<cr>
        ino <buffer> <scrollwheelup> <scrollwheelup><c-o>:call UpdateScrollbox()<cr>
        ino <buffer> <scrollwheeldown> <scrollwheeldown><c-o>: call UpdateScrollbox()<cr>
        let b:scrollexpr=" name=scrollbox file=".expand("%:p")
        exe "sign place 789 line=".(line('w0')*winheight(0)/line('$')+line('w0')).b:scrollexpr
        exe "sign place 788 line=1".b:scrollexpr
    en
endfun

これはマウスでも機能しますが、Ctrl + Fなどでスクロールしても更新されません。マーカーは元の行番号のままです。やっては:call UpdateScrollbox()動作しますが、ユーザーフレンドリーではありません。すべての移動キーにフックが必要な場合があります。可能であれば、スクロールイベントに1つのフックが必要な場合もあります。
ルスラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.