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!
- 1707 megtekintés
Hozzászólások
pwd
kimenetet felhasznalva nem jo igeny szerint?
- A hozzászóláshoz be kell jelentkezni
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....
- A hozzászóláshoz be kell jelentkezni
Használd a $PWD változót, vagy csináld így: $PWD/ majd nyomd meg a tab-ot. Egérrel dolgozol terminálban? :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Ajanlom a terminal tobbszorozoket mint a screen vagy a tmux, elobbiben biztosan tudom hogy van masolas funkcio, a tobbi mar csak alias kerdese.
- A hozzászóláshoz be kell jelentkezni
export PS1="`pwd`\n#"
Tudom, hogy nem pont ezt akartad, így viszont kevésbé zavaró a túl hosszú prompt.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Mondjuk egy echo lemaradt belőle?
- A hozzászóláshoz be kell jelentkezni
Igen.
Nahát. :)
-----------
"Generally, Russian technology assumes dumb machines and smart humans, not the other way around." -- The Russian Tea HOWTO
- A hozzászóláshoz be kell jelentkezni
Mondjuk egy echo lemaradt belőle?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
"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á.)
- A hozzászóláshoz be kell jelentkezni
"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?
- A hozzászóláshoz be kell jelentkezni
/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.
- A hozzászóláshoz be kell jelentkezni
/proc/.../environ tartalmazza a PWD-t
Akkor mar inkabb
readlink /proc/.../cwd
- A hozzászóláshoz be kell jelentkezni
Kösz! Igaz! Kapkodtam.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
stty -echo;pwd|xclip;stty echo ?
Nem probaltam, de ez jutott eszembe hirtelen.
- A hozzászóláshoz be kell jelentkezni
Sajnos nem működik, úgy tűnik, hogy a bash (ill. readline) a parancs futtatása után duplázza meg a sort.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Így tűnik, csak az furcsa, hogy a beírt parancsot és a kurzor helyét is lehet módosítani a billentyűkombinciókhoz rendelt parancsból, erről meg azt gondolnám, hogy a kurzormozgató billentyűkombinációkhoz hasonló funkciókra van kitalálva.
- A hozzászóláshoz be kell jelentkezni
Teljesen jogos, én is így gondolnám, csak úgy fest hogy mégsem így van .)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni