9

这是生成 Markdown 大纲的 vim 脚本:

fun! TOC()
    call setloclist(0, [])
    let save_cursor = getpos(".")
    call cursor(1, 1)
    while search("^#", 'W') > 0
       let msg = printf('%s:%d:%s', expand('%'), line('.'), substitute(getline('.'), '#', '»', 'g'))
       laddexpr msg
    endwhile
    call setpos('.', save_cursor)
endfun

com! -bar TOC call TOC()

示例降价文件:https ://github.com/progit/progit/raw/master/zh/01-introduction/01-chapter1.markdown


运行:TOC命令后,这是快速列表:

01-chapter1.markdown|5| »» 关于版本控制 »»
01-chapter1.markdown|11| »»» 本地版本控制系统 »»»
01-chapter1.markdown|22| »»» 集中化的版本控制系统 »»»
01-chapter1.markdown|33| »»» 分布式版本控制系统 »»»
01-chapter1.markdown|42| »» Git 简史 »»
01-chapter1.markdown|56| »» Git 基础 »»
01-chapter1.markdown|60| »»» 直接记录快照,而非差异比较 »»»
01-chapter1.markdown|74| »»» 近乎所有操作都是本地执行 »»»
01-chapter1.markdown|82| »»» 时刻保持数据完整性 »»»
01-chapter1.markdown|92| »»» 多数操作仅添加数据 »»»
01-chapter1.markdown|98| »»» 文件的三种状态 »»»
01-chapter1.markdown|121| »» 安装 Git »»
01-chapter1.markdown|125| »»» 从源代码安装 »»»
01-chapter1.markdown|152| »»» 在 Linux 上安装 »»»
01-chapter1.markdown|162| »»» 在 Mac 上安装 »»»
01-chapter1.markdown|177| »»» 在 Windows 上安装 »»»
01-chapter1.markdown|185| »» 初次运行 Git 前的配置 »»
01-chapter1.markdown|197| »»» 用户信息 »»»
01-chapter1.markdown|206| »»» 文本编辑器 »»»
01-chapter1.markdown|212| »»» 差异分析工具 »»»
01-chapter1.markdown|220| »»» 查看配置信息 »»»
01-chapter1.markdown|240| »» 获取帮助 »»
01-chapter1.markdown|254| »» 小结 »»

我想将快速修复条目格式化为:

|005| »» 关于版本控制 »»
|011| »»» 本地版本控制系统 »»»
|022| »»» 集中化的版本控制系统 »»»
|033| »»» 分布式版本控制系统 »»»
|042| »» Git 简史 »»
|056| »» Git 基础 »»
|060| »»» 直接记录快照,而非差异比较 »»»
|074| »»» 近乎所有操作都是本地执行 »»»
|082| »»» 时刻保持数据完整性 »»»
|092| »»» 多数操作仅添加数据 »»»
|098| »»» 文件的三种状态 »»»
|121| »» 安装 Git »»
|125| »»» 从源代码安装 »»»
|152| »»» 在 Linux 上安装 »»»
|162| »»» 在 Mac 上安装 »»»
|177| »»» 在 Windows 上安装 »»»
|185| »» 初次运行 Git 前的配置 »»
|197| »»» 用户信息 »»»
|206| »»» 文本编辑器 »»»
|212| »»» 差异分析工具 »»»
|220| »»» 查看配置信息 »»»
|240| »» 获取帮助 »»
|254| »» 小结 »»

我找不到任何选择。如果你知道,请告诉我。谢谢!

4

3 回答 3

10

无法配置快速修复位置的显示方式。只能通过errorformat选项指定如何解释它们。但是,可以使用隐藏功能在快速修复或位置列表窗口中隐藏文件名。

| 以下命令启用隐藏并定义与行首第一个字符之前的任何文本匹配的语法规则 。

:set conceallevel=2 concealcursor=nc
:syntax match qfFileName /^[^|]*/ transparent conceal

可以使用自动命令为每个快速修复或位置列表窗口触发这些命令。然而,这通常不是一个好主意,因为在大多数情况下显示文件名是一个有用的功能。

对于问题中提出的情况,最好仅对新收集的位置列表进行这些自定义。不过,它需要先打开位置列表窗口。

:lopen
:set conceallevel=2 concealcursor=nc
:syntax match qfFileName /^[^|]*/ transparent conceal
于 2012-06-26T07:40:36.927 回答
1

