Inicie o editor a partir de um script de shell com texto

1

Eu sei que é possível iniciar o editor padrão a partir de um script de shell. Por exemplo, supondo que a variável de ambiente $EDITOR esteja configurada:

$EDITOR ~/newfile.txt

É possível abrir um novo arquivo com texto pré-preenchido? Uma maneira de pensar é criar o arquivo antes de abri-lo:

echo "Header" > ~/newfile.txt
$EDITOR ~/newfile.txt

Mas seria um pouco melhor se o arquivo que o editor de texto abrir fosse pré-preenchido, mas também capaz de ser descartado. Isso é possível?

    
por SauceCode 22.02.2016 / 22:40

1 resposta

2

Se você quiser preencher previamente o conteúdo no editor, escreva esse conteúdo inicial no arquivo, exatamente como você pensou.

Não há como "colocar o editor no estado em que ele estaria se você digitasse algumas linhas depois de abri-lo", o que funciona em diversos editores. Em muitos editores, isso significa que o arquivo não será salvo, mas não há uma maneira uniforme de atingir esse estado, e há editores que não possuem esse conceito (por exemplo, Scratch ).

Você pode, no entanto, detectar se o arquivo foi salvo do editor. Abandone a operação se o arquivo não foi salvo. Para detectar se o arquivo foi salvo, verifique seu tempo de modificação antes e depois.

file=$(mktemp)
cat <<EOF >"$file"
Hello
world
EOF
old_metadata=$(ls -li "$file")
"${VISUAL:-"${EDITOR:-vi}"}" "$file"
new_metadata=$(ls -li "$file")
if [ "$new_metadata" = "$old_metadata" ]; then
  … # unchanged file, abandon operation
else
  … # modified file, carry on
fi

Tenha em atenção que, se o ficheiro foi modificado, mas o tamanho e o inode não se alteraram e a modificação demorou menos de 1 segundo, este script irá pensar que o ficheiro não foi modificado. Isso não acontecerá se um ser humano estiver editando, mas pode acontecer facilmente se $EDITOR for um script que envie um arquivo modificado automaticamente. É difícil fazer melhor de maneira portátil. Com o GNU coreutils, passar a opção --full-time para ls resolve este problema se o sistema de arquivos suportar timestamps de subsegundos com precisão suficiente.

Como alternativa, verifique se o arquivo foi modificado. A maneira mais fácil de fazer isso é manter uma cópia do conteúdo inicial e chamar cmp . Se comandos como sha256sum ou sha estiverem disponíveis, você poderá usá-los e comparar os hashes antes e depois. Talvez você ainda queira considerar que o arquivo tenha sido editado se o registro de data e hora tiver mudado - talvez o usuário tenha querido enviar a entrada padrão.

Essa técnica é o que vários sistemas de controle de versão usam quando iniciam um editor para editar uma mensagem de confirmação. Se o usuário não salvar o arquivo, a confirmação será cancelada.

Se você também quiser posicionar o cursor no final da entrada, não há uma maneira universal de fazer isso. Com muitos editores, você pode escrever

"$EDITOR" +"$line" "$file"

e o editor será aberto com o cursor na linha especificada. Isto é suportado por muitos editores incluindo vi (todas as variantes), emacs, joe e gedit, mas não pelo kwrite.

    
por 23.02.2016 / 01:20