在vim中使用所有标记的行

Mik*_*age 11 vim

通常在查看vim中的日志文件时,我会使用标记突出显示有趣的行.在某些时候,我希望能够将所有有趣的行(或者所有标记的行或标记列表)复制到寄存器或其他文件中(这并不重要;目标是便于撰写摘要).我无法找到任何内置的方法来做到这一点; 是不是可能在vim?

我想这可能是一个相当简单的功能; 可能看起来像这样,但我的vimscript能力非常弱:

for cur_mark in list_of_marks
    goto mark
    yank current line and append to register
Run Code Online (Sandbox Code Playgroud)

有没有人写过他们可以指出的类似的东西?

谢谢

编辑:我在https://github.com/mikeage/vim-yankmarks上发布了已接受的解决方案

Mik*_*age 7

与往常一样,有一些事情比寻求帮助更具激励性.这就是我想出来的; 反馈欢迎.

function! Yankmark()
    let save_cursor = getpos(".")
    let n = 0
    " I should really make this a parameter...
    let marks_to_yank="abcdefghijklmnopqrstuvwxyz"
    let nummarks = strlen(marks_to_yank)
    " Clear the a register
    let @a=''
    while n < nummarks
        let c = strpart(marks_to_yank, n, 1)
        " Is the mark defined
        if  getpos("'".c)[2] != 0
            " using g' instead of ' doesn't mess with the jumplist
            exec "normal g'".c
            normal "Ayy
        endif
        let n = n + 1
    endwhile
    call setpos('.', save_cursor)
endfunction
Run Code Online (Sandbox Code Playgroud)


Ing*_*kat 6

迈克奇有个好主意; 这里有一个更精致的函数版本变成了一个命令:

":YankMarks [{marks}] [{register}]
"                   Yank all marked (with [a-z] / {marks} marks) lines into
"                   the default register / {register} (in the order of the
"                   marks).
function! s:YankMarks( ... )
    let l:marks = 'abcdefghijklmnopqrstuvwxyz'
    let l:register = '"'
    if a:0 > 2
        echohl ErrorMsg
        echomsg 'Too many arguments'
        echohl None
        return
    elseif a:0 == 2
        let l:marks = a:1
        let l:register = a:2
    elseif a:0 == 1
        if len(a:1) == 1
            let l:register = a:1
        else
            let l:marks = a:1
        endif
    endif

    let l:lines = ''
    let l:yankedMarks = ''
    for l:mark in split(l:marks, '\zs')
        let l:lnum = line("'" . l:mark)
        if l:lnum > 0
            let l:yankedMarks .= l:mark
            let l:lines .= getline(l:lnum) . "\n"
        endif
    endfor

    call setreg(l:register, l:lines, 'V')

    echomsg printf('Yanked %d line%s from mark%s %s',
    \   len(l:yankedMarks),
    \   len(l:yankedMarks) == 1 ? '' : 's',
    \   len(l:yankedMarks) == 1 ? '' : 's',
    \   l:yankedMarks
    \) . (l:register ==# '"' ? '' : ' into register ' . l:register)
endfunction
command! -bar -nargs=* YankMarks call <SID>YankMarks(<f-args>)
Run Code Online (Sandbox Code Playgroud)

  • @Mikeage哦不,主要的功劳仍然归功于你,因为我只是提供了一个更好的实现.我建议人们同时投票:-) (2认同)