
在 bash 或 vimscript 中,如何執行啟動應用程式(xv 或 display)的腳本,並透過將焦點傳回 vim 來終止腳本,但讓 xv/display 仍然運作。我目前的努力是這個 vim 函數,它本質上是我在 bash 中嘗試的 vim 定向版本。它掛在最後一個命令處,直到我退出顯示。
" 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 中的檔案路徑作為要顯示的影像重新啟動檢視器。一切都與 vim 完全分離,我的 vim 腳本只是將檔案路徑寫入檔案 q,而從不引用檢視器應用程式 xp。