แถบเลื่อนสำหรับกลุ่ม (เป็นกลุ่มที่ใช้ curses ไม่ใช่ gvim)?


10

ในฐานะผู้ใช้ลีนุกซ์ฉันรู้สึกสบายใจกับเครื่องมือของ CLI และ TUI แต่ฉันคิดถึงแถบเลื่อนเล็ก ๆ ในโปรแกรม GUI เกือบทุกโปรแกรม มันง่ายกว่าสำหรับฉันที่จะรู้ว่าไฟล์อยู่นานแค่ไหนและฉันอยู่ที่ไหนจากแถบเลื่อนแทน "9752 บรรทัด 24%"

สิ่งที่ฉันคาดหวังคือแถบเลื่อน ASCII ที่ดูเหมือนว่า

|
|
|
|
#
#
#
|
|
|

และฉันสามารถกำหนดค่าให้ปรากฏบนด้านซ้ายหรือขวา (และถ้าด้านซ้ายตำแหน่งสัมพัทธ์กับหมายเลขบรรทัดและเครื่องหมายรอยพับ) มีปลั๊กอิน Vim ให้ทำหรือไม่ฉันจะเขียนเองได้ไหม? เฟรมเวิร์กปลั๊กอินของ Vim ไม่สนับสนุนการปรับเปลี่ยน UI ดังกล่าวโดยตรง

คำตอบ:


3

หากคุณกำลังพิจารณาเส้นทาง "เขียนปลั๊กอินของคุณเอง" คุณสมบัติ 'เข้าสู่ระบบ' ของ Vimอาจเป็นจุดเริ่มต้นที่ดี คุณลักษณะนี้เป็นอย่างไรเช่นการตรวจสอบไวยากรณ์เน้นข้อผิดพลาดปลั๊กอิน

ตัวอย่างสัญลักษณ์กลุ่ม

วิธีง่าย ๆ ในการวางเครื่องหมายนั้นจะเป็น:

  1. กำหนดว่าคุณอยู่ที่ไหนในไฟล์เป็นเปอร์เซ็นต์ p
  2. พิจารณาจำนวนบรรทัดที่มองเห็นได้ในหน้าต่าง vim L
  3. วางเครื่องหมายที่หมายเลขบรรทัดที่ใกล้เคียงที่สุด int(p*L)
  4. คำนวณการเคลื่อนที่รอบ ๆ ไฟล์

ขอบคุณ! นี่ใกล้เคียงกับข้อกำหนดที่ระบุไว้ของฉันมาก แต่จากเอกสารดูเหมือนว่าสัญญาณจะถูกวาดทางด้านซ้ายเท่านั้น คำตอบที่ดีได้รับการยอมรับ!
xiaq

10

