Jako środek zapobiegawczy związany z niedogodnością związaną z koniecznością naciskania CTRL- zmożesz utworzyć skrypt opakowujący dla swojego edytora, który uruchamiałby twój edytor w tle. W ten sposób nie będziesz musiał pamiętać o uruchomieniu go w tle:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Powyżej próbujemy najpierw ustalić, czy masz dostępny serwer X, a dopiero potem uruchomić edytor w tle (jeśli nie, wielu edytorów uniksowych zamiast tego użyje twojego terminala i w tym przypadku nie chcesz uruchamiać edytora jako procesu w tle) . Prześle wszystkie argumenty do edytora wyboru verbatim ( "$@"), tak jak podałeś dla skryptu opakowania.
Jeśli chodzi o polecenie, którego brakuje ... Na podstawie mojego podstawowego eksperymentu, dla programów GUI, które nie wymagają terminala, może to być tak proste, jak najpierw wysłanie, SIGSTOPa następnie SIGCONTprzejście do pierwszego planu (użycie killpolecenia, jeśli używasz skryptu powłoki, aby to zaimplementować) . Oczywiście musiałbyś uruchomić go w innym oknie / zakładce terminala, a trudność polegałaby na wygodnym i ogólnym znalezieniu PID, do którego chcesz wysłać swój sygnał. Możesz domyślnie wysłać dwa sygnały do wszystkich procesów o podanej nazwie (domyślnie do twojego ulubionego edytora i pozwalając również używać PID jako argumentów):
#!/bin/sh
EDITOR=emacs # whatever
stop_cont_prog()
{
case "$1" in
# begin with number is considered PID - this is not good
# enough to be taken seriously...
[1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
*) killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
esac
}
if [ -n "$1" ]; then
for prog in "$@"; do stop_cont_prog "$1"; done
else
stop_cont_prog "${EDITOR}"
fi
Ta metoda poprawnie dała mi karty terminalu po uruchomieniu (kilku) emacspoleceń w tle. Ale proces emacs działający w terminalu nie został poprawnie przywrócony z powodu kontroli zadań powłoki lub pomyłki w ustawieniach terminala. Ta metoda skorzystałaby z pewnego wyrafinowania.
To SIGSTOPjest dokładnie to, co jest wysyłane do procesu pierwszego planu po naciśnięciu (według typowych ustawień domyślnych) CTRL- z. Sprawdź stty -adane wyjściowe
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(wyjście skrócone) i sttystrona podręcznika:
susp CHAR
CHAR will send a terminal stop signal
Procesy zatrzymane za pomocą SIGSTOPsygnału można ponownie uruchomić, wysyłając SIGCONT. Zwykle jest to logika kontroli zadania powłoki, która wyśle SIGCONTi zajmie się innymi niezbędnymi manipulacjami fgi bgpoleceniami, które ignorujemy.
tmuxzapewnia taką samą funkcjonalność, jak pożądana w pytaniu.