Mapeamento de recuo de Vim: como inserir uma quebra de linha que recua a coluna em que eu estava?

1

No Vim, eu quero vincular uma chave que irá inserir uma nova linha e recuar essa nova linha até a coluna onde o cursor costumava estar. É um pouco estranho, então deixe-me ilustrar:

Exemplo: antes e depois, com o cursor em |

Antes:

a = str "Hello |World"

Depois:

a = str "Hello 
               |World"

Este conceito não está relacionado às configurações 'copyindent' nem 'preserveindent' do vim (essas configurações dizem respeito a themsevles com o recuo inicial da linha anterior, não a coluna do cursor).

    
por Ein 28.05.2013 / 19:17

2 respostas

1

Tente este mapeamento.

:inoremap <F2> <CR><C-R>=repeat(' ',col([line('.')-1,'$'])-col('.'))<CR><C-O>:.retab<CR>

Quando você digita F2 (ou qualquer tecla que você escolher para o mapeamento), o Vim irá inserir uma nova linha ( <CR> ) seguida por um número de espaços ( <C-R>=repeat(' ',...) ) igual à diferença entre o número da coluna do final da linha anterior ( col([line('.')-1,'$']) ) e o número da coluna atual ( col('.') ), então executar :retab na linha atual para substituir esses espaços por tabulações e / ou espaços de acordo com sua configuração de 'expandtab'. / p>

Editar

Esse mapeamento requer que você esteja no modo de inserção. Eu estava pensando que você digitaria a chave do mapa depois de digitar Hello e antes de digitar World. Para voltar e inserir essa nova linha no modo normal, use este mapeamento.

nnoremap <F2> i<CR><C-R>=repeat(' ',col([line('.')-1,'$'])-col('.'))<CR><Esc>:.retab<CR>
    
por 28.05.2013 / 19:53
0

Eu não tenho acesso a uma cópia de vim (ou mesmo vi ) no momento para testar isso, mas tente algo como

iEnterEsc-Yp:s/./ /gEnterJ

O que faz:

  • Insira uma quebra de linha (sem pensar).
  • Volte para a linha a = str "Hello e faça uma cópia dela.
  • Altere todos os caracteres da linha copiada para um espaço - portanto, agora você deve ter 15 espaços.
  • Junte essa linha (15 espaços) à linha |World" , por isso agora é recuado 15 espaços.

Você pode precisar excluir um espaço (porque a operação de junção pode adicionar um). Se houver guias na linha, talvez você queira adicionar !_expandEnter para expandir as tabulações para espaços na cópia da primeira parte da linha. E você também pode querer adicionar !_unexpandEnter para compactar espaços para guias.

    
por 28.05.2013 / 19:58

Tags