Recentemente, percebi como o vim funciona muito bem no golfe, especialmente na complexidade do kolmogorov . Além disso, de acordo com o meta vim, é uma 'linguagem de programação' perfeitamente aceitável pelo menos para o escopo deste site.
Que dicas gerais você tem para jogar golfe no Vim? Estou procurando idéias que possam ser aplicadas a problemas de código-golfe e que também sejam pelo menos um pouco específicas para o Vim (por exemplo, "remover comentários" não é uma resposta).
Poste uma dica por resposta.
Respostas:
Esteja ciente das variantes maiúsculas de comandos comuns. Isso pode salvar trivialmente um pressionamento de tecla em muitos contextos. Por exemplo:
Outro é usar em
G
vez degg
, mas somente se você usar uma contagem! Por exemplo, sem contagem,gg
move-se para o início eG
move-se para o fim. No entanto, com uma contagem, os dois se movem para a linha que você especificar, portanto,5G
é mais curto do que mas equivalente a5gg
.Outra é usar
H
no lugar degg
, mas é importante observar que isso só funciona se você puder garantir que qualquer entrada não ocupe mais do que o número padrão de linhas (acredito que seja 24, mas pode variar).fonte
$
entanto, pelo menos, portanto,C
eD
isso salvaria algo).G
egg
não são equivalentes. O primeiro vai para o fim do buffer e o segundo vai para o começo.5G
é equivalente a5gg
. Vou adicionar mais alguns detalhes sobre esse ponto.Sempre que um comando falhar, ele emitirá um ruído de toque, que cancelará a macro atual. Você pode (ab) usar isso para criar uma forma bruta de loop. Por exemplo, se você deseja repetir as teclas pressionadas
<foobar>
até que seu buffer tenha menos de 3 linhas. Você pode fazerque significa:
É importante observar que, se você estiver testando isso em uma sessão do vim,
@q
poderá ter efeitos colaterais indesejados, pois as macros são carregadas.vim_profile
. Você pode contornar isso de duas maneiras diferentes. Provavelmente, a melhor solução alternativa é lançar o vim comVocê também pode excluir o seu
.viminfo
.Se você já iniciou o vim, pode digitar
no início para zerar a macro.
Outras condições com as quais você pode substituir o 3G são:
ou
fonte
Existem versões mais reduzidas dos comandos ex que você pensa. Por exemplo, você provavelmente já sabia que isso
:global
pode ser reduzido:g
, mas você sabia que isso:nnoremap
é equivalente a:nn
?É uma boa ideia executar
:h :foo
todos os comandos ex que você está usando na sua resposta para ver se há uma versão mais curta.fonte
é sempre equivalente a
o que também é equivalente a
surpreendentemente. (Em geral, sem nenhum sinalizador, a última barra em uma
:s
expressão nunca é necessária.)fonte
:%s/x
, não remove todas as ocorrências de x, apenas a primeira em cada linha.:&&
para repetir um comando substituto e seus sinalizadores.Digamos que você esteja no modo de inserção e deseje fazer um único comando no modo normal. Você pode escrever assim:
Não faça assim. Em vez disso, use
<C-o>
, que executa um único comando normal e retorna imediatamente ao modo de inserção.fonte
<CR>
depois<foobar>
para enviar o comando?:
,/
ou?
)Existem três operadores "caso de mudança",
Como são operadores, eles fazem um movimento, portanto, para converter o caractere atual em minúsculas, você usaria
É aqui que entra o truque divertido. :) Se você deseja alterar o caso de um único caractere ou a linha atual, é um byte mais curto no modo visual. Por exemplo,
gul
é equivalente aE
gu_
(_ é a linha atual) é equivalente aEsse truque não funciona para alternar, porque
v?
aciona uma pesquisa para trás no modo visual (exatamente como sev/
move na direção oposta), então você precisavg?
. No entanto, é aqui que você pode usar o~
operador para salvar ainda mais bytes! (Obrigado @ Doorknob por apontar isso)Você pode ver esse truque em ação na minha resposta vim aqui e na resposta equivalente V no post e.
fonte
~
, que alterna o caso do personagem sob o cursor e move um para a direita!O alfabeto em 10 pressionamentos de teclas
Todo o crédito por essa técnica é atribuído a Lynn, que a usou pela primeira vez nesta resposta . Estou escrevendo aqui para a posteridade.
Use as seguintes dez teclas para puxar o alfabeto em minúsculas:
(Onde
␍
é um retorno de carro, ou seja, a tecla Enter.)Explicação
:h<_␍
abre a seção de ajudav_b_<_example
(um exemplo de seleção visual em blocos), que contém o textoabcdefghijklmnopqrstuvwyxz
.jjY
desce para essa linha e a puxa e depoisZZ
fecha a janela de ajuda.fonte
Conheça seus registros
Arrancar ou excluir texto em um registro específico (por exemplo
"aY
) para usá-lo mais tarde nem sempre é necessário. O Vim possui vários registros que são preenchidos automaticamente com os assuntos de vários comandos. Digite:help registers
para ver todos eles, mas aqui estão algumas observações particulares:Registro sem nome:
""
- O último texto que foi arrancado ou excluído.Registro numerado
"0
- o último texto que foi arrancado.Registradores numerados
"1
-"9
- O último texto que foi excluído, a menos que tenha menos de uma linha. Cada vez que"1
é preenchido, seu conteúdo anterior é deslocado para"2
e assim por diante.Registro de exclusão pequeno:
"-
- O último texto menor que uma linha que foi excluída.Último texto inserido:
".
Em particular, os registradores
"-
e"1
podem ser úteis juntos, permitindo que você exclua algum texto com, por exemplo,dd
no"1
registro e exclua algum outro texto comD
no"-
(é claro, a semântica não é idêntica, mas geralmente não precisa ser usada). )Todos os registros podem ser um pouco difíceis de acompanhar, mas você pode ver o conteúdo de todos os registros a qualquer momento digitando
:registers
.fonte
Isso apareceu no bate-papo mais cedo, então pensei em publicá-lo como uma dica completa.
<C-a>
e<C-x>
aumente e diminua o próximo número na linha. Este é um recurso extremamente útil para algumas contas simples, mas também permite um pequeno truque.Digamos que você precise pular para o próximo número. Por exemplo, precisamos mudar
para
A maneira óbvia é pular para o 2 e depois:
Como isso é mais curto que
Existem muitas maneiras diferentes de pular para o 2. Por exemplo,
Assim como muitas outras maneiras.
Estes são todos os 2 (ou mais) pressionamentos de tecla. No entanto, uma vez
<C-a>
e<C-x>
não apenas números de aumentar / diminuir, mas também saltar para o próximo número, podemos tomar um byte fora comfonte
Movimentos golfistas
Freqüentemente, se você estiver trabalhando com um bloco de texto (especialmente em desafios de arte ), precisará passar para o primeiro ou o último caractere no buffer.
G
egg
são muito bons, mas existem algumas coisas irritantes. Por exemplo, para obter o último caractere, você precisaG$
egg
não o colocará necessariamente na primeira coluna, se houver espaço em branco à esquerda. Aqui estão alguns movimentos mais agradáveis, embora observe que eles só funcionam se o seu texto não tiver linhas vazias no meio:Primeiro caractere do buffer:
{
é melhor quegg0
. Se houver linhas vazias no meio do texto, você também pode usar ogo
que leva ao primeiro caractere no buffer, não importa o quê.Último caractere do buffer:
}
é melhor queG$
Eles também funcionam como argumento para um operador, mas observe que são movimentos de caráter, não de linha!
fonte
H
é mais golfista quegg
H
não é confiável. Seu comportamento depende do tamanho da janela visível e de onde você está no buffer. (É mapeado de novo em V para evitar esta confusão)Faça cálculos com o registro de expressão
Você pode fazer cálculos no modo normal e no modo de inserção.
Modo normal
No modo normal, se você digitar,
@=
o cursor se moverá para a linha de comando, onde é possível inserir qualquer expressão. Quando você pressiona enter, o resultado da expressão será executado como comandos no modo normal.Por exemplo, suponha que você queira ir para a coluna do meio da linha atual. A chamada de função
col('$')
retorna o número de colunas na linha, para que possamos realizar o que, digitando o seguinte:Quando você pressiona enter, o cursor retorna ao buffer e o vim aguarda um operador (como
|
) como se você tivesse acabado de inserir um número. Como alternativa, você poderia ter digitado isso:... mas é claro que são mais bytes.
Modo de inserção
Você também pode usar o registro de expressão no modo de inserção pressionando em
<Ctrl-r>=
vez de@=
. Funciona da mesma maneira no modo normal, exceto que o resultado da expressão inserida será executado no modo de inserção. Por exemplo, se você digitou<Ctrl-r>=col('$')<CR>
, o número de colunas na linha atual seria inserido no cursor como se você a tivesse digitado.Para obter mais informações sobre o registro de expressão, digite
:help "=
.Reutilizando expressões
A última expressão que você usou é armazenada no registro de expressões
"=
,. Digitar@=<CR>
no modo normal ou<Ctrl-r>=<CR>
no modo de inserção avaliará a expressão novamente, permitindo que você as use de maneira semelhante às macros.Faça cálculos em substituições
Você também pode avaliar expressões ao fazer substituições de expressões regulares. Tudo o que você precisa fazer é iniciar sua substituição
\=
. Por exemplo, suponha que você deseje numerar as linhas neste arquivo:A chamada de função
line('.')
retorna o número da linha atual, facilitando o trabalho. Inserindo isso:... produz o resultado desejado:
Para usar grupos capturados em uma expressão como essa, você pode usar a
submatch()
função, onde, por exemplo,submatch(0)
é equivalente a\0
uma substituição comum,submatch(1)
é equivalente a\1
etc. Isso, infelizmente, consome muitas teclas.Para mais informações sobre a substituição expressão, tipo
:help sub-replace-expression
.fonte
i1 <esc>bqqywjPb<C-a>@qq@q
é uma solução de modo normal puro que é 5 bytes mais curta. E se você estiver no unix, você pode até fazer:%!nl
. Ainda boas dicas!Você pode modificar diretamente o texto de uma macro, que pode ser significativamente menor que um condicional complicado. Por exemplo, digamos que você deseja colar algo n vezes, em que n é a entrada do usuário. Eu tentei primeiro fazer isso:
Explicação:
São 18 teclas digitadas e uma maneira realmente feia de fazer isso. Em vez disso, vá para o local desse número e faça o seguinte:
Explicação:
São 9 pressionamentos de tecla, uma grande melhoria.
Editar:
Ainda mais curto é executar a macro para o seu número e digite seu comando. Por exemplo:
Explicação:
7 pressionamentos de tecla.
fonte
D
, nãodd
. 2. Se o comando não envolver registradores, você poderá reduzi-lo ainda mais. Por exemplo, se você deseja repetir o caracterex
quantas vezes o número sob o cursor, em vez de"qD@qix<esc>
, useD@"ix<esc>
.