Como posso inserir o resultado de uma avaliação “.w” no final de uma linha no Vim?

5

Eu gostaria de poder avaliar uma linha de Javascript (ou outro código) no Vim e fazer com que o resultado apareça em um comentário no final da linha.

Por exemplo, se eu tiver um arquivo como:

console.log(4 + 5);

e meu cursor está nessa linha, e eu uso o comando :.w !node -e , o resultado " 9 " aparecerá no buffer abaixo. se eu usar :. !node -e , toda a linha será substituída pelo resultado, 9 .

Como posso criar um comando que irá acrescentar o resultado ao final da linha em um comentário, assim:

console.log(4 + 5);    // 9

Também é importante notar que usar :r imprimirá o que for passado na próxima linha. r !echo "This is text." irá inserir " This is text. " na linha abaixo do cursor. No entanto, um comando como ...

:r ". !node -e"

... tentará ler ". !node -e" como um arquivo em vez de um comando; Eu realmente não entendo esse comportamento, mas torna as coisas um pouco menos intuitivas.

Eu gostaria que o resultado final fosse um pouco reminiscente da maneira como o editor de texto Atom lida com os kernels de hidrogênio, com o resultado do código eval aparecendo à esquerda do código. O plano é criar uma associação de teclas ( <C-Enter> ou <F5> ) para avaliar automaticamente a linha atual e exibir o resultado.

    
por brilliantlyInsane 24.07.2018 / 06:15

2 respostas

3

Se suas linhas se parecem com: 4 + 5 = você pode usar algo como:

 :map  "_ay/=^Mo^[!!echo ^Ra \| bc^MkJ
  1. _ ............... para pular para o início da linha real
  2. "ay / = ^ M ... para puxar até = no buffer a
  3. o ^ [ ........... faça uma nova linha vazia
  4. !! .............. inicie um programa shell para gravar o resultado nesta nova linha
  5. ^ Ra .......... insira o conteúdo do buffer a em comando: echo ^ Ra \ | bc ^ M
  6. k .............. vá para a linha anterior
  7. J .............. junte a próxima linha (resultado) a linha real
  8. talvez você queira excluir em branco de participar de x

Espero que seja isso o que você é.

    
por 24.07.2018 / 08:22
2

Graças à sugestão de Horst, consegui analisar como fazer com que o Vim fizesse isso com qualquer linguagem que tivesse uma opção de linha de comando "evaluate". Para JavaScript, o comando que eu coloquei é o seguinte:

imap <F5> ^[_"ay$o//^[kJo^[!!node -e "^Ra"^MkJi
nmap <F5> _"ay$o//^[kJo^[!!node -e "^Ra"^MkJ

Para um detalhamento:

  1. Para o mapeamento no modo INSERT , Escape ( ^[ ) retorna ao modo normal.
  2. _"ay$ coloca toda a linha no registro a .
  3. o//^[kJ adiciona o "//" para um comentário.
  4. o^[ inicia outra nova linha.
  5. !!node -e "^Ra"^M executa o registrador (a linha) através do Node.js e retorna o resultado na linha atual.
  6. Finalmente, kJ puxa essa nova linha de volta para o primeiro para se tornar o comentário.
  7. (para o modo INSERT , i retorna o modo de NORMAL para INSERT .)

O mesmo pode ser feito para o Python com algumas pequenas edições:

imap <F5> ^[_"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJi
nmap <F5> _"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJ

Para isso, o comentário // é substituído pelo # do Python. Além disso, importo automaticamente o módulo math , pois ele pode ser muito útil para cálculos rápidos dessa maneira.

Minha recomendação é colocar cada um desses mapeamentos em seus respectivos arquivos ~/.vim/ftplugin/<language>.vim e colocar set ftplugin on no seu .vimrc . Isso permite que o mapeamento seja alterado com base em qual idioma você está trabalhando!

Espero que qualquer pessoa que queira executar código de forma interativa no Vim possa encontrá-lo e, possivelmente, até melhorá-lo. Um enorme "Obrigado!" vai para Horst por responder a esta pergunta e dar o pontapé inicial neste pequeno projeto!

    
por 26.07.2018 / 07:46