A legújabb gépemre feltettem a legújabb 64 bites cygwin-t. Megpróbáltam kedvenc terminál emulátor csomagomat is feltenni, amely az "rxvt" névre hallgat. De legnagyobb megrökönyödésemre a 64 bites csomagok között nem találtam. Eljött hát az ideje, hogy a fejlettebb urxvt (rxvt-unicode) csomagot tegyem fel. Ez sok olyan dolgot is tud, amit már régóta szerettem volna. Ez már pl. tud tab-okat használni. Plusz perl-ben programozható, ami szintén egy jó pont, mert saját igényünkre szabhatjuk, ha van egy kis programozói vénánk. Eddig azért halogattam, mert X szerver kell hozzá indítani és ezt ki tudja mely okból, szerettem volna elkerülni.
Nézzük, hogy milyen extra cygwin csomagokat kell feltenni. Ezek az rxvt-unicode, perl (mert nemcsak, hogy lehet hozzá szkripteket írni, de kell is a működéséhez), Xorg-server, no és a vim, gvim. A cygwin gyökér könyvtárában létrehoztam egy kis cmd szkriptet.
c:\cygwin\Xwin.bat
SETLOCAL
REM Ha a home könyvtár máshová van linkelve, mint
REM c:\cygwin\bin\..\home\<username> akkor meg kell adnunk, hogy hol
REM található a .XWinrc
REM SET HOME=X:\myhome\%USERNAME%
c:\cygwin\bin\run.exe XWin.exe –multiwindow
ENDLOCAL
A -multiwindow argumentumot azért szeretem, mert így nem fedi el a teljes képernyőt egy X-es tök fekete háttér. Lényegében teljesen olyan, mintha sima Windows-os ablakok nyílnának. A szkript symlink-jét pedig hozzáadtam a Start menühöz: Start | All programs | StartUp. Így bejelentkezéskor el fog indulni az X szerver. De indulás előtt még egy kicsit személyre szabtam az X konfig file-ját (~/.Xwinrc). Én ezt a tartalmat használom (Mondjuk a FAQ-t és a User's Guide-ot ki lehetne hagyni, de így mennyivel szofisztikáltabb):
MENU root {
Urxvt EXEC "LANG=hu_HU.UTF-8 /bin/urxvt -pe tabbed -bg '#000020' -fg '#a0a000' -sl 50000 -geometry 80x43"
Gvim EXEC "LANG=hu_HU.UTF-8 /bin/gvim"
Emacs EXEC "/bin/emacs"
Notepad EXEC notepad
SEPARATOR
FAQ EXEC "/bin/cygstart http://x.cygwin.com/docs/faq/cygwin-x-faq.html"
"User's Guide" EXEC "/bin/cygstart http://x.cygwin.com/docs/ug/cygwin-x-ug.html"
SEPARATOR
"View logfile" EXEC "/bin/gview +\$ $XWINLOGFILE"
"View .XWinrc" EXEC "/bin/gvim ~/.XWinrc"
"Reload .XWinrc" RELOAD
SEPARATOR
}
ROOTMENU root
SILENTEXIT
Ezzel a beállítással a system tray-ben megjelenő X ikonra jobb klikkelve egyből megnézhető, hogy ha valami nem akar indulni, akkor mit ír log file-ba: Valamint az .XWinrc-t is a saját menüjéből lehet szerkeszteni és rögtön újra is lehet olvastatni vele. A SILENTEXIT azért kell, hogy ne kelljen az X leállításakor mindig még egy gombot nyomni. Ezt beállítva csak akkor kérdez, ha legalább egy X-es program még fut. De még tovább is lehet csinosítani a konfig file-t. Pl. minden X-es alkalmazás system menüjébe felvehetünk extra menüpontokat, így bármely X által indított ablak bal felső sarkába kattintva elindíthatjuk kedvenc programjainkat. Persze ugyanezt applikáció specifikusan is be lehet állítani és még sok egyéb trükköt is el lehet követni. Bővebb info a man xwin oldalon...
MENU aot {
SEPARATOR
Urxvt EXEC "LANG=hu_HU.UTF-8 /bin/urxvt -pe tabbed -bg '#000030' -fg '#a0a000' -sl 5000 -geometry 80x43 -e /bin/bash -l -i"
"Always on Top" ALWAYSONTOP
}
DEFAULTSYSMENU aot ATEND
Ezzel rendbe tettük az X beállításokat. Most pediglen koncentráljunk az urxvt beállításokra. Ezeket az ~/.Xdefaults-ban tudjuk bekrampácsolni. Nekem a ~/.Xresources file szerkesztése semmi változást sem okozott, pedig szerinte annak is kellene működnie.
# http://www.askapache.com/linux/rxvt-xresources.html
# or use urxvt --help
# set TERM variable to this string
URxvt.termName: rxvt
#Igazából nem login shell, csak interactive shell
# Tehát .bash_profile nem fut, de a .bashrc fut
URxvt.loginShell: true
# Az ablakot felgörgetjük és gépelünk, akkor a promptra ugrik
Urxvt.scrollTtyKeypress: true
# Az ablakot felgörgetjük és frissül a kimenet,
# akkor nem a ugrik az új tartalomra
Urxvt.scrollTtyOutput: false
# Randa szürke háttér, de úgyis át fogom definiálni
URxvt.background: #808080
# Kiegészítések
URxvt.perl-ext-common: tabbed,default,matcher
URxvt.perl-lib: /usr/lib/urxvt/perl/
# Nekem a tabbedex bugosnak tűnik
#URxvt.perl-ext-common: tabbedex
#URxvt.tabbed.new-button: true
#URxvt.tabbed.autohide: true
# Ha URL jelenik meg a képernyőn, akkor klikkelhető
URxvt.url-launcher: /usr/bin/cygstart
URxvt.matcher.button: 1
# More extensions:
# https://wiki.archlinux.org/index.php/rxvt-unicode
Ez engedélyezi, hogy egy terminál emulátorban több ablakot is nyithassunk. Ehhez kell a "tabbed" csomag. A "matcher" pedig azt teszi lehetővé, hogy ha kiírunk egy URL-t , akkor ez a képernyőn aláhúzva jelenik meg és ráklikkelve el is indítja a default browser-rel. Ha nem állítjuk be a "termName" tulajdonságot, akkor az elindított bash-ben a TERM valami olyasmire lesz beállítva, hogy "urxvt-unicode-256color", amit nem sok minden fog felismerni. Az "rxvt" jobb választásnak tűnik. Új fület a shift+le nyomásával nyithatunk. Navigálni pedig a shift bal/jobb gombbal lehet. A füleket mozgatni a ctrl+bal/jobb gombokkal lehet.
Imádom, hogy az Alt + S-sel bele lehet keresni a képernyőn megjelenő szövegbe. Az Alt+S-re megjelenik alul egy prompt, ahová egy regexp-et süthetünk el, amire a fel és le nyilakkal kereshetünk továbbá. Nagyon sokat segít!
Meg kellene hívni az urxvt-t, de szeretnénk ha magyar karaktereket is mutatná. Viszont azt nem, hogy magyarul jelenjenek meg a szövegek. A halálom, amikor egy program help-je magyarul jelenik meg, vagy amikor az "ls -l" úgy kezdi, hogy "összesen". Bocs, de a szokás nagy úr!
Jöjjön hát az urxvt-t elindító batch file-ocska. Ugyanezt fogom használni a Total Commander-be való integrálásra is, ezért első blikkre egy kicsit túlspilázottnak fog tűnni. De előtte még két probléma, amibe belefutottam. Az első az, hogy ha az rxvt-t batch-ből "start" paranccsal indítottam, akkor elindult egy cmd, ami elindította az rxvt-t, majd a cmd szépen bezárult. No ez nem működött urxvt-vel. Egy csomó felesleges cmd-vel lett tele a taskbar-om. Hosszas keresgélés után véletlenül találtam rá a cygwin-ben levő run.exe-re, ami pont erre a problémára ad megoldást (bár nem tökéletes, mert a fókuszt néha nem teszi az éppen elindított konzolra). A másik probléma az volt, hogy az urxvt-t elindító batch file-nak szerettem volna Total Commander-ből átadni a forrás könyvtárat, forrás file-t, cél könyvtárat és cél file-t. Erre szolgálnak a Total Commander %P, %N, %T, %M speciális paraméterei. Sajnos a %N teljesen eltérően működik a többitől! Ha a forrás file nevében szóköz van, akkor magától macskakörmök közé zárja a nevet, míg a többi nem. De ha üres nevet ad át (pl. a [..] van kijelölve a forrás ablakban), akkor ezt nem teszi, azaz valójában semmit nem fog átadni. A többieknél ez megoldható, hogy mi tesszük macskakörmök közé és akkor minden körülmények között jól fog működni. De ez %N-re nem jó, mert ha szóköz van a forrás file nevében, akkor a "%N"-ből ""akarmi barmi.txt"" lesz. Az egymás mellett álló két macskaköröm pedig egy üres szöveget fog adni és az indított batch file két argumentumot fog kapni. A megoldás, hogy dupla macska köröm közé kell zárni a %N-et, de akkor meg a batch file-ban kell trükközni egy picit, hogy a felesleges macskaköröm duplikátumokat leszedjük. Ezt jeleztem a TC fejlesztőknek (>itt<), de úgy látom, hogy ez csak nekem fáj. Ezért marad a maszatolás.
A végeredmény a c:\cygwin\Urxvt.bat file lett:
set TC_SRCDIR=%~1
set TC_SRCFILE=%~2
set TC_DSTDIR=%~3
set TC_DSTFILE=%~4
set LANG=hu_HU.UTF-8
REM Hungarian special letters cannot be used!
REM set LANG=en_EN.UTF-8
REM Total Commander's %N behaves strange, so call as ""%N""
REM But then extra " has to be removed.
REM Works properly as Dos file cannot contain "
REM If %2 was not defined then TC_SRCFILE would be set to "=
if NOT "%TC_SRCFILE%" == "" set TC_SRCFILE=%TC_SRCFILE:"=%
C:\cygwin\bin\run.exe urxvt.exe -pe tabbed -bg #000040 -fg #a0a000 -sl 50000 -geometry 83x4
Ha meghívjuk, akkor elindítja az urxvt-t és a cmd is eltűnik a színről! Sajnos a run nem mindig adja át a fókuszt az elindított programnak. Érdemes az első indását után a taskbar-ban az urxvt ikonjára jobbklikkelni és pin-elni. Így windows gomb+szám lenyomásával klattyolgatás nélkül indíthatjuk az urxvt-t. További urxvt-ket pedig a windows+shift+szám lenyomásával. Az urxvt terminálok között a windows+ctrl+szám kombinációval váltogathatunk. Nagyon kényelmes Windows-os megoldás!
Ha előfordulhat, hogy leállítjuk az XWin-t, vagy nem szeretnénk feleslegesen elindítani, akkor a fenti batch programot kiegészíthetjük az alábbi pár sorral, amit az utolsó sor elé kell illesztenünk. Ez leellenőrzi, hogy fut-e már az XWin.exe és ha nem, akkor elindítja (lehet, hogy bizonyos esetekben a timeout 2 mp-es értékét célszerű növelni, de az is lehet, hogy elhagyható).
SETLOCAL EnableExtensions
set PTH=%~dp0
set EXE=XWin.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
call %PTH%XWin.bat
timeout /T 2
:FOUND
Egy szépséghibája van. Ha minden urxvt-t lelőttünk, akkor nem fog magától kilépni az XWin. De hát ezzel most együtt kell tudnunk élni!
Ha Total Commander-ben egy új ikon gombot hozunk létre és az alábbiakat állítjuk be, akkor pedig a bash fel fogja tudni használni a TC_SRCDIR-t, hogy belépjen a TC-ben levő könyvtárba. Nagyon hasznos lehetőség! A TC gomb beállítása egyszerű:
Command: C:\cygwin\Urxvt.bat
Paramters: "%P" ""%N"" "%T" "%M"
(dupla macskaköröm %N körül!!)
Icon file: C:\cygwin\Cygwin-Terminal.ico
Már csak a ~/.bashrc-t kell meghákolni. Hogy elkerüljük a LANG által beállított magyar üzeneteket használjuk a
export LC_MESSAGES=en_US.UTF-8
Hogy a Total Commander-es trükk is működjön még ez kell bele:
if [ -n "$TC_DSTDIR" ]; then
if [[ "$TC_DSTDIR" == \\* ]]; then
echo "Destination is a network share. Please map it before use!"
elif [[ "$TC_DSTDIR" == [0-9]:* ]]; then
echo "Destination is on an ftp server."
else
TC_DSTDIR=$(cygpath -u "${TC_DSTDIR}")
fi
fi
if [ -n "$TC_SRCDIR" ]; then
if [[ "$TC_SRCDIR" == \\* ]]; then
echo "Source is a network share. Please map it before use!"
elif [[ "$TC_SRCDIR" == [0-9]:* ]]; then
echo "Source is on an ftp server. Can not change directory!"
else
TC_SRCDIR=$(cygpath -u "${TC_SRCDIR}")
cd "$TC_SRCDIR"
fi
fi
Ez a DOS-os path-okból Unix-osat csinál és ha a TC_SRCDIR definiálva van, akkor oda lép. Még azt is ellenőrzi, hogy a könyvtárak nem ftp, vagy smb link formátumúak-e, mert oda nem tudunk ilyen egyszerűen belépni. Persze, ha nem használunk ilyeneket, akkor kb. 3 sorra redukálható a fenti részlet...
Termináljunk minden nap!
+jegyzések