Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vim (CUI) にASCIIベースのスクロールバーを追加する

$
0
0

概要

  • 長いファイルを編集していると迷子になりやすいので、現在どの辺を編集しているのか一目で分かるようにした。
    • 折畳みで多少は改善するのだが。
  • やったことは基本的に https://superuser.com/a/445233の改変と解説。
  • 表示範囲を -で、カーソル位置を @で表示する。
    Capture.PNG

解説不要。使えればいい!

これを vimrc に貼り付けます。以上。

func! STL()let barWidth =&columns / 6let barWidth = barWidth <3 ? 3: barWidth
  letn= line('$')>1 ? line('$')-1: line('$')let buf_top    =(line('w0')-1) * (barWidth -1) / nlet buf_bottom =(line('w$')) * (barWidth -1) / nlet cursor     =(line('.')-1) * (barWidth -1) / nlet n1 = buf_top
  let n2 = cursor - n1
  let n2 = n1 + n2 >= barWidth ? barWidth - n1 -1: n2
  let n3 = buf_bottom - cursor
  let n3 = n1 + n2 + n3 >= barWidth ? barWidth - n1 - n2 -1: n3
  let n4 = barWidth - n1 - n2 - n3 -1let bar ='['.repeat(' ', n1).repeat('-', n2).'@'.repeat('-', n3).repeat(' ', n4).']'let stl_left =' 'let stl_right =' %<%F %m%r%h%w%=[%{&fenc},%{&ff},%Y] (%03l/%03L,%03v) 'return stl_left.bar.stl_right
endfunc
set laststatus=2set statusline=%!STL()

解説

スクロールバーの長さを決める

let barWidth =&columns / 6let barWidth = barWidth <3 ? 3: barWidth

私は1行の1/6にした。お好みで。2行目は例外処理。

バッファ(画面に表示されている範囲)とカーソル位置を取得

letn= line('$')>1 ? line('$')-1: line('$')let buf_top    =(line('w0')-1) * (barWidth -1) / nlet buf_bottom =(line('w$')) * (barWidth -1) / nlet cursor     =(line('.')-1) * (barWidth -1) / n

4行目を例に取ると、カーソル行を line('.')で取得してスクロールバーの長さ barWidthを掛けて、ファイル行数 line('$')のようなもので割っている。

スクロールバー各部分の長さを決める

let n1 = buf_top
  let n2 = cursor - n1
  let n2 = n1 + n2 >= barWidth ? barWidth - n1 -1: n2
  let n3 = buf_bottom - cursor
  let n3 = n1 + n2 + n3 >= barWidth ? barWidth - n1 - n2 -1: n3
  let n4 = barWidth - n1 - n2 - n3 -1

n1, n2, n3, n4はそれぞれ以下の部分。三項演算子を使っているのは和が barWidthを超えないための例外処理。
Capture.PNG

スクロールバーを作る

let bar ='['.repeat(' ', n1).repeat('-', n2).'@'.repeat('-', n3).repeat(' ', n4).']'

各部分を repeat関数で作って .で文字列連結。

残り処理

let stl_left =' 'let stl_right =' %<%F %m%r%h%w%=[%{&fenc},%{&ff},%Y] (%03l/%03L,%03v) 'return stl_left.bar.stl_right
(中略)set laststatus=2set statusline=%!STL()

statuslineに代入したいもののうち、stl_leftstl_rightはスクロールバーの左右に置きたい要素をお好みで。.で文字列連結。

set laststatus=2statuslineを独立行に表示する。set statusline=%!STL()で上記関数の戻り値を statuslineにリアルタイム表示すれば完了!


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>