menu | o mnie | repozytorium | projekty | blog | rss | tagi

Awesome 3 i Lua

2008-06-24

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 logo. 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:

Doinstalować można jeszcze:

W planach mam jednak napisanie własnych bibliotek do konfiguracji. A na razie, moja konfiguracja awesome 3 i gotowe pakiety kompilowane wczoraj.

Komentuj

Twoje imię
Strona www
Adres mailowy
Kod HTML zostanie usunięty. Do formatowania tekstu, możesz użyć składni markdown.
Zbyt duża ilość czystych linków w komentarzu, może zostać potraktowana jako spam. Przy większej ich ilości, użyj składni markdown .

This site's design and contents are copyright © 2008 Piotr Husiatyński. All views and opinions expressed are those of their authors.

Powered by Django, Vim and Arch Linux.