Vim: Salta para a posição anterior do cursor, NÃO edita o ponto

0

Estou tentando escrever uma pequena macro para anexar a; até o final da linha atual (A;), então retorne para a posição do cursor da qual eu pulei antes de executar a macro.

C-o e C-i não são o que eu preciso, nem são '' e '', que operam em pontos de edição. Não há como fazer isso sem colocar um marcador?

    
por krystah 20.12.2013 / 14:52

4 respostas

1

Se você está bem em fazer uma pequena função em vez de uma pequena macro, eu proporia o seguinte:

function! AppendString(string)
  if getline('.') !~ a:string.'$'
    let original_cursor_position = getpos('.')
    exec("s/$/".a:string."/")
    call setpos('.', original_cursor_position)
  endif
endfunction

A posição do cursor é obtida usando getpos() e depois é recuperada com setpos() .

Esta função pode acrescentar qualquer string que você queira. Também verifica se a linha já tem a string desejada no final, caso em que não faz nada.

Você pode definir mapas de teclado que usam essa função que são úteis para idiomas diferentes:

" in ftplugin/cpp.vim
nnoremap <silent> <LocalLeader>; :call AppendString(";")<CR>

ou

" in ftplugin/python.vim
nnoremap <silent> <LocalLeader>: :call AppendString(":")<CR>
    
por 20.12.2013 / 15:45
2

O comportamento de '' e o que são considerados como 'saltos' são claramente explicados no documento.

De :help jump-motions :

A "jump" is one of the following commands: "'", "'", "G", "/", "?", "n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", "H" and the commands that start editing a new file. If you make the cursor "jump" with one of these commands, the position of the cursor before the jump is remembered. You can return to that position with the "''" and "''" command, unless the line containing that position was changed or deleted.

A obviamente não está na lista, então "tick-tick-back", como Gary Bernhardt chama, não funcionará "como está". Ainda é uma boa abordagem, mas você deve colocar explicitamente a marca de backtick antes de A;

nnoremap <key> m'A;<Esc>''
    
por 20.12.2013 / 22:31
1

Acabei escrevendo uma pequena função, uma versão menos flexível, mas mais compacta do que a que você acabou de postar.

Keybind:

nnoremap <leader>; :call AppendSC()<CR>

Função:

fun! AppendSC()
  let pos = getpos('.')
  s/.*/&;/
  call setpos('.', pos)
endf
    
por 20.12.2013 / 15:50
1

Se você usar setpos() de baixo nível em vez de :substitute (que tem outros efeitos colaterais indesejados, como adicionar o padrão ao histórico de pesquisa), a posição do cursor será mantida automaticamente:

:nnoremap <silent> <leader>; :call setline('.', getline('.') . ';')<CR>
    
por 20.12.2013 / 18:43

Tags