2013-07-13 8 views
6

Sto cercando di migliorare il mio rc.lua per il Awesome window manager. L'impostazione predefinita rc.lua imposta un menu con il seguente codice:L'istruzione if-then-else-end sta fallendo in Lua; come posso ripararlo?

myawesomemenu = { 
    { "manual", terminal .. " -e man awesome" }, 
    { "edit config", editor_cmd .. " " .. awesome.conffile }, 
    { "restart", awesome.restart }, 
    { "quit", awesome.quit } 
} 

Io uso Awesome as window manager per l'ambiente desktop GNOME, quindi voglio avere l'uso Impressionante il programma gnome-session-quit invece di awesome.quit, ma solo se la la variabile d'ambiente "DE" è impostata su "gnome". Pertanto, ho sostituito la quinta linea con

{ "quit", if os.getenv("DE") == "gnome" then os.execute("/usr/bin/gnome-session-quit") else awesome.quit end } 

Ma quando ricarico del file, ottengo "simbolo inaspettato nei pressi di se". Come posso risolvere questo problema e cosa lo causa?

+2

Causa: in Lua, un'istruzione 'if' non è un'espressione. –

risposta

6

Prova questa:

{ "quit", (os.getenv("DE") == "gnome") and function() os.execute("/usr/bin/gnome-session-quit") end or awesome.quit} 

a and b or c è come l'espressione C a ? b : c, a condizione che non è bfalse.

+0

La parte 'os.execute ("/usr/bin/gnome-session-quit ")' probabilmente deve essere racchiusa in una funzione. Altrimenti finisce per essere eseguito esattamente dove è invece che dopo. – greatwolf

+0

@greatwolf Buon punto, risolto. –

+2

+1, bello involucro ternario –

4

sono abbastanza sicuro Lua non funziona così: P

Hai provato avvolgendolo in una funzione?

{ 
    "quit", 
    function() 
     if os.getenv("DE") == "gnome" then 
      os.execute("/usr/bin/gnome-session-quit") 
     else 
      awesome.quit 
     end 
    end 
} 

Puoi provare anche a riscrivere awesome.quit?

_awesome_quit = awesome.quit 
awesome.quit = function() 
    if os.getenv("DE") == "gnome" then 
     os.execute("/usr/bin/gnome-session-quit") 
    else 
     _awesome_quit() 
    end 
end