
Как в bash или vimscript запустить скрипт, который запускает приложение (xv или display), и завершить скрипт, вернув фокус vim, но оставив xv/display работать. Моя текущая попытка — это эта функция vim, которая по сути является версией моей попытки в bash, направленной на vim. Она зависает на последней команде, пока я не выйду из display.
" 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 — имя приложения, a:k — параметр положения экрана, @u — путь к файлу
решение1
Типичный скрипт bash будет выглядеть так:
#!/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" &
решение2
Проблема была в том, что вы не можете отделить приложение от процесса, который его запустил, решение, которое работает для меня, заключается в том, чтобы какой-то другой процесс, уже запущенный, сделал это за меня. Вот мое решение:
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
Первые три команды для xterm включают исходный скрипт, который я использовал для открытия этого проекта, поэтому этот скрипт продолжал работать и ждать, пока я не закрою vim и не позволю xterm умереть, после чего этот вызывающий скрипт тоже закроется. Итак, вот удобный запущенный процесс, ничего не делающий и находящийся в том самом каталоге, в котором я работал. Я добавил остальную часть кода, который проверяет наличие файла q, считывает его и немедленно уничтожает, а также убивает любой запущенный экземпляр просмотрщика. затем перезапускает просмотрщик, используя путь к файлу из файла q в качестве изображения для показа. Все полностью отделено от vim, где мой vimscript просто записывает путь к файлу в файл q и никогда не ссылается на приложение просмотра, xp.