Sebagai tindakan pencegahan untuk ketidaknyamanan karena harus menekan CTRL- z, Anda dapat membuat skrip pembungkus untuk editor yang akan menjalankan editor Anda di latar belakang. Dengan cara ini Anda tidak perlu mengingat untuk memulainya di latar belakang secara eksplisit:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Di atas kami pertama-tama mencoba untuk menentukan apakah Anda memiliki server X tersedia dan hanya kemudian menjalankan editor di latar belakang (jika tidak, banyak editor Unix akan menggunakan terminal Anda dan Anda tidak ingin menjalankan editor sebagai proses latar belakang dalam kasus ini) . Ini akan meneruskan semua argumen ke editor pilihan Anda kata demi kata ("$@"
) sama seperti yang Anda berikan untuk skrip wrapper.
Adapun perintah yang Anda lewatkan ... Per eksperimen dasar saya, untuk program GUI yang tidak melibatkan terminal, bisa sesederhana pengiriman pertama SIGSTOP
dan kemudian SIGCONT
ke proses latar depan (menggunakan kill
perintah jika Anda menggunakan skrip shell untuk mengimplementasikan ini) . Anda tentu saja perlu menjalankannya di jendela / tab terminal lain, dan kesulitannya adalah dengan mudah dan dengan cara umum menemukan PID yang ingin Anda kirimi sinyal. Anda dapat secara default mengirim dua sinyal ke semua proses dari nama yang diberikan (default ke editor favorit Anda dan memungkinkan menggunakan PID sebagai argumen juga):
#!/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
Metode ini memberi saya tab terminal dengan benar setelah menjalankan (beberapa) emacs
perintah di latar belakang. Tetapi proses emacs yang berjalan di terminal tidak dipulihkan dengan benar karena kontrol pekerjaan shell atau kebingungan pengaturan terminal. Jadi metode ini akan mendapat manfaat dari beberapa kecanggihan.
The SIGSTOP
persis apa yang mengirim ke proses latar depan ketika Anda menekan (oleh default umum) CTRL- z. Lihat stty -a
output
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(keluaran disingkat) dan stty
halaman manual:
susp CHAR
CHAR will send a terminal stop signal
Proses yang berhenti menggunakan SIGSTOP
sinyal dapat dimulai kembali dengan mengirim SIGCONT
. Biasanya itu adalah logika kontrol pekerjaan shell yang akan mengirim SIGCONT
dan menangani manipulasi lain yang diperlukan fg
dan bg
perintah yang kita abaikan.
tmux
memberikan fungsionalitas yang sama seperti yang diinginkan dalam pertanyaan Anda.