Puncte:0

Deschideți documentul într-o aplicație Xorg deja lansată din bash

drapel tn

Există vreo modalitate de a spune unui program x care rulează deja să deschidă un fișier din bash? (adică fără a invoca o nouă instanță a programului). În timp ce pun această întrebare în contextul xstata-mp, ma intereseaza mai general daca exista acest gen de solutie în general pentru aplicațiile Xorg.

Am o aplicație x (xstata-mp, proprietar, care este important pentru această întrebare, după cum veți învăța) care rulează foarte bine. Am reușit să fac un script de lansare frumos care verifică mai întâi dacă xstata-mp rulează deja și, dacă este, îl aduce în prim-plan și, în caz contrar, îl lansează. Mai mult ca răspunsul acceptat la această întrebare. Acest lucru este important, deoarece aplicația este instalată ca parte a unei licențe de site, permițând doar un număr limitat de „locuri” concurente (din punct de vedere tehnic, ar trebui să o rulez o singură dată pe o singură mașină).

Problema mea este că uneori vreau să deschid un document folosit de xstata-mp (de exemplu, a .dta fișier de date, a .do fișier script, a .sthlp fișier de ajutor etc.). Dacă dau dublu clic pe pictograma unui astfel de fișier sau selectez pictograma și apesez <ENTER> in timp ce xstata-mp rulează deja, scriptul de lansare este apelat (este menționat în fișierul exec parte din xstata-mplui .desktop dosar) și xstata-mp este ridicată în partea de sus a ferestrelor vizibile, dar fără a deschide documentul.

Pentru ce merită, verifică cu pidof Se pare ca xstata-mp nu lansează un nou xstata-mp proces dacă deschid mai multe documente în cadrul acestuia (de exemplu, folosind <CTRL>-O); contrast cu, să zicem, Firefox și mai multe file/site-uri.

Iată scriptul de lansare pe care aș dori să-l modific:

# Verificați dacă xstata-mp v17 rulează
exit_code_pidof_xstata_mp=$(pidof /usr/local/stata17/xstata-mp)

# dacă xstata-mp v17 NU rulează, atunci lansați-l cu argumentul $1
dacă [ -z "$exit_code_pidof_xstata_mp" ]
  atunci
    /usr/local/stata17/xstata-mp -q $1; ieșire >/dev/null
 # dar dacă xstata-mp v17 rulează, atunci aduceți-l în față
 altfel
  wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; ieșire > /dev/null
  fi
Puncte:1
drapel in

First of all you should find out the correct command to open your document. So try to run the following command and see what you get.

/usr/local/stata17/xstata-mp --help

Of course this is the critical part. And here you rely solely on the functionality of your program. If it does not offer that option, well, then you cannot do it, because all a bash can ever do is start another program. From the 9.4 MB user manual with 399 pages I downloaded from StataCorp LLC, there was not a single hint on how to use xstata-mp.

Maybe the -q option is already what you want. But let's assume the right option to add another document to an already running instance of xstata-mp would be -a (like in VS Code: code -a). Then all you have to do, is to add the following line below your else statement:

/usr/local/stata17/xstata-mp -a "$1"

It would open your document and show the current window now.

Lexible avatar
drapel tn
Mulțumesc, Mark. +1 Am citit deja `xstata-mp --help` și, de asemenea, lucrurile care nu sunt documentate acolo (cum ar fi argumentul `doedit`) în documentația oficială. Mi-a fost teamă că un răspuns ca al tău ar putea fi pe viitor, dar mi-am pus întrebarea în speranța că ar putea exista un standard de interfață pentru aplicațiile Xorg, conform cererii mele. (Dacă există, argumentul `-a` nu este, apropo. ;). (De asemenea: opțiunea `-q` este cu siguranță irelevantă pentru preocupările mele aici.)
Lexible avatar
drapel tn
Hei, Mark. Tocmai am învățat și mă joc cu `xdotool`, care permite manipularea (apăsări de taste, text, introducere cu pointer, ferestre, unele variabile asociate, etc.) programe Xorg. Când voi edita scriptul pentru a funcționa, voi compune un răspuns, dar am vrut să vă spun că există o soluție pentru aplicațiile Xorg în general! :)))
Lexible avatar
drapel tn
Ok, vezi răspunsul meu. :)
Puncte:0
drapel tn

DA: Există o modalitate de a spune unui program x care rulează deja să deschidă un fișier din bash!

