vim에 대한 스크롤 막대 (gvim이 아닌 curses 기반 것)?


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

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

나는 그 아이디어를 좋아하고 아마도 수평 의사 스크롤 막대와 함께 살 수도있다. 그러나 @redacted는 명시된 요구 사항에 더 가까운 솔루션을 제시했습니다. 대답에 +1하십시오. 감사!
xiaq

스크롤 위치 마커의 BG 색상을 어떻게 설정합니까? kde의 태양 테마를 사용하여 나머지 막대와 거의 구별 할 수 없습니다.
Mike

마지막 행부터 추측 그룹 User1 및 User2가 사용되는 것으로 추측하십시오. 재정의 할 수 있습니다.
Christian Brabandt

6

나의 이전 가짜 pas의 구속을위한 나의 시도 ....

저는 아이디어가 마음에 들었습니다. 오늘 VIM의 표시 기능을 사용하여 스크롤 막대 '엄지 손가락'을 표시하는 VIM 용 플러그인을 작성했습니다.

그것은 여전히 ​​베타 베타이지만 지금 사용할 수 있습니다. 모든 문서와 의견 및 내용을 입력하는 것을 포함하여 여전히 할 일이 있습니다.

여기에 소스를 게시 할 것입니다. 그러나 Hg Repo 에서 가져 오기를 환영합니다 . (다른 것들에 대해 너무 웃지 마)

기억하십시오 ... 매우 베타 버전입니다. 플러그인을 한 번도 작성해 본 적이 없으며 수년 동안 VimL 만 사용합니다. (개념부터 작업 프로토 타입까지 12 시간 미만! 예!)

계속해서 노력하겠습니다. 색상은 이유 때문에 화려하며 변경 사항을 쉽게 볼 수 있습니다. 그것은 지금 큰 버그가 있습니다, 당신은 그것을 토글하여 모든 표지판을 사라지게 할 수는 없습니다. 나는 이것을 구현하는 방법을 알고 공유하고 싶었다.


사진이 유용합니다 :

Vim-Scrollbar 작동


VIM Curses Scrollbar-v0.1-L Nix-lornix@lornix.com Hg 레포

" 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 버전에서만 작동합니다.
Christian Brabandt

좋은. DynamicSigns 플러그인에서 비슷한 것을 구현했습니다. BTW : 접힌 선에는 표시가 그려지지 않습니다.
Christian Brabandt

감사합니다! 나는 foobar를 더 일찍 보충해야한다고 생각했다. 그리고 나는 그것에 더 관심을 가지게되었다. 그래서 나는 그것을 썼다. 항상 그렇듯이 초기 작업은 쉽습니다. 모든 것을 멋지고 시원하게 보이게하는 것은 실망스러운 부분입니다. (접힌 흔적이 없습니다 ... 지적)
lornix

감사! 그러나 @redacted 데이터에서 판단하면 서명 기능이 당신보다 일찍 나타 났으므로 그의 대답을 받아들이는 것이 더 예의 바르다. 답변에 +1했습니다.
xiaq

1
리포지토리가 삭제되었습니다. 이것을 github와 같은 곳에 놓고 다른 사람들이 그것에 기여할 수 있다면 좋을 것입니다. 정말 좋아 보인다고 생각합니다.
Mike

0

이상적인 해결책은 아니지만 파일에서 상태 표시 줄에서 다음과 같은 위치를 찾을 수 있습니다.

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

또는 set number각 줄 앞에 줄 번호를 사용 합니다.

vim 소스 (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.