Defina uma marca para o seu valor anterior

9

Às vezes, uso marcas para navegar facilmente por diferentes arquivos usando mA, mB... e 'A, 'B...

E em algum momento (com mais frequência do que eu gostaria de admitir) por desatenção ou seja qual for o motivo, uso m[LETTER]com uma marca já existente que apaga seu valor anterior quando não quero. Na maioria das vezes, quando faço isso, não tenho aberto o arquivo apontado originalmente pela marca.

Nesse caso, quando percebi imediatamente que cometi um erro, é possível obter o valor anterior da minha marca, além de lembrar para onde ela estava apontando, navegar para esse local e configurá-lo novamente?

Não encontrei um comando como esse no documento. Se isso não existir, existe uma solução inteligente que alguns de vocês usam nessa situação?

statox
fonte
11
Além disso, você pode consultar este post para obter mais informações: superuser.com/questions/687441/…
nobe4
@ Nobe4 obrigado pelo seu link, eu não o encontrei, mas parece confirmar que não é realmente possível fazer isso facilmente.
Statox
Use os comandos de salto ( ctrl-o, ctrl-ie :jumps) com sua própria memória pessoal :)
VanLaser

Respostas:

5

Aqui está um VimScript básico que faz aproximadamente o que você deseja.

Nós substituir o maatravés de mzmapeamentos para armazenar o valor atual em g:previous_marksantes de chamar o original mpara realmente definir a marca. Também definimos <Leader>maatravés <Leader>mzpara mostrar o histórico da referida marca.

Provavelmente, você deseja armazenar as informações de g:previous_marksforma mais organizada e adicionar a capacidade de restaurar rapidamente uma marca (em vez de apenas ver os locais), mas este exemplo mostra como isso pode ser feito, mais ajustes são deixados como exercício para o leitor ;-)

let g:previous_marks = {}
fun! MyMark(mark)
    let l:marks = ''
    redir => l:marks
        try
            silent! execute 'marks ' . a:mark
        catch
        endtry
    redir END

    if l:marks != ''
        if !has_key(g:previous_marks, a:mark)
            let g:previous_marks[a:mark] = []
        endif
        call add(g:previous_marks[a:mark], split(l:marks, "\n")[1])
    endif

    execute 'normal! m' . a:mark
endfun

fun! ShowHistory(mark)
    if !has_key(g:previous_marks, a:mark)
        echoerr 'No history for ' . a:mark
        return
    endif

    for l:line in g:previous_marks[a:mark]
        echo l:line
    endfor
endfun

fun! MakeMappings()
    for l:char in range(97, 122)
        let l:char = nr2char(l:char)

        execute 'nnoremap <silent> m' . l:char . ' :call MyMark("' . l:char . '")<CR>'
        execute 'nnoremap <silent> <Leader>m' . l:char . ' :call ShowHistory("' . l:char . '")<CR>'
    endfor
endfun

call MakeMappings()
Martin Tournoij
fonte
Uau, como sempre, uma resposta incrível! Vou tentar ter tempo neste fim de semana para implementar o exercice para o leitor;)
statox
2

Não é exatamente o que você deseja, mas talvez seja mais útil: o plug-in de assinatura . Ele mostra as marcas atuais como sinais na margem da sarjeta e possui atalhos simples para editá-las. Também pode colocar a lista de sinais em uma lista de locais para acesso rápido.

Sato Katsura
fonte
Eu não sou um grande fã da marca visível na margem, mas parece ter algumas características interessantes, vou dar uma olhada nela.
Statox
@statox Na mesma linha, também há indicadores . Ele mostra literalmente todas as marcas (o plug-in acima lida apenas com as alfabéticas) e pode ser alternado com uma chave. Acho útil ocasionalmente.
Sato Katsura
Sim, eu uso os indicadores há algum tempo (ao contrário da assinatura), é por isso que eu disse que não sou fã de marcas na margem, mas estou tentando a assinatura agora para ver se eu gosto :-)
statox
2

Como o problema real parece ser a navegação entre vários arquivos / posições, sugiro esta solução simples, baseada no plug-in Unite :

:Unite jump -auto-preview

Este comando (que pode ser mapeado para algo como, <leader>jpor exemplo) mostrará a lista de atalhos, com uma visualização: sempre que você navegar na lista com j/ k, várias linhas ao redor da posição do cursor nesse arquivo serão exibidas.

insira a descrição da imagem aqui


Alternativa:

As marcas padrão são tão fáceis de serem substituídas: talvez os marcadores nomeados se encaixem melhor no seu caso de uso, por exemplo, com o plugin simple_bookmarks .

VanLaser
fonte
Eu realmente não posso dizer que o problema é esse tipo de navegação porque eu uso essas marcas ocasionalmente e, na maioria das vezes, navego de maneira diferente pelos meus arquivos. No entanto, há muito tempo penso que devo usar a lista de pulos com mais frequência, para que pareça uma boa maneira de fazê-lo!
statox
Mesmo que eles possam ser salvos entre as sessões do vim, é muito fácil substituir marcas. Eu adicionei uma solução alternativa.
21415 VanLaser
De fato, sua solução alternativa parece valer a pena, muito obrigado!
Statox