Deci, în urma unui sfat de la oamenii de asistență tehnică ai StataCorp, se dovedește că xdotool (care poate fi instalat cu sudo apt install xdotool, dacă nu este deja pe sistemul dvs.) oferă o soluție exact la tipul de problemă din întrebarea mea. De pe site-ul proiectului:

xdotool vă permite să simulați intrarea de la tastatură și activitatea mouse-ului, să mutați și să redimensionați ferestrele etc.Face acest lucru folosind extensia XTEST X11 și alte funcții Xlib.

â ï¸ Notă: Dacă utilizați Wayland, rețineți că acest software nu va funcționa corect. â ï¸

Cu xdotool, puteți căuta ferestre și puteți muta, redimensiona, ascunde și modifica proprietățile ferestrei, cum ar fi titlul. Dacă managerul dvs. de ferestre îl acceptă, puteți utiliza xdotool pentru a schimba desktop-uri, a muta ferestrele între desktop-uri și a schimba numărul de desktop-uri.

Pentru a-mi rezolva problema cu xdotool, trebuia să creez un xdotool script pe care îl sun statadoc.xdo:

#!/usr/bin/xdotool
căutare --nume „Stata/MP”
tip --window %1 „$1” „$2”
key --window %1 Return

Câteva comentarii despre acest scurt scenariu:

  1. Calea poate fi altceva decât /usr/bin/xdotool, așa că asigurați-vă că confirmați asta cu care xdotool sau asemănător.
  2. A doua linie se va potrivi parțial cu numele „Stata/MP 17.0” cu sfoara furnizata mai sus. Acest lucru este util, astfel încât, de exemplu, actualizarea versiunii la 17.1 sau 18.x să nu rupă scriptul. The căutare comanda identifică fereastra aplicației X cu care vreau să interfațez.
  3. xdotool scripturile acceptă argumente, urmând bash-ca $1, $2, etc convenţii.
  4. The tip comanda tasta literalmente textul furnizatâîn cazul meu, conținutul celor două furnizate $1 și $2 argumente șir în prima fereastră (și numai în cazul meu) identificată de căutare comandă pe linia 2.
  5. The cheie comanda trimite un <ENTER> (sau <RETURN> dacă preferați) la aceeași fereastră Stata.

Acum să ne uităm la scriptul meu de lansare modificat, care apelează statadoc.xdo în a treia până la ultima linie (am adăugat o secțiune în față pentru a recunoaște dacă argumentul furnizat indică anumite tipuri de fișiere Stata... sunt necesare comenzi de utilizare diferite pentru a gestiona cu grație fiecare... exemplul meu nu este complet, dar acestea sunt tipurile de fișiere Folosesc în majoritatea lucrărilor mele):

# Verificați dacă NU ESTE un argument. Dacă nu, nu faceți nimic.
dacă [ -z „$1” ]
  atunci
    pauză
 # În caz contrar, setați prefixul la valoarea implicită, apoi verificați 
 # dacă numele fișierului se termină în .hlp, .sthlp, .ado, .do sau .gph
 altfel
  prefix="folosește"
  dacă [ ${1##*.} = „hlp” ] || [ ${1##*.} = „sthlp” ] || [ ${1##*.} = „ado” ] || [ ${1##*.} = „face” ]
    atunci
      # Dacă numele fișierului SE termină cu unul dintre aceste patru prefixe, atunci
      # schimba prefixul în „doedit”, astfel încât Stata deschide documentul cu 
      # editorul do-file.
      prefix="doedit"
    fi
  # Dacă numele fișierului se termină în .gph, atunci schimbați prefixul în „doedit”, deci 
  # Stata deschide documentul cu vizualizatorul/editorul de grafice.
  dacă [ ${1##*.} = „gph” ]
    atunci
      prefix="folosirea graficului"
    fi
  pauză
  fi

# Verificați dacă xstata-mp v17 rulează
exit_code_pidof_xstata_mp=$(pidof /usr/local/stata17/xstata-mp)

# dacă xstata-mp v17 NU rulează, atunci lansați-l cu argumentul $1
dacă [ -z "$exit_code_pidof_xstata_mp" ]
  atunci
    /usr/local/stata17/xstata-mp -q $1; ieșire >/dev/null
 # dar dacă xstata-mp v17 rulează, atunci aduceți-l în față
 altfel
  # Mai întâi, apelați statadoc.xdo cu prefixul ca prim argument, 
  # și calea fișierului furnizată ca al doilea argument 
  /usr/share/stata17/bin/statadoc.xdo „$prefix” „$1”
  wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; ieșire > /dev/null
  fi

Notă: Aceasta este o soluție pentru Gnome care rulează pe Xorg.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.