J'ai quelques tâches que j'aime faire en utilisant Emacs sur plusieurs systèmes d'exploitation différents. J'ai utilisé Termux pour pouvoir accéder à ces tâches sur mon téléphone Android. Pour réduire la saisie de configuration dans la partie édition de fichiers de ce flux de travail, j'ai installé Termux:Widget et écrit un script de widget de deux lignes qui fait
filename=$(a little shell logic)
emacs $filename
Maintenant, mon téléphone a un bouton sur l'écran d'accueil sur lequel je peux appuyer et qui ouvre le fichier que je veux dans l'éditeur. Cette partie fonctionne bien.
Souvent, une fois que j'ai commencé à éditer, il est pratique d'exécuter un script shell. Il est agréable de pouvoir exécuter le script shell dans un tampon Emacs afin de pouvoir utiliser les commandes habituelles de changement de tampon pour interagir avec lui. Si j'ouvre une nouvelle session Termux et que je tape emacs
à l'invite, alors je peux faire M-x async-shell-command
J'utilise les noms de fichiers relatifs et la complétion de tabulation pour trouver le nom du script que je veux (par exemple, le nom de l'utilisateur). ../my-script.sh
), et l'exécuter depuis Emacs. Cette partie fonctionne bien.
Cependant, si j'ai lancé Emacs à partir de Termux:Widget, Emacs est incapable de créer des sous-processus. J'obtiens des erreurs comme
/data/data/com.termux/files/usr/bin/sh: 1: ../my-script.sh: not found
/data/data/com.termux/files/usr/bin/sh: 1: /data/data/com.termux/files/home/whatever/my-script.sh: not found
Je pense que les noms des chemins relatifs et absolus sont corrects car j'utilise la complétion par tabulation pour les vérifier avant de demander l'exécution.
Cela semble être le genre de problème qui termux-exec a été inventé pour réparer. Cependant, il ne fonctionne pas par magie, et je me retrouve désorienté par la documentation.