vim 有没有办法显示当前缓冲区行中的所有列号?

问题描述 投票:0回答:2

如果有一个选项可以显示当前行或所有缓冲区的所有列号,那就太好了,这样我就可以知道到底要导航到哪里。有这样的选项还是我必须自己编程(nooo XD)?

vim
2个回答
7
投票

:h 'statusline'

这就像准确定义您要看到的打印内容一样简单。例如

" RulerStr() comes from http://www.vanhemert.co.uk/vim/vimacros/ruler2.vim
function! RulerStr()
  let columns = &columns
  let inc = 0
  let str = ""
  while (inc < columns)
    let inc10 = inc / 10 + 1
    let buffer = "."
    if (inc10 > 9)
      let buffer = ""
    endif
    let str .= "....+..." . buffer . inc10
    let inc += 10
  endwhile
  let str = strpart(str, 0, columns)
  return str
endfunction

let s:saved_stl = {}
function! s:ToggleRuler()
  let buf = bufnr('%')
  if has_key(s:saved_stl, buf)
    let &l:stl = s:saved_stl[buf]
    unlet s:saved_stl[buf]
  else
    let s:saved_stl[buf] = &l:stl
    setlocal stl=%{RulerStr()}
  endif
endfunction

nnoremap <silent> µ :<c-u>call <sid>ToggleRuler()<cr>

稍微优化的版本(需要 Vim 8.1.1878 的 method 支持)将是:

function! s:precompute_ruler(columns) abort
  let nb = a:columns / 10
  let res = range(1,nb)->map({_,n -> printf('....+% 5d', n)->tr(' ', '.')})->join('')
  return res
endfunction

let s:ruler = s:precompute_ruler(500) " should be more than enough
function! RulerStr2() abort
  return s:ruler[:&columns-1]
endfunction

let s:saved_stl = get(s:, 'saved_stl', {})
function! s:ToggleRuler() abort
  let buf = bufnr('%')
  if has_key(s:saved_stl, buf)
    let &l:stl = s:saved_stl[buf]
    unlet s:saved_stl[buf]
  else
    let s:saved_stl[buf] = &l:stl
    setlocal stl=%{RulerStr2()}
  endif
endfunction

nnoremap <silent> µ :<c-u>call <sid>ToggleRuler()<cr>

5
投票

您可以使用“设置标尺”。它将在底部显示行号和列位置。

© www.soinside.com 2019 - 2024. All rights reserved.