Terminál speciális prompt-kezeléssel

Fórumok

Kedves HUP-osok!

Őskövület lévén időről időre megpróbálok egy-egy szép fájlmenedzsert, aztán visszatérek a parancssorhoz. Ehhez nagyon jó bármely mai grafikus terminál-emulátor. Néhány kényelmi funkció (pl. tab-ok, könnyű karakterméret-váltás, ...) persze jól jön, de alapvetően parancssorból dolgozok.

Most eszembe jutott egy dolog, ami nagyon hiányzik és azt kérdezem, tudtok-e ilyen terminálemulátorról.

Szeretem kiírni a prompt-ba a teljes PATH-t, mert akkor látom hol vagyok és ha egyik terminál munkakönyvtárából másolni akarok valamit egy másikba, akkor a cél könyvtárat copy-paste-tel tudom átvinni. Csakhogy néha túl hosszú lesz így a prompt. Az volna jó, ha nekem a terminálban csak a munkakönyvtár rövidített neve jelenne meg láthatóan (pl. csak az utolsó 10 karakter vagy az utolsó /-től), *de* ha ezt bemaszatolom az egérrel, akkor a vágólapra a teljes elérési út kerüljön, hogy az egymásra hivatkozás könnyen menjen.

Így megmaradna a gyors másolási lehetőség, de kezelhető hosszú lenne a kiírt prompt. A teljes elérési út állandó kiírására úgysincs állandóan szükség.

Szóval, ha tudtok ilyen terminál-emulátorról, kérlek, írjátok meg.

Előre is kösz!

Hozzászólások

Ja, az jó, csak sok klikk meg leütés. Lustasági okokból jó lenne, ha nem kellene az egér mozgatása közben billentyűre váltanom, amíg a pwd-t begépelem a másik terminálban. :-)

Most jut eszembe: még jobb lenne, ha az egyik terminálban egy spec. billentyűkombinációt lenyomok, a többi, azonos virt. desktopon megnyitott terminálok shelljeinek aktív könyvtárai közt scrollozhatnék: ekkor még egerészni se kellene....

Na, még egyszer, mert nem voltam világos:

Alaphelyzet (nálam tipikus): egy virt.desktopon van 3 terminálablak megnyitva. Általában Alt+Tab-bal váltok köztük. Mindegyikben tök más az aktív könyvtár.

Prüntyögök az egyikben egy darabig. A prüntyögés eredményeként előáll egy fájl, amit a másik terminálban aktív könyvtárba kellene átmásolni, majd oda váltani és dolgozni tovább.

Most ehhez egeret használok, mert mindenhol a prompt a teljes elérési utat (a ~ rövidítéssel) tartalmazza. Ebből keresek kiutat, mert zavar a néha hosszúra hízó prompt.

a) (nyitó ötlet): Van-e spec. terminálprogi, mely a promptba a $PWD végét írja csak ki, de egérrel befestés esetén a teljes $PWD megy a vágólapra? Ha lenne, a fenti másolási igény esetén csak gyorsan az egérhez nyúlok, befestem a másik ablak promptját, vissza a mostanira majd középső klikk: itt a célkönyvtár. Most is ez megy, csak a hosszú kiírt prompt néha zavar.

b) (közben eszembe jutott): Van-e spec terminálprogi, melybben egy billentyűkombináció az aktív parancssorba beírja többi terminálablak $PWD-it, úgy, hogy válogathassak köztük. Ekkor lehetne rövid a prompt és még egerészni sem kellene.

Remélem, most érthetőbb voltam.

Tehát: most az egeret csak a promptból vett $PWD másolására használom. Jó lenne, ha ez sem kellene.

az egérbuffer az egérbuffer....amit belemásolsz az van benne és nem az amit szeretnél....
mondjuk az urxvt-nek szép kis API-ja van, amivel lehet hogy megoldható a dolog, mondjuk a terminálba klikkelés esetén megnézi, hogy mit tartalmazott a szöveg és ha speciális string volt (valami kukac valami kettőspont), akkor belerakja az éppen aktuális PWD értékét egy változóba, amit a másik tud olvasni....
de ez elég gányolás

Hello.

1, bölcsész vagyok, de arra amit itt leírtál arra ez jónak tűnik:

~/.bashrc-be a következő:


alias foo='pwd > ~/.foo'

function moo() { M=`cat ~/.foo` ;
                 cp "$M/$1" $PWD ;
               }

Két terminál van nyitva A és B. A-ban sikerül megalkotni a legújabb bash csodát, melynek teljes elérési útja: /home/horvatha/bin/csoda.sh

Ezt a file-t szeretnéd átmásolni a /home/horvatha/sources/top_secret könyvtárba. A B ablak -- mit ad Isten -- pont itt van nyitva. Mivel a .bashrc-ben már benn figyel foo és moo ezért roppant könnyű a dolog.


