VIM中的持久(粘性)第一行或列

时间:2018-01-17 10:36:13

标签: vim

这可能是一个延伸,但有没有机会编写vim命令脚本,以便第一个(任何?)行始终显示在顶部?第一个(任何)列(由唯一分隔符定义)会不断显示在左侧?

我能做的最好的事情是分割屏幕并最大化底部屏幕,所以像

split %
wincmd w
wincmd _

对于上排是好的,但是当然如果行比屏幕宽,那么它不能很好地工作 - 除非有办法启动一个模式,其中两个窗口的列对齐。

对于持久性列,我不太确定。需要以某种方式获取第一个分隔符(f命令的列,我认为,但我无法使其工作),vsplit %vertical resize,然后切换,wincmd l 。同样,这只有在整个屏幕上的行数较少时才有效。

两者都比较复杂,但可以使用上述方法。我还会将标题行拆分为角落处的空单元格。就同​​步而言,标题必须保留行但在列上同步,反之亦然,对于持久列。

有没有办法创建与主窗口同步的持久行+列设置?在此设置中,删除文件名也很有用。

1 个答案:

答案 0 :(得分:1)

这是我能做的最好的,感谢@ DoktorOSwaldo上面的评论。 F2和F3在绑定的第一列(根据给定的分隔符)和绑定的第一行之间切换。 F4摧毁了两者:

hi cursorcolumn ctermbg=red
function Title_destroy()
    if( winnr() == 1 )
        return 0
    endif
    let oldpos = getpos('.')
    wincmd k
    wincmd j
    hide
    call setpos('.',oldpos)
    set nocul
    set nocuc
endfunction
function Title_bar()
    if( winnr() > 1 )
        call Title_destroy()
    endif
    set nowrap
    split %
    set scb
    wincmd j
    set scb
    wincmd _
    set scrollopt=hor
    set cuc
endfunction
function Col_bar(delim)
    if( winnr() > 1 )
        call Title_destroy()
    endif
    set nowrap
    let oldpos = getpos('.')
    call setpos('.',[oldpos[0],oldpos[1],0,oldpos[3]])
    let width = searchpos(a:delim)[1]+3
    call setpos('.',oldpos)
    vsplit %
    exe 'vertical resize' width
    set scb
    wincmd l
    set scb
    set scrollopt=ver
    set cul
endfunction
nnoremap <F2> :call Title_bar()<CR>
nnoremap <F3> :call Col_bar(nr2char(getchar()))<CR>
nnoremap <F4> :call Title_destroy()<CR>

我无法找到同时做到这两点的方法,因为scrollopt是一个全球性的事情。如果有人想出来,请发表评论或回答。也许以某种方式重载窗口滚动以根据滚动方向更改scrollopt。现在这对于处理大表(对我而言)已经足够了。

升级

  1. 接受数字可选参数相当容易 - 从第一次更改行/列。
  2. 同时拥有粘性行和粘性列。