Удивительные WM 3.5 отдельные файлы конфигурации

Я не уверен, если это нормально, чтобы спросить об этом здесь, так что скажите мне, если это не так:) . Я понятия не имею, где еще спросить.

У меня проблема с Awesome WM. Я пытаюсь разделить rc.lua на разные файлы (потому что это становится длинным) и просто загрузить их в rc.lua.

У меня есть функция для изменения макета Xrandr. Этот код работает нормально, когда вставляется непосредственно в rc.lua.

-- Xrandr settings switcher -- 
-- Get active outputs
local function outputs()
   local outputs = {}
   local xrandr = io.popen("xrandr -q")
   if xrandr then
      for line in xrandr:lines() do
     output = line:match("^([%w-]+) connected ")
     if output then
        outputs[#outputs + 1] = output
     end
      end
      xrandr:close()
   end

   return outputs
end

local function arrange(out)
   -- We need to enumerate all the way to combinate output. We assume
   -- we want only an horizontal layout.
   local choices  = {}
   local previous = { {} }
   for i = 1, #out do
      -- Find all permutation of length `i`: we take the permutation
      -- of length `i-1` and for each of them, we create new
      -- permutations by adding each output at the end of it if it is
      -- not already present.
      local new = {}
      for _, p in pairs(previous) do
     for _, o in pairs(out) do
        if not awful.util.table.hasitem(p, o) then
           new[#new + 1] = awful.util.table.join(p, {o})
        end
     end
      end
      choices = awful.util.table.join(choices, new)
      previous = new
   end

   return choices
end

-- Build available choices
local function menu()
   local menu = {}
   local out = outputs()
   local choices = arrange(out)

   for _, choice in pairs(choices) do
      local cmd = "xrandr"
      -- Enabled outputs
      for i, o in pairs(choice) do
     cmd = cmd .. " --output " .. o .. " --auto"
     if i > 1 then
        cmd = cmd .. " --right-of " .. choice[i-1]
     end
      end
      -- Disabled outputs
      for _, o in pairs(out) do
     if not awful.util.table.hasitem(choice, o) then
        cmd = cmd .. " --output " .. o .. " --off"
     end
      end

      local label = ""
      if #choice == 1 then
     label = 'Only <span weight="bold">' .. choice[1] .. '</span>'
      else
     for i, o in pairs(choice) do
        if i > 1 then label = label .. " + " end
        label = label .. '<span weight="bold">' .. o .. '</span>'
     end
      end

      menu[#menu + 1] = { label,
              cmd,
                          "/usr/share/icons/Tango/32x32/devices/display.png"}
   end
   return menu
end

-- Display xrandr notifications from choices
local state = { iterator = nil,
        timer = nil,
        cid = nil }
local function xrandr()
   -- Stop any previous timer
   if state.timer then
      state.timer:stop()
      state.timer = nil
   end

   -- Build the list of choices
   if not state.iterator then
      state.iterator = awful.util.table.iterate(menu(),
                    function() return true end)
   end

   -- Select one and display the appropriate notification
   local next  = state.iterator()
   local label, action, icon
   if not next then
      label, icon = "Keep the current configuration", "/usr/share/icons/Tango/32x32/devices/display.png"
      state.iterator = nil
   else
      label, action, icon = unpack(next)
   end
   state.cid = naughty.notify({ text = label,
                icon = icon,
                timeout = 4,
                screen = mouse.screen, -- Important, not all screens may be visible
                font = "Free Sans 18",
                replaces_id = state.cid }).id

   -- Setup the timer
   state.timer = timer { timeout = 4 }
   state.timer:connect_signal("timeout",
              function()
                 state.timer:stop()
                 state.timer = nil
                 state.iterator = nil
                 if action then
                awful.util.spawn(action, false)
                 end
              end)
   state.timer:start()
end

Я сохраняю его как xrandr.lua и вставляю в папку awesome/rc.

Тогда у меня есть функция в rc.lua для загрузки файлов из папки "rc" ( отсюда):

function loadrc(name, mod)
   local success
   local result

   -- Which file? In rc/ or in lib/?
   local path = awful.util.getdir("config") .. "/" ..
      (mod and "lib" or "rc") ..
      "/" .. name .. ".lua"

   -- If the module is already loaded, don't load it again
  if mod and package.loaded[mod] then return package.loaded[mod] end

   -- Execute the RC/module file
   success, result = pcall(function() return dofile(path) end)
   if not success then
      naughty.notify({ title = "Error while loading an RC file",
               text = "When loading `" .. name ..
              "`, got the following error:\n" .. result,
               preset = naughty.config.presets.critical
             })
      return print("E: error loading RC file '" .. name .. "': " .. result)
   end

   -- Is it a module?
   if mod then
      return package.loaded[mod]
   end

   return result
end

Затем я вставил loadrc("xrandr") в мой rc.lua, но ничего не происходит. Я пробовал разные файлы (например, простой виджет и затем загружал этот файл виджета), но все, что я получаю, это просто пакет ошибок, и он не работает.

Я также попробовал просто: "require("xrandr")", но все так же.

Я пытался гуглить, но все для крутых 3.4, и я не очень опытен в коде Lua. Спасибо за помощь

2 ответа

Решение

В принципе, require("xrandr") в ~/.config/awesome/rc.lua говорит Луа осмотреть файл с именем xrandr.lua в ~/.config/awesome/ пока вы храните его в ~/.config/awesome/rc/, Вот почему он не может ничего найти. Это должно делать свое дело:

require("rc.xrandr")

Вы можете вдохновить себя другими людьми конфигурации: rc.lua

В основном, как сказал envolyse, require(что-то) будет смотреть на rootdir/something.lua, а require(somedir.something) будет искать в rootdir/somedir/ что-то.

Вам все равно нужно будет делать дополнительные вызовы из чего-то.rc (для включения библиотек):

myrc.lua:

local naughty = require("naughty");
naughty.somecall();

начиная с lua 5.2, вам нужно будет использовать локальную переменную для хранения указателей на включенные библиотеки, в старых версиях lua plain 'require("naughty");' было бы достаточно.

Счастливого взлома.

Другие вопросы по тегам