Awesome 3 i Lua
Między egzaminem a projektem który muszę oddać, znalazłem trochę czasu który wykorzystałem na odświerzenie swojego systemu. Mowa głównie o nowym awesome, które w niedalekiej przyszłości osiągnie numerek 3.0.
awesome
Awesome to dynamiczny menadżer okien, pierwotnie bazujący na kodzie dwm (chociaż obecnie, szczególnie w gałęzi 3.0, większośc kodu została przepisana). Cały urok dynamiczności tego rodzaju menadżerów polega na automatycznym skalowaniu okienek. Gdy uruchomione jest jedno okno, zajmuje ono cały ekran roboczy. Uruchomienie kolejnego, skaluje pierwsze i wyświetla oba obok siebie, tak aby zajmowały możliwie największą przestrzeń. Każde następne zostaje wyświetlone w ten sam sposób.
Tych którzy używali już wcześniej awesome 1.x lub 2.x (obecnie stabilną
wersją jest 2.3),
zaskoczyć mogą spore zmiany. Nowe awesome w całości przepisane zostało z xlib
do xcb, a
libconfig zastąpione zostało skryptem
Lua. Dzięki nowemu plikowi konfiguracyjnemu, o wiele
łatwiej ustawić można prawie dowolne zachowanie menadżera, a w przeciwieństwie
do pisania w C, jest to o wiele szybsze i prostsze.
Lua
Lua to język którego już dawno chciałem się nauczyć.
Interpreter jest super mały (pakiet lua 5.1.3-3 to zaledwie 708.33 K !), a
składnia naprawdę prosta. Język podbno znakomity jeśli chodzi o pisanie
pluginów lub nawet małych programów.
Podobnie jak w C++, a w przeciwieństwie do Pythona, baterie nie zostały dołączone. Jeśli nie zainstalujemy dodatchowych bibliotek, pracę ułatwiać nam będzie jedynie biblioteka standardowa. To naprawde niewiele, a biorąc pod uwagę fakt, że Lua nie jest językiem w pełni obiektowym (nie posiada np klasycznych metod) nawet mało.
Lua nie jest językiem obiektowym, ale podobie jak w JavaScript, nie oznacza to, ze nie można tworzyć obiektów. Dodatkowo, każdy obiekt jest cały czas otwarty, więc można dopisywać do niego nowe funkcje i zmienne. Oto prosty przykład 'klasy':
Counter = {}
metatable = {}
-- konstruktor
function Counter:new(val)
return setmetatable({value = val or 1}, metatable)
end
-- metoda
function Counter:up()
self.value = self.value + 1
end
-- instrukcja, gdzie szukać
metatable.__index = Counter
-- tworzymy nowy obiekt
c = Counter:new()
print(c.value) -- 1
c:up()
print(c.value) -- 2
-- ponieważ obiekt c nie zawiera obiektu five, zwraca nil
print(c.five) -- nil
Obiekt c nie zawiera five? Można to zmienić:
c.five = 5
print(c.five) -- 5
c.five = function(v)
local v = v or 1
return v * 5
end
print(c.five()) -- 5
print(c.five(2)) -- 10
'otwieranie' obiektów
W Pythonie, jedną z najbardziej przydatnych metod obiektu string jest split(),
która dzieli ciąg znaków według wzorca. W Lua na pocieszenie mamy parę
podstawowych funkcji, dlatego
wszelkie dane z systemu, przed pobraniem przetwarzałem w sed albo awk. Ale
dlaczego nie zrobić tego od razu w Lua? Oto jak można dodać metode split do
wszystkich obiektów string:
function split(str, splitchar, times)
local splitchar = splitchar or ' '
local times = times or -1
local result = {}
local start = 1
-- cut place - begin & end
local cut = { begins = 1, ends = 0 }
repeat
start = cut.ends + 1
cut.begins, cut.ends = str:find(splitchar, start)
if cut.begins ~= nil then cut.begins = cut.begins - 1 end
table.insert(result, str:sub(start, cut.begins))
times = times - 1
until cut.begins == nil or times == 0
-- dodaj resztę do listy
if times == 0 then
table.insert(result, str:sub(cut.ends + 1))
end
return result
end
-- dodaj metode do obiektu
string.split = split
Gdy zapiszemy to do pliku jako moduł, w dowolnym momencie skorzystać możemy z napisanej funkcji jawnie, lub jako metody.
Lua 5.1.3 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> str = "Hello world!"
> str:split()
stdin:1: attempt to call method 'split' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: ?
> -- błąd, brak obiektu split
> require("stringsplit")
> = str:split()
table: 0x9c3bd20
> -- obiekt istnieje, zwraca tabele stringów
> for i,s in pairs(str:split()) do print(i, s) end
1 Hello
2 world!
> for i,s in pairs(str:split("o")) do print(i, s) end
1 Hell
2 w
3 rld!
> -- można też jawnie podać przetwarzany string jako argument funkcji
> for i,s in pairs(stringsplit.split(str, "ll")) do print(i, s) end
1 He
2 o world!
Lua i awesome
Wraz z awesome, dostajemy dwie biblioteki:
- awful, czyli podstawowy zbiór funkcji do konfiguracji awesome
-
tabulousdla zarządzania tabami
Doinstalować można jeszcze:
- wicked, które powinno ułatwić konfiguracje wyświetlanych informacji
- eminent do dynamicznego zarządzania tagami (tagi to coś pokroju wirtualnego pulpitu).
W planach mam jednak napisanie własnych bibliotek do konfiguracji. A na razie, moja konfiguracja awesome 3 i gotowe pakiety kompilowane wczoraj.