# Képzeljük azt, hogy A terminálban vagyunk...
horvatha@atomeromu:~/horvatha/bin/$
horvatha@atomeromu:~/horvatha/bin/$ foo
# Most egy Alt-Tab történik, és hipp-hopp már B-ben vagyunk
horvatha@atomeromu:~/horvatha/sources/top_secret$ moo csoda.sh
horvatha@atomeromu:~/horvatha/sources/top_secret$ ls
A_bomb.sh B_bomb.sh csoda.sh

2, Sajnos ennek az a hátránya, hogy a másolandó file nevét be kell pötyögni. Még mindig gyorsabb mint az egér -- főleg, hogy nagy valószínűséggel a másik ablakban a file neve is olvasható -- de azért még sem az igazi. Elvileg a bash tab completitionja(je?) programozható, nem tud valaki tippet adni, hogy hogyan? Vagy hallottam, hogy a zsh ilyesmiket alapból tud, ezt is tudná?

3, Milyen hátránya van, ha ilyen megoldásokat használ valami? Szól az ellen érv, hogy kis textfile-okban tároljunk adatokat és azokkal trükközzünk a hétköznapi feladatok megoldásánál -- mindenféle API-k helyett?

4, Tudna valaki esetleg egyszerűsíteni, szépíteni ezen a fenti megoldáson? Nem vagyok otthon a bashben annyira, gondolom moo-t meg lehet írni egy sorban is.

-----------
"Generally, Russian technology assumes dumb machines and smart humans, not the other way around." -- The Russian Tea HOWTO

Hmm.

Ha átírnám így:


function foo () { "$PWD/$1" > ~/.foo ;}

function moo() { M=`cat ~/.foo` ;
                 cp $M $PWD ;
               }

akkor elvileg "foo filenev" használatakor lenne tab completition és a másik ablakban csak a moo-t kéne kiadni.

De valamiért azt írja ki a foo-ra, hogy "Permission denied". Valakinek valami ötlete? Vagy tegyem át ezt a kérdést a bash topikba?

-----------
"Generally, Russian technology assumes dumb machines and smart humans, not the other way around." -- The Russian Tea HOWTO

Tetszőleges számú file másolása és beillesztése terminálok/könyvtárak között:


function cpy () {  > ~/.foo;
                   for name in $* ; do
                   echo "$PWD/$name" >> ~/.foo
                   done
                }

function pst () { N=0
                  cat ~/.foo | while read LINE ; do
                    N=$((N+1))
                    cp $LINE $PWD
                  done
                }

Használata: cpy másolando_file [ok nevei] , célkönyvtárban/terminálban pst. Gépek között ez még nem megy. :)

Egyszerűsítésre ötletek? A megközelítés hibái? Valaki?

-----------
"Generally, Russian technology assumes dumb machines and smart humans, not the other way around." -- The Russian Tea HOWTO

buta ötlet, de ha soremelést tennél a promptba a path végére, akkor kiférne hosszú path is, és a sor elején lenne a kurzor...

Aligha létezik ilyen terminál emulátor, hiszen a terminál nem tud semmit sem a prompt fogalmáról. Ő csak megjeleníti, amit az alkalmazások kérnek tőle, és a shelled (az egyik alkalmazás a sok közül) néha valami olyasmit irat ki, amit te promptnak hívsz.

Kerülő megoldásokon, elegendően jó részmegoldásokon viszont érdemes gondolkodni.

Lehet valami háttérben futó clipboardkezelő program (biztos van ilyen, bár én ezeket nem ismerem), és írni vmi parancssoros progit, amelyik beküldi a clipboardkezelő számára, hogy mostantól márpedig ez legyen a clipboard tartalma. Ezt szükség esetén gyorsan meghívnád a shellből.

Gnome-terminál tud olyat, hogy új fül/ablak nyitásakor az előző terminál munkakönyvtárát átmenekíti. Persze ez csak részben működik, hiszen a terminál közvetlen gyerekének munkakönyvtárára néz rá, így subshell (mc, ssh stb.) esetén már nem megy. .bashrc-ből a shell induláskor kiírhatná magától a teljes útvonalat, aztán a prompt csak a rövidet. Igény esetén gyorsan nyitsz egy ideiglenes tabot, onnan kimásolod az útvonalat, és rögvest be is zárod. Ha bátor vagy, akkor a gnome-terminál kódját továbbfejlesztheted, hogy valami shortcut új tab nyitása helyett a clipboardba rakja az aktuális útvonalat.

Ha van kedved hackelni kicsit, lehet egyéb irányokba is elindulni. Például az URL-rövidítők mintájára útvonal-rövidítő, amely egy szimlinket tart karban, és a promptban ez jelenik meg.

Lehet csinálni saját escape szekvenciát, amely a clipboardba másol, ez azonban security és használhatóság szempontból is aggályos (utóbbi: minden promptkiírás agyonvágná a korábbi clipboardot, bármi is volt benne). Amíg csak magadnak hegeszted össze, addig a security vonzata valszeg nem érdekes.