เป็นไปได้ที่จะใช้สถานะเป็นแถบเลื่อน ฉันเคยมีสิ่งต่อไปนี้ใน. vimrc ของฉันซึ่งเลียนแบบแถบเลื่อน (เช่นเดียวกับมันเป็นแนวนอนเท่านั้น สิ่งนี้ได้ถูกกล่าวถึงในving_use Mailinglist เมื่อหลายปีก่อน

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

ฉันชอบความคิดนี้และอาจจะอยู่กับ pseudo-scrollbar แนวนอนก็ได้ แต่ @redacted นำเสนอวิธีแก้ไขปัญหาที่ใกล้เคียงกับความต้องการ มี +1 ในคำตอบของคุณ ขอบคุณ!
xiaq

คุณจะตั้งค่าสีของเครื่องหมายตำแหน่งเลื่อนของ BG ได้อย่างไร? มันแทบจะแยกไม่ออกจากส่วนที่เหลือของแถบโดยใช้ชุดรูปแบบการทำให้เป็นแสงอาทิตย์บน kde
Mike

เดาจากบรรทัดสุดท้ายว่าใช้กลุ่มผู้ใช้ที่เน้นสี 1 และผู้ใช้ 2 คุณสามารถกำหนดใหม่ได้
Christian Brabandt

6

ความพยายามของฉันในการไถ่ถอน faux faux ก่อนหน้านี้ของฉัน ....

ฉันชอบแนวคิดนี้ดังนั้นวันนี้ฉันเขียนปลั๊กอินสำหรับ VIM เพื่อแสดง 'นิ้วหัวแม่มือ' ของแถบเลื่อนโดยใช้คุณลักษณะเครื่องหมายของเสียงเรียกเข้า

มันยังคงเป็น VERY เบต้า แต่มันใช้งานได้ตอนนี้ฉันยังมีงานต้องทำรวมถึงการพิมพ์เอกสารและความคิดเห็นและเนื้อหาทั้งหมด

ฉันจะโพสต์แหล่งที่มาที่นี่ แต่คุณสามารถดึงมันมาจากHg Repoของฉันได้ (อย่าหัวเราะแรงเกินไปกับเรื่องอื่น)

โปรดจำไว้ว่า ... VERY รุ่นเบต้าถือว่าฉันไม่เคยเขียนปลั๊กอินมาก่อนเลยมี แต่เล่นน้ำใน VimL เป็นเวลาหลายปี (น้อยกว่า 12 ชั่วโมงจากแนวคิดสู่ต้นแบบการทำงาน! yay!)

ฉันจะทำมันต่อไปให้เรียบร้อย สีมีความหรูหราด้วยเหตุผลง่ายต่อการดูการเปลี่ยนแปลง มันมีข้อผิดพลาดใหญ่ในตอนนี้คุณไม่สามารถทำให้สัญญาณหายไปได้โดยการปิดมัน ฉันรู้วิธีการนำสิ่งนี้ไปใช้เพียงต้องการแบ่งปัน


รูปภาพมีประโยชน์:

Vim-Scrollbar ทำงาน


VIM Curses Scrollbar - 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และในฐานะที่เป็นความช่วยเหลือระบุไว้อย่างชัดเจนสิ่งนี้จะใช้ได้กับเสียงเรียกเข้าเวอร์ชั่น gui เท่านั้น
Christian Brabandt

ดี ฉันได้ติดตั้งสิ่งที่คล้ายกันในปลั๊กอิน DynamicSigns BTW: โปรดทราบว่าสัญญาณไม่ถูกวาดบนเส้นที่ถูกพับ
Christian Brabandt

ขอบคุณ! ฉันคิดว่าฉันควรทำเพื่อ foobar ของฉันก่อนหน้านี้จากนั้นฉันก็สนใจมันมากขึ้น ... ดังนั้นฉันจึงเขียนมัน เช่นเคยการทำงานเริ่มต้นนั้นง่าย ... ทำให้ทุกอย่างดูดีและดูดีเป็นสิ่งที่น่าผิดหวัง (ไม่มีร่องรอยของรอยพับ ... ระบุไว้)
lornix

ขอบคุณ! แต่การตัดสินจากข้อมูล @redacted ทำให้เกิดคุณลักษณะการลงชื่อเร็วกว่าคุณดังนั้นจึงอาจมีความสุภาพมากกว่าที่จะยอมรับคำตอบของเขา +1 กับคำตอบของคุณ
xiaq

1
repo ของคุณถูกลบแล้ว มันจะดีมากถ้าคุณสามารถวางสิ่งนี้ไว้ที่ Github และปล่อยให้คนอื่นมีส่วนร่วม ฉันคิดว่ามันดูดีจริงๆ
Mike

0

ไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่คุณสามารถค้นหาว่าคุณอยู่ที่ไหนในไฟล์ที่อยู่ในบรรทัดสถานะด้วยบางสิ่งบางอย่าง

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

หรือใช้set numberเพื่อให้มีหมายเลขบรรทัดก่อนแต่ละบรรทัด

นอกจากว่าคุณจะดัดแปลง vim source (ncurses) แล้วฉันไม่คิดว่ามันเป็นไปได้ แต่ฉันคิดผิด


ขอบคุณ แต่ฉันรู้สิ่งนี้แล้ว ...
xiaq

มันเป็นการยิงที่ยาว
Sardathrion - ต่อต้านการละเมิด 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()ผลงาน แต่ไม่ได้ใช้งานง่าย อาจจำเป็นต้องใช้ตะขอสำหรับแป้นเคลื่อนไหวทั้งหมดหรือดีกว่าหนึ่งตะขอสำหรับเหตุการณ์การเลื่อนหากเป็นไปได้
Ruslan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.