我最终在这个 PR(带有 GIF 动画)上的plasticboy/vim-markdown上实现了这个,使用+ 替换而不是用一些东西隐藏:set modifiable

function! b:Markdown_Toc()
    silent lvimgrep '^#' %
    vertical lopen
    let &winwidth=(&columns/2)
    set modifiable
    %s/\v^([^|]*\|){2,2} #//
    for i in range(1, line('$'))
        let l:line = getline(i)
        let l:header = matchstr(l:line, '^#*')
        let l:length = len(l:header)
        let l:line = substitute(l:line, '\v^#*[ ]*', '', '')
        let l:line = substitute(l:line, '\v[ ]*#*$', '', '')
        let l:line = repeat(' ', (2 * l:length)) . l:line
        call setline(i, l:line)
    endfor
    set nomodified
    set nomodifiable
endfunction

但您可能更喜欢:

Plugin 'plasticboy/vim-markdown'

由你决定。=)

截屏:

在此处输入图像描述

于 2014-03-29T21:42:43.947 回答
0

试试这个:

fu s:TOC() abort
    call setloclist(0, [])
    let curfile = expand('%:p')
    let save_cursor = getpos('.')
    call cursor(1, 1)
    while search('^#', 'W') > 0
       let msg = printf('%s:%d:%s',
           \ curfile,
           \ line('.'), getline('.')->substitute('#', '»', 'g')
           \ )
       laddexpr msg
    endwhile
    call setpos('.', save_cursor)
    call setloclist(0, [], 'r', {
        \ 'lines': getloclist(0)
        \     ->map('curfile .. "|" .. v:val.lnum .. " " .. v:val.col .. "|" .. v:val.text'),
        \ 'efm': '%f|%l %c|%m',
        \ 'quickfixtextfunc': function('s:quickfixtextfunc'),
        \ })
endfu

fu s:quickfixtextfunc(info) abort
    let ll = getloclist(a:info.winid, {'id': a:info.id, 'items': 0}).items
    let lnum_width = range(a:info.start_idx - 1, a:info.end_idx - 1)
        \ ->map({_, v -> ll[v].lnum})
        \ ->max()
        \ ->len()
    let formatted_lines = []
    for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
        let e = ll[idx]
        let fname = bufname(e.bufnr)->fnamemodify(':t')
        let line = printf('|%0*s| %s', lnum_width, e.lnum, e.text)
        call add(formatted_lines, line)
    endfor
    return formatted_lines
endfu

com -bar TOC call s:TOC()

它依赖于'quickfixtextfunc'位置列表的属性,该属性被添加到这两个 Vim 补丁中:

  • 8.2.0933 'quickfixtextfunc' 没有获取位置列表的窗口 ID
  • 8.2.0959 使用“quickfixtextfunc”有点慢

:h quickfix-window-function


为了获得更好的性能,下面是 Vim9 中的相同代码:

vim9

def TOC()
    setloclist(0, [])
    var curfile: string = expand('%:p')
    var save_cursor: list<number> = getpos('.')
    cursor(1, 1)
    while search('^#', 'W') > 0
       msg = printf('%s:%d:%s',
           curfile,
           line('.'), getline('.')->substitute('#', '»', 'g')
           )
       laddexpr msg
    endwhile
    setpos('.', save_cursor)
    setloclist(0, [], 'r', {
        lines: getloclist(0)
            ->mapnew((_, v) => curfile .. '|' .. v.lnum .. ' ' .. v.col .. '|' .. v.text),
        efm: '%f|%l %c|%m',
        quickfixtextfunc: Quickfixtextfunc,
        })
enddef
var msg: string

def Quickfixtextfunc(info: dict<number>): list<string>
    var ll: list<any> = getloclist(info.winid, {id: info.id, items: 0}).items
    var lnum_width: number = range(info.start_idx - 1, info.end_idx - 1)
        ->map((_, v) => ll[v].lnum)
        ->max()
        ->len()
    var formatted_lines: list<string> = []
    for idx in range(info.start_idx - 1, info.end_idx - 1)
        var e: dict<any> = ll[idx]
        var fname: string = bufname(e.bufnr)->fnamemodify(':t')
        var line: string = printf('|%0*s| %s', lnum_width, e.lnum, e.text)
        add(formatted_lines, line)
    endfor
    return formatted_lines
enddef

com -bar TOC TOC()

这需要最新的 Vim 版本。它适用于 8.2.2451。

于 2021-02-02T20:37:34.400 回答