Thanh cuộn cho vim (dựa trên lời nguyền, không phải gvim)?


10

Là một người dùng Linux, tôi khá thoải mái với các công cụ CLI và TUI, nhưng tôi nhớ thanh cuộn nhỏ có trong hầu hết mọi chương trình GUI. Tôi luôn dễ dàng biết được tệp này dài bao nhiêu và tôi ở đâu từ thanh cuộn thay vì "9752 dòng, 24%".

Những gì tôi mong đợi là một thanh cuộn ASCII trông giống như

|
|
|
|
#
#
#
|
|
|

và tôi có thể cấu hình để xuất hiện ở bên trái hoặc bên phải (và nếu ở bên trái, vị trí tương đối với số dòng và dấu gấp). Đã có một plugin Vim để làm điều này, hoặc làm thế nào tôi có thể viết một cái của riêng tôi? Khung plugin của Vim dường như không hỗ trợ trực tiếp các sửa đổi UI như vậy.

Câu trả lời:


3

Nếu bạn đang xem xét lộ trình "viết plugin của riêng bạn", tính năng 'dấu hiệu' của Vim có thể là một nơi tốt để bắt đầu. Tính năng này là cách ví dụ, các lỗi kiểm tra cú pháp làm nổi bật các lỗi.

ví dụ dấu hiệu vim

Một cách tiếp cận đơn giản để đặt dấu hiệu sau đó sẽ là:

  1. Xác định vị trí của bạn trong tệp theo tỷ lệ phần trăm p
  2. Xác định có bao nhiêu dòng có thể nhìn thấy trong các cửa sổ vim L
  3. Đặt một dấu hiệu ở số dòng gần nhất với int(p*L)
  4. Tính toán lại chuyển động xung quanh tập tin

Cảm ơn! Điều này rất gần với yêu cầu đã nêu của tôi, mặc dù từ tài liệu có vẻ như các dấu hiệu chỉ có thể được vẽ ở phía bên trái. Câu trả lời tốt mặc dù, được chấp nhận!
xiaq

10

Có thể sử dụng dòng trạng thái như một thanh cuộn. Tôi đã từng có phần sau trong .vimrc của mình, nó mô phỏng một thanh cuộn (cũng chỉ là theo chiều ngang, nhưng nó hoạt động tốt một cách đáng ngạc nhiên). Điều này ban đầu đã được thảo luận trên danh sách gửi thư vim_use vài năm trước.

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

Hãy chắc chắn rằng bạn có laststatustùy chọn được đặt thành 2.


Tôi thực sự thích giải pháp này vì nó đặt thanh cuộn ở nơi không chiếm bất kỳ khoảng trống nào từ cửa sổ mã hóa. Cảm ơn, Christian!
dotancohen

Tôi thích ý tưởng này, và thậm chí có thể sống với một thanh cuộn giả ngang. Nhưng @redacted trình bày một giải pháp gần hơn với yêu cầu đã nêu của tôi. có +1 trên câu trả lời của bạn mặc dù. Cảm ơn!
xiaq

Làm cách nào để bạn đặt màu của dấu vị trí cuộn BG? Nó gần như không thể phân biệt được với phần còn lại của thanh sử dụng chủ đề năng lượng mặt trời trên kde.
Mike

Đoán từ các dòng cuối cùng, rằng các nhóm đánh dấu User1 và User2 được sử dụng. Bạn có thể xác định lại chúng.
Christian Brabandt 6/03/2015

6

Nỗ lực của tôi để chuộc lại pas giả trước đó của tôi ....

Tôi thích ý tưởng này, vì vậy hôm nay tôi đã viết một plugin cho VIM để hiển thị thanh cuộn 'ngón tay cái' bằng cách sử dụng tính năng dấu hiệu của vim.

Nó vẫn còn RẤT beta, nhưng hiện tại nó có thể sử dụng được, tôi vẫn còn việc phải làm, bao gồm cả việc gõ tất cả các tài liệu và nhận xét và nội dung.

Tôi sẽ đăng nguồn ở đây, nhưng bạn có thể lấy nó từ Hg Repo của tôi . (Đừng cười quá nhiều so với những thứ khác)

Hãy nhớ rằng ... RẤT beta, vì tôi chưa bao giờ viết plugin trước đây, chỉ học hỏi về VimL trong những năm qua. (chưa đầy 12 giờ từ ý tưởng đến nguyên mẫu hoạt động! yay!)

Tôi sẽ tiếp tục làm việc với nó, hơi gọn gàng. Các màu sắc sặc sỡ vì một lý do, dễ dàng để xem những gì thay đổi. Nó có một lỗi lớn ngay bây giờ, bạn không thể làm cho tất cả các dấu hiệu biến mất bằng cách tắt nó đi. Tôi biết làm thế nào để thực hiện điều này, chỉ muốn chia sẻ.


Hình ảnh rất hữu ích:

Vim-Scrollbar đang hoạt động


Thanh cuộn 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:

Bạn có nghĩa là guioptionsvà như sự giúp đỡ nêu rõ, điều này chỉ hoạt động cho phiên bản gui của vim.
Christian Brabandt

Đẹp. Tôi đã triển khai một cái gì đó tương tự trong plugin DynamicSigns. BTW: lưu ý rằng các dấu hiệu không được vẽ, trên các đường gấp.
Christian Brabandt

Cảm ơn bạn! Tôi hình dung tôi nên bù đắp cho foobar của mình sớm hơn, sau đó tôi có hứng thú hơn với nó ... vì vậy tôi đã viết nó. Như mọi khi, công việc ban đầu rất dễ dàng ... làm cho nó trở nên gọn gàng và đẹp mắt là phần khó chịu. (không có dấu hiệu nào về nếp gấp ... ghi chú)
lornix

Cảm ơn! Nhưng đánh giá từ dữ liệu @redacted đã đưa ra tính năng ký hiệu sớm hơn bạn, vì vậy có lẽ sẽ lịch sự hơn khi chấp nhận câu trả lời của anh ấy. Có + 1'ed cho câu trả lời của bạn.
xiaq

1
Repo của bạn đã được gỡ bỏ. Sẽ thật tuyệt nếu bạn có thể đặt nó lên một nơi nào đó như github và để người khác đóng góp cho nó. Tôi thực sự nghĩ rằng nó trông tuyệt vời.
Mike

0

Không phải là một giải pháp lý tưởng nhưng bạn có thể tìm ra vị trí của tệp trong dòng trạng thái với một cái gì đó như

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

hoặc sử dụng set numberđể có một số dòng trước mỗi dòng.

Trừ khi bạn sửa đổi nguồn vim (ncurses) thì tôi không nghĩ điều này là có thể nhưng tôi có thể sai.


Cảm ơn nhưng tôi đã biết điều này ... Tôi chỉ đang tìm kiếm thứ gì đó dễ dàng hơn trong mắt.
xiaq

Đó là một cú sút xa.
Sardathrion - chống lại lạm dụng SE

0

Đây là phiên bản có thể kéo được bằng chuột. Nó cũng chỉ cập nhật khi con lăn đang được sử dụng - nếu cần một thanh cuộn, tay của bạn phải ở trên chuột.

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

Điều này không hoạt động đối với chuột, nhưng không được cập nhật khi bạn cuộn với ví dụ Ctrl + F. Điểm đánh dấu dường như vẫn còn trong số dòng ban đầu của nó. Làm :call UpdateScrollbox()việc, nhưng không thân thiện với người dùng. Có thể cần móc trên tất cả các phím di chuyển, hoặc, tốt hơn, một móc trên sự kiện cuộn, nếu có thể.
Ruslan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.