1 votes

Termux:Widget et Emacs : impossible de démarrer des sous-processus

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.

1voto

ice cream Points 919

J'ai résolu ce problème alors que j'essayais d'être minutieux en écrivant la question : c'était dans la documentation, mais je n'arrivais pas à le comprendre. J'avais besoin de set LD_PRELOAD tel que documenté par termux-exec de façon à ce qu'Emacs fonctionne avec la version modifiée de l'interface utilisateur. exec() appel système. Mon script de deux lignes est maintenant

PREFIX=/data/data/com.termux/files/usr
TERMUX_EXEC=${PREFIX}/lib/libtermux-exec.so
[ -e $TERMUX_EXEC ] && export LD_PRELOAD=$TERMUX_EXEC
filename=$(a little shell logic)
emacs $filename

Le contrôle d'existence supplémentaire est destiné à ce que LD_PRELOAD reste non défini (ou non modifié) lorsque j'exécute ce même script pratique sur mes systèmes non-Termux.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X