/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠUn be arable ĠProfessional Ċ Ġ* Ċ Ġ* ĠI Ġdedic ate Ġany Ġand Ġall Ġcopyright Ġinterest Ġin Ġthis Ġsoftware Ġto Ġthe Ċ Ġ* Ġpublic Ġdomain . ĠI Ġmake Ġthis Ġdedic ation Ġfor Ġthe Ġbenefit Ġof Ġthe Ġpublic Ġat Ċ Ġ* Ġlarge Ġand Ġto Ġthe Ġdet ri ment Ġof Ġmy Ġhe irs Ġand Ġsuccess ors . ĠI Ġintend Ġthis Ċ Ġ* Ġdedic ation Ġto Ġbe Ġan Ġo vert Ġact Ġof Ġre lin qu ish ment Ġin Ġper pet u ity Ġof Ġall Ċ Ġ* Ġpresent Ġand Ġfuture Ġrights Ġto Ġthis Ġsoftware Ġunder Ġcopyright Ġlaw . Ċ Ġ*/ Ċ Ċ package Ġpw . un bear . ij plug Ċ Ċ import Ġcom . intellij . icons . All Icons Ċ import Ġcom . intellij . openapi . action System . An Action Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . action System . Common Data Keys Ċ import Ġcom . intellij . openapi . application . Application Manager . getApplication Ċ import Ġcom . intellij . openapi . application . Modal ity State Ċ import Ġcom . intellij . openapi . command . Write Command Action . run Write Command Action Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . Messages . show Input Dialog Ċ import Ġcom . intellij . openapi . ui . Non Empty Input Validator Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** ĠWe Ġhave Ġa Ġpi per Ġdown ! ĠI Ġrepeat , Ġa Ġpi per Ġis Ġdown ! Ġ*/ Ċ class ĠPi per Down Ġ: ĠAn Action () Ġ{ ĊĠĠĠ Ġ// Ġnote Ġhow Ġdo Ġwe Ġget Ġthis Ġfrom Ġthe Ġplugin Ġdefinition ? ĊĠĠĠ Ġprivate Ġval Ġname Ġ= Ġ" pipe prof en " ĊĊĠĠĠ Ġ/** Ġwait Ġthis Ġlong Ġbefore Ġaband oning Ġthe Ġresults Ġof Ġthe Ġpip ed Ġcommand Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġduration Ġ= ĠTimeUnit . SECONDS . to Seconds ( 2 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġthe Ġexecutable Ġwhich Ġwill Ġhave Ġargs Ġappended , Ġe . g .: ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠ Ġ$ Ġbash Ġ- c Ġ' last Arg ' Ġ< Ġselected - text - block ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġprocess Ġ= ĠlistOf (" bash ", Ġ"- c ") ĊĊĠĠĠ Ġprivate Ġval Ġinput Dialog Title Ġ= Ġ" Pipe Ġselected Ġtext Ġto " ĊĊĠĠĠ Ġprivate Ġval Ġinput Dialog Msg Ġ= Ġprocess . join ToString (" Ġ") Ġ+ Ġ" Ġ\ ${ this Ġinput Ġbox }" ĊĊĠĠĠ Ġ/** Ġthe Ġlast Ġargs Ġthe Ġuser Ġused Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlast Args Ġ= ĠKey . create < String >(" args . last ") ĊĊĠĠĠ Ġdata Ġclass ĠProcess Pip es ( val Ġout : ĠString , Ġval Ġerr : ĠString ) ĊĊĠĠĠ Ġ/** Ġdetermines Ġvisibility Ġand Ġavailability Ġof Ġthis Ġaction Ġin Ġthe Ġcontext Ġmenu Ġand Ġkey map Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġupdate ( event : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġ/* Ġearly Ġout Ġif Ġthe Ġeditor Ġis Ġnot Ġin Ġfocus Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon Data Keys . EDITOR . getData ( event . data Context ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġevent . presentation . isVisible Ġ= Ġeditor . selection Model . has Selection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġmain Ġfunctionality Ġfor Ġthe Ġaction : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- Ġalways Ġent ers Ġthis Ġfun Ġupon Ġkeyboard Ġshortcut Ġexecution . ĊĠĠĠĠ Ġ* Ġ- Ġcondition ally , Ġwe Ġenter Ġthis Ġfun Ġupon Ġmenu Ġselection , Ġbut ĊĠĠĠĠ Ġ* ĠĠ Ġafter Ġthe Ġ` update ` Ġvalidates Ġthat Ġthe Ġaction Ġis Ġvisible . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠactionPerformed ( event : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġevent . project Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġevent . getData ( Common Data Keys . EDITOR ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġeditor . document ĊĠĠĠĠĠĠĠ Ġval Ġselection Model Ġ= Ġeditor . selection Model ĊĠĠĠĠĠĠĠ Ġval Ġstarts Ġ= Ġselection Model . block Selection Starts ĊĠĠĠĠĠĠĠ Ġval Ġends Ġ= Ġselection Model . block Selection End s ĊĊĠĠĠĠĠĠĠ Ġ/* Ġcan 't Ġinvoke Ġ` show Input Dialog ` Ġwithout Ġa Ġ` getApplication (). invoke Later ` Ġ*/ ĊĠĠĠĠĠĠĠ Ġget Application (). invoke Later ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġallow Ġthe Ġuser Ġto Ġcancel Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Args ( project )?. let Ġ{ Ġargs Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . put UserData ( last Args , Ġargs ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġap pet izer Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstarts . size . minus ( 1 ). down To ( 0 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcan 't Ġmodify Ġthe Ġdocument Ġstrings Ġwithout Ġa Ġrun Write Command Action Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Write Command Action ( project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= Ġprocess Factory ( args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġdocument . getText ( Text Range ( starts [ it ], Ġends [ it ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpipes Ġ= Ġpipe Input To Process ( input , Ġprocess ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġen ch il ada Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . replace String ( starts [ it ], Ġends [ it ], Ġpipes . out Ġ+ Ġpipes . err ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Model . remove Selection ( all ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĠMod ality State . NON _ MOD AL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġshow Ġinput Ġdialog Ġto Ġobtain Ġuser 's Ġargs Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Args ( project : ĠProject ) Ġ= Ġshow Input Dialog ( ĊĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠ Ġinput Dialog Msg , ĊĠĠĠĠĠĠĠ Ġinput Dialog Title , ĊĠĠĠĠĠĠĠ ĠAll Icons . Tool windows . Tool Window Run , ĊĠĠĠĠĠĠĠ Ġproject . getUser Data ( last Args ), ĊĠĠĠĠĠĠĠ ĠNon Empty Input Validator ()) ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Factory ( args : ĠString ): ĠProcess ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwith Arg Ġ= Ġprocess . to Mutable List () ĊĠĠĠĠĠĠĠ Ġwith Arg . add ( args ) ĊĠĠĠĠĠĠĠ Ġreturn ĠProcess Builder (* with Arg . to Typed Array ()). start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpipe Input To Process ( input : ĠString , Ġprocess : ĠProcess ?): ĠProcess Pip es Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠBufferedReader ( InputStream Reader ( process ?. inputStream )) ĊĠĠĠĠĠĠĠ Ġval Ġerr Ġ= ĠBufferedReader ( InputStream Reader ( process ?. error Stream )) ĊĠĠĠĠĠĠĠ Ġval Ġinp Ġ= Ġprocess ?. output Stream ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinp ?. write ( input . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinp ?. flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinp ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess ?. waitFor ( duration , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProcess Pip es ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . read Text (). replace ("\ r \ n ", Ġ"\ n "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr . read Text (). replace ("\ r \ n ", Ġ"\ n ")) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProcess Pip es ("", Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