"Aligha létezik ilyen terminál emulátor, hiszen a terminál nem tud semmit sem a prompt fogalmáról. "

Igen, ezt összeraktam magam is. Csak gondoltam, hogy esetleg valakinek már kellett ilyen, és csinált egy integrált terminál-shell kombót vagy shellt egy shellhez. :-)

Sajnos, nagyon távol vagyok attól, hogy gnome-terminal kódot fejlesszek tovább.

Még az tűnik reálisnak, hogy egy kis progit írjak, ami a bash-októl lekérdezi a $PWD-jüket (ha lehet), és egy billentyűvel ezek közt lehetne scrollozni. Ez terminálprogitól független lenne, igaz, nem tudna semmit a virt.desktopról.

Még gondolkozom a Te ötleteiden is. Ha lenne valami, szólok. (Bár kicsi az esély, mert időm nincs rá.)

"Még az tűnik reálisnak, hogy egy kis progit írjak, ami a bash-októl lekérdezi a $PWD-jüket "

Hopp! Ez működhet. /proc/.../environ tartalmazza a PWD-t! EZt könnyű kinyerni!

Csak hogy veszem rá a bash-t, hogy egy billentyűre indítson egy progit, és annak kimenetének sorai közt scrollozzon és amit akarok, tegye be a command line-ba?

/proc/.../environ a program indulásakor kapott PWD értéket tartalmazza, már ha kapott ilyet, vagyis ha shell indította. Tehát maga a shell nem feltétlenül bír ilyennel, de ha van is neki, az nem követi a shellen belüli könyvtárváltásokat. Helyette readlink /proc/.../cwd viszont jó (már ha linuxon kívül más unix nem érdekel).

bash-be gombnyomásra menüindítás: szerintem felejtős.

Lehet mondjuk progit írni, ami kiírja az összes futó bash cwd-jét, aztán abból szemezgetni. Hátrány, hogy parancssor írása közben nem tudod hirtelen ott abban az ablakban elindítani.

Jó ideje nekem a terminálok címének a terminál számát adom (tty progi kimenetéből a /dev/pts/ sallang utáni szám), .bashrc állítja be talán, messze ez a leghasznosabb cím, amit valaha terminálnak adni lehet. Ezt meg lehet toldani egy olyan trükkel, hogy egy "valamiprogi szám" közvetlen az adott terminálon futó bash cwd-jét írja ki. Ekkor ahol másolni akarsz, ott használhatsz parancshelyettesítést: cp ezt `valamiprogi 7` , hátrány hogy nincs visszajelzés a progi végrehajtása előtt, hogy valóban jó helyre másolod-e.

Egyébként az előző postomra visszatérve: az jutott eszembe, hogy az ablakcím is lehet akár egy ilyen puffer: ha a címbe betolod a cwd-t, akkor csak egy olyan plusz menüpont kell a terminál progiba, ami a címet másolja a vágólapra. Vagy a cím mellett egy másik teljesen hasonlóan működő mező, hogy a cím az maradhasson amit szeretnél.

még mindig urxvt és a perl API-ja...most komolyan...legalább nézd meg http://pod.tst.eu/http://cvs.schmorp.de/rxvt-unicode/src/urxvt.pm
igen érdekes dolgokat lehet vele csinálni....pl. billentyűkombóra kijelölni szavakat, majd linkké tenni őket, amikre klikkelve a megfelelő parancs lefut...
meg még ezer dolgot...végülis bármit amit el tudsz képzelni...

A kovetkezo jutott eszembe: irsz egy programot, amelyik allandoan fut, es minden shell "bejelenti" neki az aktualis directoryjat (lasd

PROMPT_COMMAND

). Amikor szukseged van a listara, akkor elinditasz egy masik programot, ami lekerdezi tole, es egy ablakban megjeleniti.

Az aktuális könyvtárat vágólapra teszi billentyűkombinációval (bash-ben):

bind -x '"\C-p":"pwd|xclip"'

Hátránya, hogy megismétli az aktuális sort, ha használjuk. Erre nem tudtok megoldást?

Ez tetszik, az xclip progit eddig nem ismertem. Érdemes a newline-t lecsípni, hogy ne kerüljön a vágólapra: pwd | tr -d '\n' | xclip

A sorismétlésre nincs ötletem, illetve szerintem arra számít a bash, hogy a parancs produkál valami kimenetet, amit meg akarsz tekinteni, ezért az indítása előtt sort emel, és utána újrarajzolja a promptot és az eddig begépelt parancssort - hasonlóan a ^L-hez vagy a ^X^V-hez.

Probald meg ezt:

_x()
{
COMPREPLY=( $(compgen -W "$(for a in $(pgrep -u $USER $(basename $SHELL)); do readlink -f /proc/$a/cwd; done)" -- ${COMP_WORDS[COMP_CWORD]}) )
}

aztan:

complete -F _x cxp

majd:

cxp \t\t

NB. a szokozokkel nincs jo baratsagban.