Backspace na abreviação de inserção

8

Para funcionar, as abreviações precisam ser separadas por espaços em branco. Por exemplo, se eu tiver uma iab fo FOOBARdigitação whatfo, não acionará a abreviação. Existem algumas razões sensatas óbvias para isso.

No entanto, eu gostaria de uma abreviação que pudesse ser usada como sufixo sem que eu precisasse acionar o iab e depois voltar e remover o espaço. Isso é possível? Por exemplo iab fo <backspace>FOOBAR,.

Cachinhos Dourados
fonte
O código a seguir produz o que você deseja? vpaste.net/IfU1j
saginaw
@ saginaw Sim, brilhante - poste isso como resposta e é sua.
GOLDILOCKS

Respostas:

8

Você pode escrever dentro do seu vimrc: iab fo <BS>FOOBAR

<BS> é a notação a ser usada para a chave de backspace.

Para obter mais informações sobre nomes de chaves especiais, consulte:

:help key-notation
saginaw
fonte
1
A "maneira mais simples" não funcionou neste caso porque penso em robustez; o sufixo atual é [7:0]e você teria que brincar com o número de bs etc. para personalizar isso, eu acho.
GOLDILOCKS
@delicateLatticeworkFever Você está certo, eu não pensei nisso. Nesse caso em particular, talvez substituir be ecom Be Eseja suficiente. Mas pode haver outros casos em que isso falharia, eu não sei. De qualquer forma, a primeira versão deve, esperançosamente, funcionar a maior parte do tempo.
Saginaw
@delicateLatticeworkFever Relendo minha resposta, percebo que é muito complexo. Provavelmente algo como iab fo <BS>foobarfoi suficiente. Desculpe pela inconveniência, você provavelmente deve marcar a resposta de @djjcast como a resposta correta. No momento, não consigo remover minha resposta, mas uma vez que posso, irei. Mais uma vez, desculpe, não estou acostumado a abreviações.
2171616
Ei, <BS>era exatamente isso. Juro que tentei algo assim, mas não conheço todos os personagens de controle, então poderia ter usado <backspace>ou algo assim.
7296 goldilocks
1
@delicateLatticeworkFever eu entendo, não há problema. Se você quiser ver todos os nomes de chave especiais, você pode lê-los aqui::help key-notation
saginaw
4

Basta pressionar no modo de inserção Ctrl]. Isso fará com que as abreviações sejam expandidas, sem entrar em um espaço

Christian Brabandt
fonte
Você interpretou mal a pergunta. Eu quero que o resultado final seja algo como: X(FOOBAR)não X( FOOBAR. Usar Ctrl-] apenas elimina o espaço no final . Eu preciso ser capaz de usar a abreviação - que também depende do espaço em branco no início do disparo - mas concatenada com a palavra anterior (é isso que significa " sufixo ").
7296 goldilocks
Oh, você quer um trecho de plug-in ...
Christian Brabandt
Eu acho que isso poderia ser feito com algo definido ${1}FOOBAR- essa é uma boa resposta. Se você quiser alterar isso: / ou adicionar outra resposta, assinalarei isso.
7296 goldilocks
Como eu pessoalmente não conheço plug-ins de trechos, não posso fazer isso seriamente como uma resposta.
Christian Brabandt
4

Como alternativa, eis uma maneira de definir e expandir abreviações que se expandem em qualquer lugar:

let s:anywhere_abbreviations = {
    \ 'fo': 'FOOBAR',
    \ 'ab': 'ABBREVIATION',
\ }

function! s:MaybeExpandAbbreviation(trigger)
    for key in keys(s:anywhere_abbreviations)
        if matchstr(getline('.'), repeat('.', strchars(key)) . '\%' . col('.') . 'c') ==# key
            return repeat("\<BS>", strchars(key)) . s:anywhere_abbreviations[key] . a:trigger
        endif
    endfor
    return "\<C-]>" . a:trigger
endfunction

inoremap <expr> <Space> <SID>MaybeExpandAbbreviation("\<Space>")

Basta adicionar as abreviações que devem se expandir em qualquer lugar do s:anywhere_abbreviationsdicionário. A s:MaybeExpandAbbreviation()função procura e expande as correspondências de abreviações quando a tecla trigger é pressionada - <Space>é mapeada para disparar a expansão das "abreviações em qualquer lugar".

Com o s:anywhere_abbreviationsdicionário acima , a digitação whatfo<Space>será expandida para whatFOOBAR.

djjcast
fonte
2

Para resumir as duas respostas mais simples que surgiram disso:

  1. Você pode usar um backspace diretamente em uma abreviação - vários caracteres especiais estão documentados em :help keycodes. Então, por exemplo:

    :iab cdt <BS>cedental
    

    Permitirá que você digite trans cdte obtenha transcendental.

  2. Um dos quais me sinto particularmente envergonhado desde que o uso há anos: O plug-in snipMate comum permite que os parâmetros fiquem na frente, então

     snippet cdt
         ${1}cendental ${2}
    

    Permite digitar cdt, que Tabserá expandido para cendentale colocar o cursor na frente para que você possa digitar transe pressione Tabnovamente para ir para o início da próxima palavra.

Cachinhos Dourados
fonte