
Ya sea en bash o vimscript, ¿cómo puedo ejecutar un script que inicia una aplicación (xv o display) y hacer que el script finalice devolviendo el foco a vim, pero dejando xv/display aún ejecutándose? Mi esfuerzo actual es esta función vim, que es esencialmente una versión dirigida por vim de mi intento en bash. Se bloquea en el último comando hasta que salgo de la pantalla.
" S() is called internally by :F to show images appropriately
function! S(j,k)
if system("pgrep ".a:j)!=''
exe '!pkill '.a:j
endif
exe '!'.a:j.' -geometry +0+'.a:k.@u.' &'
wmctrl -a Botany
endfunction
a:j es el nombre de la aplicación, a:k es el parámetro de posición de la pantalla, @u es la ruta del archivo
Respuesta1
Un script bash típico se vería así
#!/bin/bash
# Configuration
CMD="xv -some -parameters /and/a/path"
STDOUTLOG="/path/to/logfile"
STDERRLOG="/dev/null"
/bin/bash -c "eval '$CMD'" >"$STDOUTLOG" 2>"$STDERRLOG" &
Respuesta2
El problema era que no se puede disociar una aplicación del proceso que la inició, la solución que funciona para mí es tener algún otro proceso, ya ejecutándose, que lo haga por mí. Aquí está mi solución:
pkill -n xterm
cd /mnt/0/botany
xterm -g 80x59+885+0 -title 'Botany' -e vim -S bot.vim -o g y d "+res 8|2winc w|res 30" &
xp=
dp=
while ps ax|grep Botany|grep -v grep; do
if [ -f q ]; then
s=$(cat q)
rm q
if [[ "$s" =~ 'images.*' ]]; then
kill $dp 2> /dev/null
vd="$s $vd"
xv -geometry +0+380 ${vd% *} &
dp=$(pgrep xv|tail -1)
else
kill $xp 2> /dev/null
vx="$s $vx"
xv -geometry +0+0 ${vx% *} &
xp=$(pgrep xv|tail -1)
fi
sleep 1
wmctrl -a Botany
fi
done
kill $dp $xp 2> /dev/null
Los primeros tres comandos, para xterm, comprenden el script original que usé para abrir este proyecto, por lo que este script continuó abierto y esperando hasta el momento en que cerré vim y dejé morir xterm, momento en el cual este script de llamada también se cerraría. . Así que aquí había un proceso útil en ejecución, sin hacer nada, y en el mismo directorio en el que estaba trabajando. Agregué el resto del código, que verifica la existencia de un archivo q, lo lee e inmediatamente lo destruye y elimina cualquier instancia en ejecución. del espectador. luego reinicia el visor usando la ruta del archivo q como imagen para mostrar. Todo completamente disociado de vim, donde mi vimscript simplemente escribe la ruta del archivo q y nunca hace referencia a la aplicación de visualización, xp.