Vim için kaydırma çubuğu (lanetler tabanlı, gvim değil)?


10

Bir Linux kullanıcısı olarak, CLI ve TUI araçlarıyla oldukça rahatım, ancak neredeyse her GUI programında bulunan küçük kaydırma çubuğunu özlüyorum. Dosyanın ne kadar uzun olduğunu ve "9752 satır,% 24" yerine kaydırma çubuğundan nerede olduğumu bilmek her zaman daha kolay oldu.

Beklediğim ASCII kaydırma çubuğu gibi görünüyor

|
|
|
|
#
#
#
|
|
|

ve solda veya sağda görünecek şekilde yapılandırabilirim (ve solda ise, satır numaralarına ve katlama işaretlerine göreli konum). Bunu yapmak için zaten bir Vim eklentisi var mı, yoksa kendi kodumu nasıl yazabilirim? Vim'in eklenti çerçevesi, bu tür UI değişikliklerini doğrudan desteklemiyor gibi görünüyor.

Yanıtlar:


3

"Kendi eklentinizi yazın" rotasını düşünüyorsanız, Vim'in 'işaret' özelliği başlamak için iyi bir yer olabilir. Bu özellik, örneğin, sözdizimi denetimi eklentilerinin hataları nasıl vurguladığıdır.

vim işareti örneği

Bu durumda işareti yerleştirmek için basit bir yaklaşım:

  1. Yüzde olarak dosyada nerede olduğunuzu belirleyin p
  2. Vim pencerelerinde kaç satır görüneceğini belirleme L
  3. En yakın satır numarasına bir işaret yerleştirin int(p*L)
  4. Dosyanın etrafındaki hareket üzerinde yeniden hesaplama

Teşekkürler! Bu benim belirtilen gereksinimime çok yakın, ancak doktordan işaretler sadece sol tarafa çizilebiliyor gibi görünüyor. İyi cevap olsa da, kabul etti!
xiaq

10

Durum çizgisini kaydırma çubuğu olarak kullanmak mümkündür. Bir kaydırma çubuğunu taklit eden benim .vimrc'de aşağıdakilere sahiptim (ayrıca sadece yatay, ancak şaşırtıcı derecede iyi çalışıyor). Bu aslında birkaç yıl önce vim_use Posta listesinde tartışıldı .

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()

laststatusSeçeneğin 2 olarak ayarlandığından emin olun .


Kaydırma çubuğunu kodlama penceresinden herhangi bir yer kaplamadığı bir yere koyduğundan bu çözümü gerçekten çok seviyorum. Teşekkürler Christian!
dotancohen

Fikri seviyorum ve belki de yatay bir sözde kaydırma çubuğuyla yaşayabilirim. Ancak @redacted, belirtilen gereksinimime daha yakın bir çözüm sundu. cevabınızda +1 olsun. Teşekkürler!
xiaq

Kaydırma konumu işaretleyicisinin BG'sinin rengini nasıl ayarlarsınız? Kde'deki solarize temayı kullanarak barın geri kalanından neredeyse ayırt edilemez.
Mike

Son satırlardan, User1 ve User2 vurgulama gruplarının kullanıldığını tahmin edin. Onları yeniden tanımlayabilirsiniz.
Christian Brabandt

6

Benim önceki sahte pas itfa girişimi ....

Bu fikri beğendim, bu yüzden bugün VIM'in vim işaretleri özelliğini kullanarak bir kaydırma çubuğu 'başparmak' göstermesi için bir eklenti yazdım.

Hala ÇOK beta, ama şu anda kullanılabilir, hala tüm dokümanlar ve yorumlar ve şeyler yazmak da dahil olmak üzere üzerinde yapılacak işlerim var.

Kaynağı buraya göndereceğim, ancak Hg Repo'mdan çekebilirsin . (Diğer şeylere çok fazla gülme)

Unutmayın ... ÇOK beta, daha önce hiç eklenti yazmadığım, yıllar boyunca VimL'de sadece göz kamaştırdığı düşünüldüğünde. (konseptten çalışma prototipine 12 saatten az! yay!)

Üzerinde çalışmaya devam edeceğim, biraz temiz. Renkler bir nedenden dolayı cafcaflı, ne değiştiğini görmek kolay. Şu anda büyük bir böceği var, işaretleri kapatarak hepsini ortadan kaldıramazsınız. Bunu nasıl uygulayacağımı biliyorum, sadece paylaşmak istedim.


Resimler yararlıdır:

Vim-Scrollbar çalışıyor


VIM Lanetler Kaydırma Çubuğu - 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:

Yani guioptionsve yardım açıkça belirtildiği gibi, bu sadece vim'in gui sürümü için çalışır.
Christian Brabandt

Güzel. DynamicSigns eklentisine benzer bir şey uyguladım. BTW: işaretlerin katlanmış çizgiler üzerine çizilmediğine dikkat edin.
Christian Brabandt

Teşekkür ederim! Foobarımı daha önce telafi etmem gerektiğini düşündüm, sonra daha fazla ilgilenmeye başladım ... bu yüzden yazdım. Her zaman olduğu gibi, ilk çalışma kolaydır ... her şeyi şık ve havalı görmek sinir bozucu kısımdır. (kıvrımlarda işaret yok ... kaydetti)
lornix

Teşekkürler! Ancak @redacted verilerinden yargılamak, işaret özelliğini sizden daha erken getirdi, bu yüzden cevabını kabul etmek belki daha kibar. Cevabınızı + 1'leyin.
xiaq

1
Reponuz kaldırıldı. Bunu github gibi bir yere koyabilir ve başkalarının katkıda bulunmasına izin vermeniz harika olurdu. Gerçekten harika göründüğünü düşünüyorum.
Mike

0

İdeal bir çözüm değil ancak dosyada durum satırında nerede olduğunuzu öğrenebilirsiniz.

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

veya set numberher satırdan önce bir satır numarasına sahip olmak için kullanın.

Vim kaynağını (ncurses) değiştirmediyseniz, bunun mümkün olduğunu düşünmüyorum ama yanlış olabilirim.


Teşekkürler ama bunu zaten biliyordum ... Sadece göze daha kolay bir şey arıyordum.
xiaq

Uzun bir atıştı.
Sardathrion - SE kötüye karşı

0

İşte fareyle sürüklenebilen bir sürüm. Ayrıca yalnızca kaydırma tekerleği kullanıldığında güncellenir - bir kaydırma çubuğuna ihtiyacınız varsa, eliniz yine de farenin üzerinde olmalıdır.

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

Bu, fare için işe yarar, ancak örneğin Ctrl + F ile kaydırdığınızda güncellenmez. İşaretçi orijinal satır numarasında kalıyor gibi görünüyor. Yapmak :call UpdateScrollbox()işe yarıyor ama kullanıcı dostu değil. Mümkünse, tüm hareket tuşlarında kancaya veya kaydırma olayında bir kancaya ihtiyaç duyabilir.
Ruslan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.