https://wiki.archlinux.org/api.php?action=feedcontributions&user=Xerxes2&feedformat=atomArchWiki - User contributions [en]2024-03-29T11:09:46ZUser contributionsMediaWiki 1.41.0https://wiki.archlinux.org/index.php?title=Ion3&diff=2036Ion32005-08-24T09:57:18Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
[[Category:Window Manager]]<br />
<br />
= Introduction =<br />
[http://iki.fi/tuomov/ion/ Ion] is a tiling window manager with tabbed frames. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
= Installation =<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following command(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion as described below.<br />
<br />
= Configuration =<br />
<br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
== cfg_ion.lua ==<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey). The '''<code>dopath</code>''' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
== cfg_bindings.lua ==<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
== cfg_menus.lua ==<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
== cfg_ionws.lua ==<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
== look.lua ==<br />
In this file you set your theme. Your default theme is set on the bottom:<br />
dopath("look_xerxes") <br />
The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Xinit&diff=2138Xinit2005-08-10T15:46:19Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
<br />
=Summary=<br />
How to use '''startx''' command, to get x-server and your DE of choice running.<br />
=Start file, '''~/.xinitrc'''=<br />
You start your DE from the file '''/home/yourname/.xinitrc'''<br />
Uncomment your favourite, eg Gnome<br />
<br />
<pre>#!/bin/sh<br />
#<br />
# ~~/.xinitrc<br />
#<br />
# Executed by startx (run your window manager from here)<br />
#<br />
# exec ion<br />
# exec wmaker<br />
# exec startkde<br />
# exec icewm<br />
# exec blackbox<br />
exec gnome-session<br />
# exec startfluxbox<br />
# exec startxfce4<br />
# exec openbox<br />
</pre><br />
<br />
<br />
Small note: if you have a working .xinitrc, but just want to try other WM/DE you can<br />
run xinit from command line like this<br />
<br />
<pre>xinit /full/path/to/window-manager</pre><br />
<br />
The full path is '''required'''.<br />
Optionally you can pass options to X server after --<br />
Example:<br />
<br />
<pre>xinit /usr/bin/enlightenment -- -br +bs -dpi 96</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=2010Ion32005-08-10T15:35:20Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
[[Category:Window Manager]]<br />
<br />
= Introduction =<br />
[http://iki.fi/tuomov/ion/ Ion] is a complete desktopenvironment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
= Installation =<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following command(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion as described below.<br />
<br />
= Configuration =<br />
<br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
== cfg_ion.lua ==<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey). The '''<code>dopath</code>''' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
== cfg_bindings.lua ==<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
== cfg_menus.lua ==<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
== cfg_ionws.lua ==<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
== look.lua ==<br />
In this file you set your theme. Your default theme is set on the bottom:<br />
dopath("look_xerxes") <br />
The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1435Package Maintainer guidelines2005-07-30T11:01:35Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
The TUs are governed using the [http://archlinux.org/~simo/TUbylaws.html TUbylaws]<br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
The TUs should also make an effort to check package submissions in UNSUPPORTED for malicious code and good PKGBUILDing standards. In around 80% of cases the PKGBUILDs in the UNSUPPORTED are very simple and can be quickly checked for sanity and malicious code by the TU team. There is functionality in the pipeline that will allow TUs to mark such pkgs as checked but users are still responsible for checking the PKGBUILDs themselves.<br />
<br />
TUs should also check PKGBUILDs for minor mistakes, suggest corrections and improvements. The TU should endeavour to confirm tht all pkgs follow the Arch Packging Guidelines/Standards and in doing so share their skills with other package builders in an effort to raise the standard of package building across the distro.<br />
<br />
TUs are also in an excellent position to document recommended practices<br />
<br />
===The TU and [community], Guidelines for Package Maintenance===<br />
<br />
==== Accessing the Repo ====<br />
<br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
<ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with Apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li> To add a new package:</li><br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
cvs add PKGBUILD<br />
</pre><br />
<li>Make a commit:</li><br />
cvs commit<br />
<li> To upload a binary package:</li><br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
<li> After uploading a package and committing the build files, tag the files with this command:</li><br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<i>'''Note:''' Steps 5-7 can be run with communitypkg in one command as mentioned below in the AURtools tutorial.</i> <br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
You can disown packages by choosing "Disown Packages" in the AUR webinterface.<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, '''<code>~/.tupkg</code>''', instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ADD any build files to the cvs repo<br />
cvs add PKGBUILD<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1416Package Maintainer guidelines2005-07-30T10:59:36Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
The TUs are governed using the [http://archlinux.org/~simo/TUbylaws.html TUbylaws]<br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
The TUs should also make an effort to check package submissions in UNSUPPORTED for malicious code and good PKGBUILDing standards. In around 80% of cases the PKGBUILDs in the UNSUPPORTED are very simple and can be quickly checked for sanity and malicious code by the TU team. There is functionality in the pipeline that will allow TUs to mark such pkgs as checked but users are still responsible for checking the PKGBUILDs themselves.<br />
<br />
TUs should also check PKGBUILDs for minor mistakes, suggest corrections and improvements. The TU should endeavour to confirm tht all pkgs follow the Arch Packging Guidelines/Standards and in doing so share their skills with other package builders in an effort to raise the standard of package building across the distro.<br />
<br />
TUs are also in an excellent position to document recommended practices<br />
<br />
===The TU and [community]===<br />
<br />
<h3>Guidelines for Package Maintenance</h3><br />
<br />
==== Accessing the Repo ====<br />
<br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
<ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with Apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li> To add a new package:</li><br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
cvs add PKGBUILD<br />
</pre><br />
<li>Make a commit:</li><br />
cvs commit<br />
<li> To upload a binary package:</li><br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
<li> After uploading a package and committing the build files, tag the files with this command:</li><br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
'''Note:''' Steps 5-7 can be run with communitypkg in one command as mentioned below in the AURtools tutorial. <br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
You can disown packages by choosing "Disown Packages" in the AUR webinterface.<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, '''<code>~/.tupkg</code>''', instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ADD any build files to the cvs repo<br />
cvs add PKGBUILD<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1402Package Maintainer guidelines2005-07-29T23:00:56Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
The TUs are governed using the [http://archlinux.org/~simo/TUbylaws.html TUbylaws]<br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3>Guidelines for Package Maintenance</h3><br />
<br />
==== Accessing the Repo ====<br />
<br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
<ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with Apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li> To add a new package:</li><br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
cvs add PKGBUILD<br />
</pre><br />
<li>Make a commit:</li><br />
cvs commit<br />
<li> To upload a binary package:</li><br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
<li> After uploading a package and committing the build files, tag the files with this command:</li><br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
'''Note:''' Steps 5-7 can be run with communitypkg in one command as mentioned below in the AURtools tutorial. <br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, '''<code>~/.tupkg</code>''', instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ADD any build files to the cvs repo<br />
cvs add PKGBUILD<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1293Package Maintainer guidelines2005-07-29T22:53:24Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
The TUs are governed using the [http://archlinux.org/~simo/TUbylaws.html TUbylaws]<br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3>Guidelines for Package Maintenance</h3><br />
<br />
==== Accessing the Repo ====<br />
<br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
<ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with Apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li> To add a new package:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit</li><br />
</pre><br />
<li> To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
</li><br />
<li> After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.</li><br />
</ol><br />
<br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, '''<code>~/.tupkg</code>''', instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ADD any build files to the cvs repo<br />
cvs add PKGBUILD<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1292Package Maintainer guidelines2005-07-29T22:52:04Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
The TUs are governed using the [http://archlinux.org/~simo/TUbylaws.html TUbylaws]<br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3>Guidelines for Package Maintenance</h3><br />
<br />
==== Accessing the Repo ====<br />
<br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
<ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with Apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li> To add a new package:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit</li><br />
</pre><br />
<li> To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.</li><br />
</ol><br />
<br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, '''<code>~/.tupkg</code>''', instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ADD any build files to the cvs repo<br />
cvs add PKGBUILD<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=User_talk:Phrakture&diff=1503User talk:Phrakture2005-07-29T22:20:42Z<p>Xerxes2: </p>
<hr />
<div>=== TU Meeting Agenda ===<br />
Saturday, July 30th @ 16:00 GMT<br />
<br />
* Current Agenda<br />
** TU Voting Forum<br />
** Final Dissolution of old TURs<br />
** Other?<br />
<br />
I would like to propose that we add a little more stuff to the TU mission.<br />
Like maintain documents(wiki) and write the newsletter. So that we should not be just packagemonkeys. '''/xerxes2'''<br />
<br />
Hmmm, interesting - sounds like something worth discussing.<br />
'''/var/phrakture'''<br />
<br />
Well, I look forward to disagreeing with that in the meeting :) '''/dibble'''<br />
<br />
You already qualify as a (almost) perfect TU dibble so you don't have to worry that we should give you the boot. :) '''/xerxes2'''</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1291Package Maintainer guidelines2005-07-29T17:24:11Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
The TUs are governed using the [http://archlinux.org/~simo/TUbylaws.html TUbylaws]<br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3>Guidelines for Package Maintenance</h3><br />
<br />
==== Accessing the Repo ====<br />
<br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
<ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, '''<code>~/.tupkg</code>''', instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1286Package Maintainer guidelines2005-07-29T17:20:53Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
The TUs are governed using the [http://archlinux.org/~simo/TUbylaws.html TUbylaws]<br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3>Guidelines for Package Maintenance</h3><br />
<br />
==== Accessing the Repo ====<br />
<br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
<ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, <code>~/.tupkg</code>, instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1285Package Maintainer guidelines2005-07-29T17:19:46Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
The TUs are governed using the TU [http://archlinux.org/~simo/TUbylaws.html bylaws]<br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3>Guidelines for Package Maintenance</h3><br />
<br />
==== Accessing the Repo ====<br />
<br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
<ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, <code>~/.tupkg</code>, instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1284Package Maintainer guidelines2005-07-29T17:17:29Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
The TUs are governed using the TU [http://archlinux.org/~simo/TUbylaws.html bylaws<br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<br />
==== Accessing the Repo ====<br />
<br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
<ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, <code>~/.tupkg</code>, instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1283Package Maintainer guidelines2005-07-29T17:12:25Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
<p> The TUs are governed using the TU bylaws:<br />
http://archlinux.org/~simo/TUbylaws.html<br />
</p><br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<p><br />
</p><br />
<h4 id="accessing">Accessing the Repo</h4><br />
<p><br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
</p><ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com ). It comes with apache.</li><br />
htpasswd -n <userid><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want.<br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well.<br />
<br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. <br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, <code>~/.tupkg</code>, instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1282Package Maintainer guidelines2005-07-29T17:00:04Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
<p> The TUs are governed using the TU bylaws:<br />
http://archlinux.org/~simo/TUbylaws.html<br />
</p><br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<p><br />
</p><br />
<h4 id="accessing">Accessing the Repo</h4><br />
<p><br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
</p><ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com )</li><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<br />
==== Adopting Packages ====<br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want. <br><br><br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption.<br />
<br />
==== Disowning packages ====<br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well. <br><br><br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. </p><br />
<br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, ~/.tupkg , instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called '''communitypkg'''. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1281Package Maintainer guidelines2005-07-29T16:57:24Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
<p> The TUs are governed using the TU bylaws:<br />
http://archlinux.org/~simo/TUbylaws.html<br />
</p><br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<p><br />
</p><br />
<h4 id="accessing">Accessing the Repo</h4><br />
<p><br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
</p><ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com )</li><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<br />
<h4 id="adopting">Adopting Packages</h4><br />
<p><br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want. <br><br><br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption. </p><br />
<br />
<h4 id="disowning">Disowning packages</h4><br />
<p><br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well. <br><br><br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. </p><br />
<br />
<br />
=== AURtools Tutorial ===<br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, ~/.tupkg , instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<pre><br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
</pre><br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
==== communitypkg ====<br />
The second, and perhaps more exciting, new tool, is called communitypkg. Essentially, communitypkg is devtools for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1280Package Maintainer guidelines2005-07-29T16:52:37Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
<p> The TUs are governed using the TU bylaws:<br />
http://archlinux.org/~simo/TUbylaws.html<br />
</p><br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<p><br />
</p><br />
<h4 id="accessing">Accessing the Repo</h4><br />
<p><br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
</p><ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com )</li><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<br />
<h4 id="adopting">Adopting Packages</h4><br />
<p><br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want. <br><br><br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption. </p><br />
<br />
<h4 id="disowning">Disowning packages</h4><br />
<p><br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well. <br><br><br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. </p><br />
<br />
<br />
<h4 id="disowning">AURtools Tutorial</h4><br />
<p><br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, ~/.tupkg , instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
<br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
===<code>communitypkg</code>===<br />
<br />
The second, and perhaps more exciting, new tool, is called <code>communitypkg</code>. Essentially, communitypkg is <code>devtools</code> for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1279Package Maintainer guidelines2005-07-29T16:49:05Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR.<br />
<br />
<p> The TUs are governed using the TU bylaws:<br />
http://archlinux.org/~simo/TUbylaws.html<br />
</p><br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<p><br />
</p><br />
<h4 id="accessing">Accessing the Repo</h4><br />
<p><br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
</p><ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com )</li><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
</ol><br />
<br />
<h4 id="adopting">Adopting Packages</h4><br />
<p><br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want. <br><br><br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption. </p><br />
<br />
<h4 id="disowning">Disowning packages</h4><br />
<p><br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well. <br><br><br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. </p><br />
<br />
<h4 id="disowning">TU getting started Tutorial</h4><br />
<p><br />
<ul><li>First, you should have the aurtools and cvs packages installed. aurtools<br />
is in [community], and contains everything you need to get going in<br />
order to submit and maintain your packages. cvs is in [current] and it's<br />
probably already on your system.</li><br />
<br />
<li>Next, you should check out the AUR CVS. If you are not already familiar<br />
with CVS, it might be a wise investment to read up on it since the AUR and many other<br />
projects use it.<br><br />
Commands for checking out the CVS follow:<br />
<br />
<pre>export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li>You should now have a new dir in your current working dir, called<br />
"community". Within it, you will find the CVS for TUs' AUR packages.<br />
They are grouped into categories, the same as those used on the web<br />
interface.</li><br />
<br />
<h5 id="disowning">Add a pkg</h5><br />
<br />
In order to ADD a package, you must copy all needed build files to the<br />
appropriate sub directory. Then, issue a "cvs add" on the new directory,<br />
as well as any needed build files within it (PKGBUILD, patches..etc). If<br />
you are in doubt..use existing ones as a model. Please include ONLY<br />
BUILD FILES, there is no need to include filelists, nor pkg/ nor src/<br />
directories.<br />
<br />
Now, you must check in your changes (in this case additions), by issuing<br />
a "cvs commit". In addition, you must upload the binary package file<br />
using tupkg. The command should look something like this: "tupkg --user<br />
<userid> --password <password> <packagefile.pkg.tar.gz>". Following a<br />
successful binary upload, you should issue a "cvs tag -cFR CURRENT" on<br />
the builddir of the new package. The AUR daemon will not pick up<br />
anything that is not tagged CURRENT ! The daemon runs on a cronjob,<br />
every 10 minutes. Wait for the package to appear as an orphan on the web<br />
interface, and adopt it. You have now added your package.<br />
<br />
In order to CHANGE a package, follow similar steps to those above,<br />
except just modify your files, issue the "cvs commit", upload the<br />
binary, and tag them CURRENT. It should get updated on the next sweep of<br />
the daemon.<br />
<br />
You can avoid much of this hassle by using communitypkg (also included<br />
in aurtools). It is just like extrapkg, and devtools. In fact, it is<br />
entirely based on them. When we released communitypkg, I wrote a little<br />
doc on its usage, so I'm just going to point you to the archive of the<br />
mail, rather than explaining it again.<br />
http://www.archlinux.org/pipermail/tur-users/2005-May/000991.html <br />
There you go.<br />
<br />
As usual, if you run into trouble or have any further questions, don't<br />
be afraid to contact me about it, I can probably help.<br />
<br />
Happy Packaging!<br />
<br />
-Simo</p><br />
<br />
<h4 id="disowning">AURtools Tutorial</h4><br />
<p><br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, ~/.tupkg , instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
<br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
===<code>communitypkg</code>===<br />
<br />
The second, and perhaps more exciting, new tool, is called <code>communitypkg</code>. Essentially, communitypkg is <code>devtools</code> for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1278Package Maintainer guidelines2005-07-29T16:42:56Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR. </p><br />
<br />
<p> The TUs are governed using the TU bylaws:<br />
http://archlinux.org/~simo/TUbylaws.html<br />
</p><br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<p><br />
</p><br />
<h4 id="accessing">Accessing the Repo</h4><br />
<p><br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
</p><ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com )</li><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
* To add a PKGBUILD and other build files:<br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
* To upload a binary package:<br />
tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;<br />
<br />
After uploading a package and committing the build files, tag the files with this command:<br />
cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;<br />
Package changes should be available within 10 minutes. Verify everything was uploaded properly, then select the newly added or updated package in the web interface and set yourself as the maintainer.<br />
<br />
<br />
<h4 id="adopting">Adopting Packages</h4><br />
<p><br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want. <br><br><br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption. </p><br />
<br />
<h4 id="disowning">Disowning packages</h4><br />
<p><br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well. <br><br><br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. </p><br />
<br />
<h4 id="disowning">TU getting started Tutorial</h4><br />
<p><br />
<ul><li>First, you should have the aurtools and cvs packages installed. aurtools<br />
is in [community], and contains everything you need to get going in<br />
order to submit and maintain your packages. cvs is in [current] and it's<br />
probably already on your system.</li><br />
<br />
<li>Next, you should check out the AUR CVS. If you are not already familiar<br />
with CVS, it might be a wise investment to read up on it since the AUR and many other<br />
projects use it.<br><br />
Commands for checking out the CVS follow:<br />
<br />
<pre>export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li>You should now have a new dir in your current working dir, called<br />
"community". Within it, you will find the CVS for TUs' AUR packages.<br />
They are grouped into categories, the same as those used on the web<br />
interface.</li><br />
<br />
<h5 id="disowning">Add a pkg</h5><br />
<br />
In order to ADD a package, you must copy all needed build files to the<br />
appropriate sub directory. Then, issue a "cvs add" on the new directory,<br />
as well as any needed build files within it (PKGBUILD, patches..etc). If<br />
you are in doubt..use existing ones as a model. Please include ONLY<br />
BUILD FILES, there is no need to include filelists, nor pkg/ nor src/<br />
directories.<br />
<br />
Now, you must check in your changes (in this case additions), by issuing<br />
a "cvs commit". In addition, you must upload the binary package file<br />
using tupkg. The command should look something like this: "tupkg --user<br />
<userid> --password <password> <packagefile.pkg.tar.gz>". Following a<br />
successful binary upload, you should issue a "cvs tag -cFR CURRENT" on<br />
the builddir of the new package. The AUR daemon will not pick up<br />
anything that is not tagged CURRENT ! The daemon runs on a cronjob,<br />
every 10 minutes. Wait for the package to appear as an orphan on the web<br />
interface, and adopt it. You have now added your package.<br />
<br />
In order to CHANGE a package, follow similar steps to those above,<br />
except just modify your files, issue the "cvs commit", upload the<br />
binary, and tag them CURRENT. It should get updated on the next sweep of<br />
the daemon.<br />
<br />
You can avoid much of this hassle by using communitypkg (also included<br />
in aurtools). It is just like extrapkg, and devtools. In fact, it is<br />
entirely based on them. When we released communitypkg, I wrote a little<br />
doc on its usage, so I'm just going to point you to the archive of the<br />
mail, rather than explaining it again.<br />
http://www.archlinux.org/pipermail/tur-users/2005-May/000991.html <br />
There you go.<br />
<br />
As usual, if you run into trouble or have any further questions, don't<br />
be afraid to contact me about it, I can probably help.<br />
<br />
Happy Packaging!<br />
<br />
-Simo</p><br />
<br />
<h4 id="disowning">AURtools Tutorial</h4><br />
<p><br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, ~/.tupkg , instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
<br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
===<code>communitypkg</code>===<br />
<br />
The second, and perhaps more exciting, new tool, is called <code>communitypkg</code>. Essentially, communitypkg is <code>devtools</code> for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1277Package Maintainer guidelines2005-07-29T09:59:05Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR. </p><br />
<br />
<p> The TUs are governed using the TU bylaws:<br />
http://archlinux.org/~simo/TUbylaws.html<br />
</p><br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<p><br />
</p><br />
<h4 id="accessing">Accessing the Repo</h4><br />
<p><br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
</p><ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com )</li><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<li>To add a PKGBUILD and other build files:</li><br><br />
<pre><br />
cvs add &lt;directory&gt;<br />
cd &lt;directory&gt;<br />
<br />
cvs add PKGBUILD<br />
.<br />
.<br />
cvs commit<br />
</pre><br />
<li>To upload a binary package:<br />
<kbd>tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;</kbd></li><br />
<br />
<li>After uploading a package and committing the build files, tag the files with this command:<br />
<kbd>cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;</kbd></li><br />
<li>Package<br />
changes should be available within 10 minutes. Verify everything was<br />
uploaded properly, then select the newly added or updated package in<br />
the web interface and set yourself as the maintainer.</li><br />
</ol><br />
<br />
<h4 id="adopting">Adopting Packages</h4><br />
<p><br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want. <br><br><br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption. </p><br />
<br />
<h4 id="disowning">Disowning packages</h4><br />
<p><br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well. <br><br><br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. </p><br />
<br />
<h4 id="disowning">TU getting started Tutorial</h4><br />
<p><br />
<ul><li>First, you should have the aurtools and cvs packages installed. aurtools<br />
is in [community], and contains everything you need to get going in<br />
order to submit and maintain your packages. cvs is in [current] and it's<br />
probably already on your system.</li><br />
<br />
<li>Next, you should check out the AUR CVS. If you are not already familiar<br />
with CVS, it might be a wise investment to read up on it since the AUR and many other<br />
projects use it.<br><br />
Commands for checking out the CVS follow:<br />
<br />
<pre>export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li>You should now have a new dir in your current working dir, called<br />
"community". Within it, you will find the CVS for TUs' AUR packages.<br />
They are grouped into categories, the same as those used on the web<br />
interface.</li><br />
<br />
<h5 id="disowning">Add a pkg</h5><br />
<br />
In order to ADD a package, you must copy all needed build files to the<br />
appropriate sub directory. Then, issue a "cvs add" on the new directory,<br />
as well as any needed build files within it (PKGBUILD, patches..etc). If<br />
you are in doubt..use existing ones as a model. Please include ONLY<br />
BUILD FILES, there is no need to include filelists, nor pkg/ nor src/<br />
directories.<br />
<br />
Now, you must check in your changes (in this case additions), by issuing<br />
a "cvs commit". In addition, you must upload the binary package file<br />
using tupkg. The command should look something like this: "tupkg --user<br />
<userid> --password <password> <packagefile.pkg.tar.gz>". Following a<br />
successful binary upload, you should issue a "cvs tag -cFR CURRENT" on<br />
the builddir of the new package. The AUR daemon will not pick up<br />
anything that is not tagged CURRENT ! The daemon runs on a cronjob,<br />
every 10 minutes. Wait for the package to appear as an orphan on the web<br />
interface, and adopt it. You have now added your package.<br />
<br />
In order to CHANGE a package, follow similar steps to those above,<br />
except just modify your files, issue the "cvs commit", upload the<br />
binary, and tag them CURRENT. It should get updated on the next sweep of<br />
the daemon.<br />
<br />
You can avoid much of this hassle by using communitypkg (also included<br />
in aurtools). It is just like extrapkg, and devtools. In fact, it is<br />
entirely based on them. When we released communitypkg, I wrote a little<br />
doc on its usage, so I'm just going to point you to the archive of the<br />
mail, rather than explaining it again.<br />
http://www.archlinux.org/pipermail/tur-users/2005-May/000991.html <br />
There you go.<br />
<br />
As usual, if you run into trouble or have any further questions, don't<br />
be afraid to contact me about it, I can probably help.<br />
<br />
Happy Packaging!<br />
<br />
-Simo</p><br />
<br />
<h4 id="disowning">AURtools Tutorial</h4><br />
<p><br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, ~/.tupkg , instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
<br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
===<code>communitypkg</code>===<br />
<br />
The second, and perhaps more exciting, new tool, is called <code>communitypkg</code>. Essentially, communitypkg is <code>devtools</code> for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1252Package Maintainer guidelines2005-07-29T09:58:17Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR. </p><br />
<br />
<p> The TUs are governed using the TU bylaws:<br />
http://archlinux.org/~simo/TUbylaws.html<br />
</p><br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<p><br />
</p><br />
<h4 id="accessing">Accessing the Repo</h4><br />
<p><br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
</p><ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com )</li><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<li>To add a PKGBUILD and other build files:</li><br><br />
<pre><br />
cvs add &lt;directory&gt;<br><br />
cd &lt;directory&gt;<br><br />
<br />
cvs add PKGBUILD<br><br />
.<br><br />
.<br><br />
cvs commit<br />
</pre><br />
<li>To upload a binary package:<br />
<kbd>tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;</kbd></li><br />
<br />
<li>After uploading a package and committing the build files, tag the files with this command:<br />
<kbd>cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;</kbd></li><br />
<li>Package<br />
changes should be available within 10 minutes. Verify everything was<br />
uploaded properly, then select the newly added or updated package in<br />
the web interface and set yourself as the maintainer.</li><br />
</ol><br />
<br />
<h4 id="adopting">Adopting Packages</h4><br />
<p><br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want. <br><br><br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption. </p><br />
<br />
<h4 id="disowning">Disowning packages</h4><br />
<p><br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well. <br><br><br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. </p><br />
<br />
<h4 id="disowning">TU getting started Tutorial</h4><br />
<p><br />
<ul><li>First, you should have the aurtools and cvs packages installed. aurtools<br />
is in [community], and contains everything you need to get going in<br />
order to submit and maintain your packages. cvs is in [current] and it's<br />
probably already on your system.</li><br />
<br />
<li>Next, you should check out the AUR CVS. If you are not already familiar<br />
with CVS, it might be a wise investment to read up on it since the AUR and many other<br />
projects use it.<br><br />
Commands for checking out the CVS follow:<br />
<br />
<pre>export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li>You should now have a new dir in your current working dir, called<br />
"community". Within it, you will find the CVS for TUs' AUR packages.<br />
They are grouped into categories, the same as those used on the web<br />
interface.</li><br />
<br />
<h5 id="disowning">Add a pkg</h5><br />
<br />
In order to ADD a package, you must copy all needed build files to the<br />
appropriate sub directory. Then, issue a "cvs add" on the new directory,<br />
as well as any needed build files within it (PKGBUILD, patches..etc). If<br />
you are in doubt..use existing ones as a model. Please include ONLY<br />
BUILD FILES, there is no need to include filelists, nor pkg/ nor src/<br />
directories.<br />
<br />
Now, you must check in your changes (in this case additions), by issuing<br />
a "cvs commit". In addition, you must upload the binary package file<br />
using tupkg. The command should look something like this: "tupkg --user<br />
<userid> --password <password> <packagefile.pkg.tar.gz>". Following a<br />
successful binary upload, you should issue a "cvs tag -cFR CURRENT" on<br />
the builddir of the new package. The AUR daemon will not pick up<br />
anything that is not tagged CURRENT ! The daemon runs on a cronjob,<br />
every 10 minutes. Wait for the package to appear as an orphan on the web<br />
interface, and adopt it. You have now added your package.<br />
<br />
In order to CHANGE a package, follow similar steps to those above,<br />
except just modify your files, issue the "cvs commit", upload the<br />
binary, and tag them CURRENT. It should get updated on the next sweep of<br />
the daemon.<br />
<br />
You can avoid much of this hassle by using communitypkg (also included<br />
in aurtools). It is just like extrapkg, and devtools. In fact, it is<br />
entirely based on them. When we released communitypkg, I wrote a little<br />
doc on its usage, so I'm just going to point you to the archive of the<br />
mail, rather than explaining it again.<br />
http://www.archlinux.org/pipermail/tur-users/2005-May/000991.html <br />
There you go.<br />
<br />
As usual, if you run into trouble or have any further questions, don't<br />
be afraid to contact me about it, I can probably help.<br />
<br />
Happy Packaging!<br />
<br />
-Simo</p><br />
<br />
<h4 id="disowning">AURtools Tutorial</h4><br />
<p><br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, ~/.tupkg , instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
<br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
===<code>communitypkg</code>===<br />
<br />
The second, and perhaps more exciting, new tool, is called <code>communitypkg</code>. Essentially, communitypkg is <code>devtools</code> for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=Package_Maintainer_guidelines&diff=1251Package Maintainer guidelines2005-07-29T09:56:22Z<p>Xerxes2: </p>
<hr />
<div>[[Category:PackageManagement]]<br />
==The TU==<br />
The TU -or Trusted User- is a member of the community charged with<br />
keeping the AUR in working order. He/she maintains popular packages, and<br />
votes in administrative matters. A TU is elected from active community<br />
members by current TUs in a democratic process. TUs are the only<br />
members who have a final say in the direction of the AUR. </p><br />
<br />
<p> The TUs are governed using the TU bylaws:<br />
http://archlinux.org/~simo/TUbylaws.html<br />
</p><br />
<br />
===The TU and UNSUPPORTED===<br />
<br />
===The TU and [community]===<br />
<br />
<h3 id="tuguidelines">Guidelines for Package Maintenance</h3><br />
<p><br />
</p><br />
<h4 id="accessing">Accessing the Repo</h4><br />
<p><br />
Follow these instructions for uploading/modifying packages once you have become a TU:<br />
</p><ol><br />
<br />
<li>Install the "aurtools" package.</li><br />
<li>You will need to email your the output of "htpasswd -n" to whoever is in charge of the AUR CVS repo ( Paul Mattal = paul@mattal.com )</li><br />
<li>Run the following commands to checkout the AUR CVS:<br><br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<li>To add a PKGBUILD and other build files:</li><br><br />
<pre><br />
cvs add &lt;directory&gt;<br><br />
cd &lt;directory&gt;<br><br />
<br />
cvs add PKGBUILD<br><br />
.<br><br />
.<br><br />
cvs commit<br />
</pre><br />
<li>To upload a binary package:<br />
<kbd>tupkg --user &lt;userid&gt; --password &lt;password&gt; &lt;packagefile.pkg.tar.gz&gt;</kbd></li><br />
<br />
<li>After uploading a package and committing the build files, tag the files with this command:<br />
<kbd>cvs tag -cFR CURRENT &lt;newpackagebuilddir&gt;</kbd></li><br />
<li>Package<br />
changes should be available within 10 minutes. Verify everything was<br />
uploaded properly, then select the newly added or updated package in<br />
the web interface and set yourself as the maintainer.</li><br />
</ol><br />
<br />
<h4 id="adopting">Adopting Packages</h4><br />
<p><br />
A TU may adopt any package at any time. But because the TU's time is<br />
limited, he should try to only adopt popular packages. The voting<br />
mechanism in the AUR allows a TU to quickly gage which packages users<br />
want. <br><br><br />
<br />
If a package receives 25 votes, it may be adopted by a TU. A maintainer<br />
should adopt it via the web interface. That maintainer is then<br />
responsible for bug fixes and new version updates. Packages must be<br />
properly cleaned and fixed after adoption. </p><br />
<br />
<h4 id="disowning">Disowning packages</h4><br />
<p><br />
If a TU can't or doesn't want to maintain a package any longer, a<br />
notice should be posted to the AUR Mailing List, so another TU can<br />
maintain it. A package can still be disowned even if no other TU wants<br />
to maintain it, but the TUs should try not to drop many packages (they<br />
shouldn't take on more than they have time for). If a package has<br />
become obsolete or isn't used any longer, it can be removed completely<br />
as well. <br><br><br />
If a package has been removed completely, it can be uploaded once again<br />
(fresh) to UNSUPPORTED, where a regular user can maintain the package<br />
instead of the TU. </p><br />
<br />
<h4 id="disowning">TU getting started Tutorial</h4><br />
<p><br />
<ul><li>First, you should have the aurtools and cvs packages installed. aurtools<br />
is in [community], and contains everything you need to get going in<br />
order to submit and maintain your packages. cvs is in [current] and it's<br />
probably already on your system.</li><br />
<br />
<li>Next, you should check out the AUR CVS. If you are not already familiar<br />
with CVS, it might be a wise investment to read up on it since the AUR and many other<br />
projects use it.<br><br />
Commands for checking out the CVS follow:<br />
<br />
<pre>export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre></li><br />
<br />
<li>You should now have a new dir in your current working dir, called<br />
"community". Within it, you will find the CVS for TUs' AUR packages.<br />
They are grouped into categories, the same as those used on the web<br />
interface.</li><br />
<br />
<h5 id="disowning">Add a pkg</h5><br />
<br />
In order to ADD a package, you must copy all needed build files to the<br />
appropriate sub directory. Then, issue a "cvs add" on the new directory,<br />
as well as any needed build files within it (PKGBUILD, patches..etc). If<br />
you are in doubt..use existing ones as a model. Please include ONLY<br />
BUILD FILES, there is no need to include filelists, nor pkg/ nor src/<br />
directories.<br />
<br />
Now, you must check in your changes (in this case additions), by issuing<br />
a "cvs commit". In addition, you must upload the binary package file<br />
using tupkg. The command should look something like this: "tupkg --user<br />
<userid> --password <password> <packagefile.pkg.tar.gz>". Following a<br />
successful binary upload, you should issue a "cvs tag -cFR CURRENT" on<br />
the builddir of the new package. The AUR daemon will not pick up<br />
anything that is not tagged CURRENT ! The daemon runs on a cronjob,<br />
every 10 minutes. Wait for the package to appear as an orphan on the web<br />
interface, and adopt it. You have now added your package.<br />
<br />
In order to CHANGE a package, follow similar steps to those above,<br />
except just modify your files, issue the "cvs commit", upload the<br />
binary, and tag them CURRENT. It should get updated on the next sweep of<br />
the daemon.<br />
<br />
You can avoid much of this hassle by using communitypkg (also included<br />
in aurtools). It is just like extrapkg, and devtools. In fact, it is<br />
entirely based on them. When we released communitypkg, I wrote a little<br />
doc on its usage, so I'm just going to point you to the archive of the<br />
mail, rather than explaining it again.<br />
http://www.archlinux.org/pipermail/tur-users/2005-May/000991.html <br />
There you go.<br />
<br />
As usual, if you run into trouble or have any further questions, don't<br />
be afraid to contact me about it, I can probably help.<br />
<br />
Happy Packaging!<br />
<br />
-Simo</p><br />
<br />
<h4 id="disowning">AURtools Tutorial</h4><br />
<p><br />
I have updated the aurtools package in community, despite the fact that<br />
it is Paul's. Hope I didn't hurt anyone's feelings.<br />
<br />
The never version numbering reflects the version of the AUR that that<br />
tupkg was released as part of.<br />
<br />
This message is intended to inform the TUs of some major changes that<br />
have been made to this package. Although you may continue to do things<br />
as you have been doing (it's backwards compatible), you will find these<br />
a handy shortcut.<br />
<br />
The only real change to tupkg is that it now is able to use a config<br />
file, ~/.tupkg , instead of just taking command line options (though it<br />
still takes them). Any command line options will OVERRIDE settings in<br />
the config file. The config file should take the following format:<br />
<br />
---BEGIN CONFIG FILE SNIP---<br />
[tupkg]<br />
username = YOURUSERNAME<br />
password = YOURPASSWORD<br />
host = THEHOST<br />
port = THEPORT<br />
---END CONFIG FILE SNIP---<br />
<br />
Since the password needs to be plain-text, I suggest setting permissions<br />
on this file 600. The host and port options are OPTIONAL, and will<br />
default to aur.archlinux.org and 1034, respectively, so these two<br />
options don't technically even need to appear in the file. Username and<br />
password are NOT quoted.<br />
If tupkg notices that this file exists, it will use options from it,<br />
saving you some typing on the command line.<br />
<br />
===<code>communitypkg</code>===<br />
<br />
The second, and perhaps more exciting, new tool, is called <code>communitypkg</code>. Essentially, communitypkg is <code>devtools</code> for the [community] repo, and wraps the work of a cvs check in, cvs tagging, and binary package uploading, all into one tool. In case there's confusion, I've included some sample sessions using communitypkg below :<br />
<br />
====Sample new package session====<br />
<pre><br />
export CVSROOT=":pserver:<userid>@cvs.archlinux.org:/home/cvs-community"<br />
cvs login<br />
cvs co community</pre><br />
* change to a dir in the CVS tree we just checked out<br />
cd community/system<br />
* copy over a build dir from wherever<br />
mv ~/stuff/aurtools<br />
* ADD the DIRECTORY (non recursive) to the cvs repo<br />
cvs add aurtools<br />
cd aurtools<br />
* ANY PKGBUILD EDITING AND THAT SHOULD OCCUR NOW, BEFORE A CHECKIN<br />
cvs add PKGBUILD<br />
ADD any build files to the cvs repo<br />
* The package MUST be built OR copied over in order to use communitypkg<br />
makepkg<br />
* MAKE SURE EVERYTHING WENT WELL BEFORE YOU COMMIT<br />
* then run<br />
communitypkg<br />
The <code>communitypkg</code> command, executed in the build dir, will:<br />
# Upload the binary file using tupkg<br />
# Do a cvs commit, with a message of "upgpkg: $pkgname-$pkgver"<br />
# Do a cvs tag of it all to CURRENT<br />
<br />
The package should now be uploaded and inserted, that's it!<br />
<br />
Though communitypkg doesn't look like it simplifies anything in adding a<br />
package, it helps a bunch when upgrading...<br />
<br />
====Sample upgrade session====<br />
* Change to the dir in the CVS repo (you should've checked it out)<br />
cd community/system/aurtools<br />
* Now do any PKGBUILD editing you may need to do then<br />
makepkg<br />
as usual. The package must be either built in or copied to that dir<br />
* Then<br />
communitypkg<br />
and it does its thing<br />
<br />
Voila! Your package is updated.<br />
<br />
If you run into any trouble or have any questions, just drop me an<br />
email. Otherwise, happy packaging!<br />
And if for whatever reason it's not working, please remember that you<br />
may continue to do things the way you were doing them before, these<br />
changes are just shortcuts.<br />
<br />
-Simo</div>Xerxes2https://wiki.archlinux.org/index.php?title=User_talk:Phrakture&diff=981User talk:Phrakture2005-07-25T23:46:51Z<p>Xerxes2: </p>
<hr />
<div>=== TU Meeting Agenda ===<br />
Saturday, July 30th @ 16:00 GMT<br />
<br />
* Current Agenda<br />
** TU Voting Forum<br />
** Final Dissolution of old TURs<br />
** Other?<br />
<br />
I would like to propose that we add a little more stuff to the TU mission.<br />
Like maintain documents(wiki) and write the newsletter. So that we should not be just packagemonkeys. '''/xerxes2'''</div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=1261Ion32005-07-25T14:25:39Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
==== Introduction ====<br />
[http://iki.fi/tuomov/ion/ Ion] is a complete desktopenvironment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following command(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey). The '''<code>dopath</code>''' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your theme. Your default theme is set on the bottom:<br />
dopath("look_xerxes") <br />
The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=901Ion32005-07-25T14:24:30Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
==== Introduction ====<br />
[http://iki.fi/tuomov/ion/ Ion] is a complete desktopenvironment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey). The '''<code>dopath</code>''' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your theme. Your default theme is set on the bottom:<br />
dopath("look_xerxes") <br />
The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=900Ion32005-07-25T14:21:40Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
==== Introduction ====<br />
[http://iki.fi/tuomov/ion/ Ion] is a complete desktopenvironment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey). The '''<code>dopath</code>''' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your theme. Your default theme is set on the bottom:<br />
dopath("look_xerxes") <br />
The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=899Ion32005-07-25T10:21:49Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
==== Introduction ====<br />
Ion is a complete desktopenvironment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey). The '''<code>dopath</code>''' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your theme. Your default theme is set on the bottom:<br />
dopath("look_xerxes") <br />
The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=891Ion32005-07-25T10:16:08Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
==== Introduction ====<br />
Ion is a complete desktopenvironment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).The 'dopath' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your theme. Your default theme is set on the bottom:<br />
dopath("look_xerxes") <br />
The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=890Ion32005-07-25T10:14:53Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
==== Introduction ====<br />
Ion is a complete desktopenvironment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).The 'dopath' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your theme. Your default theme is set on the bottom:<br />
dopath("look_xerxes") <br />
The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name to your own.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=889Ion32005-07-25T10:09:38Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Desktop]]<br />
==== Introduction ====<br />
Ion is a complete desktopenvironment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).The 'dopath' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your themes. Your default theme is set on the bottom with the 'dopath' command. The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name to your own.<br />
<pre><br />
--<br />
-- Look_xerxes for Ion's default drawing engine. <br />
-- Based on look-cleansteel.<br />
-- <br />
<br />
if not gr.select_engine("de") then<br />
return<br />
end<br />
<br />
-- Clear existing styles from memory.<br />
de.reset()<br />
<br />
-- Base style<br />
de.defstyle("*", {<br />
-- Gray background<br />
highlight_colour = "#eeeeee",<br />
shadow_colour = "#eeeeee",<br />
background_colour = "#aaaaaa",<br />
foreground_colour = "#000000",<br />
<br />
shadow_pixels = 1,<br />
highlight_pixels = 1,<br />
padding_pixels = 1,<br />
spacing = 0,<br />
border_style = "elevated",<br />
<br />
font = "-*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*",<br />
text_align = "center",<br />
})<br />
<br />
<br />
de.defstyle("frame", {<br />
based_on = "*",<br />
padding_colour = "#aaaaaa",<br />
background_colour = "#000000",<br />
transparent_background = false,<br />
})<br />
<br />
<br />
de.defstyle("frame-tiled", {<br />
based_on = "frame",<br />
shadow_pixels = 0,<br />
highlight_pixels = 0,<br />
padding_pixels = 0,<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab", {<br />
based_on = "*",<br />
font = "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*",<br />
<br />
de.substyle("active-selected", {<br />
-- Violet tab<br />
highlight_colour = "#aaaacc",<br />
shadow_colour = "#aaaacc",<br />
background_colour = "#666699",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
<br />
de.substyle("inactive-selected", {<br />
-- Greyish violet tab<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame", {<br />
based_on = "tab",<br />
de.substyle("*-*-*-*-activity", {<br />
shadow_colour = "#e0c0c0",<br />
highlight_colour = "#e0c0c0",<br />
background_colour = "#990000",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame-tiled", {<br />
based_on = "tab-frame",<br />
spacing = 1,<br />
bar_inside_frame = true,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry", {<br />
based_on = "tab",<br />
text_align = "left",<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry-big", {<br />
based_on = "tab-menuentry",<br />
font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",<br />
padding_pixels = 7,<br />
})<br />
<br />
<br />
de.defstyle("input", {<br />
based_on = "*",<br />
text_align = "left",<br />
spacing = 1,<br />
-- Greyish violet background<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
<br />
de.substyle("*-selection", {<br />
background_colour = "#777799",<br />
foreground_colour = "#000000",<br />
}),<br />
<br />
de.substyle("*-cursor", {<br />
background_colour = "#000000",<br />
foreground_colour = "#9999aa",<br />
}),<br />
})<br />
<br />
dopath("look_xerxes")<br />
<br />
-- Refresh objects' brushes.<br />
gr.refresh()<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=888Ion32005-07-25T10:08:32Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktopenvironment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).The 'dopath' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your themes. Your default theme is set on the bottom with the 'dopath' command. The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name to your own.<br />
<pre><br />
--<br />
-- Look_xerxes for Ion's default drawing engine. <br />
-- Based on look-cleansteel.<br />
-- <br />
<br />
if not gr.select_engine("de") then<br />
return<br />
end<br />
<br />
-- Clear existing styles from memory.<br />
de.reset()<br />
<br />
-- Base style<br />
de.defstyle("*", {<br />
-- Gray background<br />
highlight_colour = "#eeeeee",<br />
shadow_colour = "#eeeeee",<br />
background_colour = "#aaaaaa",<br />
foreground_colour = "#000000",<br />
<br />
shadow_pixels = 1,<br />
highlight_pixels = 1,<br />
padding_pixels = 1,<br />
spacing = 0,<br />
border_style = "elevated",<br />
<br />
font = "-*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*",<br />
text_align = "center",<br />
})<br />
<br />
<br />
de.defstyle("frame", {<br />
based_on = "*",<br />
padding_colour = "#aaaaaa",<br />
background_colour = "#000000",<br />
transparent_background = false,<br />
})<br />
<br />
<br />
de.defstyle("frame-tiled", {<br />
based_on = "frame",<br />
shadow_pixels = 0,<br />
highlight_pixels = 0,<br />
padding_pixels = 0,<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab", {<br />
based_on = "*",<br />
font = "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*",<br />
<br />
de.substyle("active-selected", {<br />
-- Violet tab<br />
highlight_colour = "#aaaacc",<br />
shadow_colour = "#aaaacc",<br />
background_colour = "#666699",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
<br />
de.substyle("inactive-selected", {<br />
-- Greyish violet tab<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame", {<br />
based_on = "tab",<br />
de.substyle("*-*-*-*-activity", {<br />
shadow_colour = "#e0c0c0",<br />
highlight_colour = "#e0c0c0",<br />
background_colour = "#990000",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame-tiled", {<br />
based_on = "tab-frame",<br />
spacing = 1,<br />
bar_inside_frame = true,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry", {<br />
based_on = "tab",<br />
text_align = "left",<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry-big", {<br />
based_on = "tab-menuentry",<br />
font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",<br />
padding_pixels = 7,<br />
})<br />
<br />
<br />
de.defstyle("input", {<br />
based_on = "*",<br />
text_align = "left",<br />
spacing = 1,<br />
-- Greyish violet background<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
<br />
de.substyle("*-selection", {<br />
background_colour = "#777799",<br />
foreground_colour = "#000000",<br />
}),<br />
<br />
de.substyle("*-cursor", {<br />
background_colour = "#000000",<br />
foreground_colour = "#9999aa",<br />
}),<br />
})<br />
<br />
dopath("look_xerxes")<br />
<br />
-- Refresh objects' brushes.<br />
gr.refresh()<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=887Ion32005-07-25T10:06:30Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktop environment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).The 'dopath' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your themes. Your default theme is set on the bottom with the 'dopath' command. The themes are called '''<code>look_<name>.lua</code>''' and you can make your own by switching the name to your own.<br />
<pre><br />
--<br />
-- Look_xerxes for Ion's default drawing engine. <br />
-- Based on look-cleansteel.<br />
-- <br />
<br />
if not gr.select_engine("de") then<br />
return<br />
end<br />
<br />
-- Clear existing styles from memory.<br />
de.reset()<br />
<br />
-- Base style<br />
de.defstyle("*", {<br />
-- Gray background<br />
highlight_colour = "#eeeeee",<br />
shadow_colour = "#eeeeee",<br />
background_colour = "#aaaaaa",<br />
foreground_colour = "#000000",<br />
<br />
shadow_pixels = 1,<br />
highlight_pixels = 1,<br />
padding_pixels = 1,<br />
spacing = 0,<br />
border_style = "elevated",<br />
<br />
font = "-*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*",<br />
text_align = "center",<br />
})<br />
<br />
<br />
de.defstyle("frame", {<br />
based_on = "*",<br />
padding_colour = "#aaaaaa",<br />
background_colour = "#000000",<br />
transparent_background = false,<br />
})<br />
<br />
<br />
de.defstyle("frame-tiled", {<br />
based_on = "frame",<br />
shadow_pixels = 0,<br />
highlight_pixels = 0,<br />
padding_pixels = 0,<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab", {<br />
based_on = "*",<br />
font = "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*",<br />
<br />
de.substyle("active-selected", {<br />
-- Violet tab<br />
highlight_colour = "#aaaacc",<br />
shadow_colour = "#aaaacc",<br />
background_colour = "#666699",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
<br />
de.substyle("inactive-selected", {<br />
-- Greyish violet tab<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame", {<br />
based_on = "tab",<br />
de.substyle("*-*-*-*-activity", {<br />
shadow_colour = "#e0c0c0",<br />
highlight_colour = "#e0c0c0",<br />
background_colour = "#990000",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame-tiled", {<br />
based_on = "tab-frame",<br />
spacing = 1,<br />
bar_inside_frame = true,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry", {<br />
based_on = "tab",<br />
text_align = "left",<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry-big", {<br />
based_on = "tab-menuentry",<br />
font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",<br />
padding_pixels = 7,<br />
})<br />
<br />
<br />
de.defstyle("input", {<br />
based_on = "*",<br />
text_align = "left",<br />
spacing = 1,<br />
-- Greyish violet background<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
<br />
de.substyle("*-selection", {<br />
background_colour = "#777799",<br />
foreground_colour = "#000000",<br />
}),<br />
<br />
de.substyle("*-cursor", {<br />
background_colour = "#000000",<br />
foreground_colour = "#9999aa",<br />
}),<br />
})<br />
<br />
dopath("look_xerxes")<br />
<br />
-- Refresh objects' brushes.<br />
gr.refresh()<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=886Ion32005-07-25T09:55:14Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktop environment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
To start Ion3 just append the following line in '''<code>~/.xinitrc</code>''' :<br />
exec ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).The 'dopath' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your themes. Your default theme is set on the bottom with the 'dopath' command. The themes are called 'look_<name>.lua and you can make your own by switching the name to your own.<br />
<pre><br />
--<br />
-- Look_cleanviolet for Ion's default drawing engine. <br />
-- Based on look-clean and look-violetgrey.<br />
-- <br />
<br />
if not gr.select_engine("de") then<br />
return<br />
end<br />
<br />
-- Clear existing styles from memory.<br />
de.reset()<br />
<br />
-- Base style<br />
de.defstyle("*", {<br />
-- Gray background<br />
highlight_colour = "#eeeeee",<br />
shadow_colour = "#eeeeee",<br />
background_colour = "#aaaaaa",<br />
foreground_colour = "#000000",<br />
<br />
shadow_pixels = 1,<br />
highlight_pixels = 1,<br />
padding_pixels = 1,<br />
spacing = 0,<br />
border_style = "elevated",<br />
<br />
font = "-*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*",<br />
text_align = "center",<br />
})<br />
<br />
<br />
de.defstyle("frame", {<br />
based_on = "*",<br />
padding_colour = "#aaaaaa",<br />
background_colour = "#000000",<br />
transparent_background = false,<br />
})<br />
<br />
<br />
de.defstyle("frame-tiled", {<br />
based_on = "frame",<br />
shadow_pixels = 0,<br />
highlight_pixels = 0,<br />
padding_pixels = 0,<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab", {<br />
based_on = "*",<br />
font = "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*",<br />
<br />
de.substyle("active-selected", {<br />
-- Violet tab<br />
highlight_colour = "#aaaacc",<br />
shadow_colour = "#aaaacc",<br />
background_colour = "#666699",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
<br />
de.substyle("inactive-selected", {<br />
-- Greyish violet tab<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame", {<br />
based_on = "tab",<br />
de.substyle("*-*-*-*-activity", {<br />
shadow_colour = "#e0c0c0",<br />
highlight_colour = "#e0c0c0",<br />
background_colour = "#990000",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame-tiled", {<br />
based_on = "tab-frame",<br />
spacing = 1,<br />
bar_inside_frame = true,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry", {<br />
based_on = "tab",<br />
text_align = "left",<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry-big", {<br />
based_on = "tab-menuentry",<br />
font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",<br />
padding_pixels = 7,<br />
})<br />
<br />
<br />
de.defstyle("input", {<br />
based_on = "*",<br />
text_align = "left",<br />
spacing = 1,<br />
-- Greyish violet background<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
<br />
de.substyle("*-selection", {<br />
background_colour = "#777799",<br />
foreground_colour = "#000000",<br />
}),<br />
<br />
de.substyle("*-cursor", {<br />
background_colour = "#000000",<br />
foreground_colour = "#9999aa",<br />
}),<br />
})<br />
<br />
dopath("look_xerxes")<br />
<br />
-- Refresh objects' brushes.<br />
gr.refresh()<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=885Ion32005-07-25T09:52:22Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktop environment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).The 'dopath' command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your themes. Your default theme is set on the bottom with the 'dopath' command. The themes are called 'look_<name>.lua and you can make your own by switching the name to your own.<br />
<pre><br />
--<br />
-- Look_cleanviolet for Ion's default drawing engine. <br />
-- Based on look-clean and look-violetgrey.<br />
-- <br />
<br />
if not gr.select_engine("de") then<br />
return<br />
end<br />
<br />
-- Clear existing styles from memory.<br />
de.reset()<br />
<br />
-- Base style<br />
de.defstyle("*", {<br />
-- Gray background<br />
highlight_colour = "#eeeeee",<br />
shadow_colour = "#eeeeee",<br />
background_colour = "#aaaaaa",<br />
foreground_colour = "#000000",<br />
<br />
shadow_pixels = 1,<br />
highlight_pixels = 1,<br />
padding_pixels = 1,<br />
spacing = 0,<br />
border_style = "elevated",<br />
<br />
font = "-*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*",<br />
text_align = "center",<br />
})<br />
<br />
<br />
de.defstyle("frame", {<br />
based_on = "*",<br />
padding_colour = "#aaaaaa",<br />
background_colour = "#000000",<br />
transparent_background = false,<br />
})<br />
<br />
<br />
de.defstyle("frame-tiled", {<br />
based_on = "frame",<br />
shadow_pixels = 0,<br />
highlight_pixels = 0,<br />
padding_pixels = 0,<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab", {<br />
based_on = "*",<br />
font = "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*",<br />
<br />
de.substyle("active-selected", {<br />
-- Violet tab<br />
highlight_colour = "#aaaacc",<br />
shadow_colour = "#aaaacc",<br />
background_colour = "#666699",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
<br />
de.substyle("inactive-selected", {<br />
-- Greyish violet tab<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame", {<br />
based_on = "tab",<br />
de.substyle("*-*-*-*-activity", {<br />
shadow_colour = "#e0c0c0",<br />
highlight_colour = "#e0c0c0",<br />
background_colour = "#990000",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame-tiled", {<br />
based_on = "tab-frame",<br />
spacing = 1,<br />
bar_inside_frame = true,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry", {<br />
based_on = "tab",<br />
text_align = "left",<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry-big", {<br />
based_on = "tab-menuentry",<br />
font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",<br />
padding_pixels = 7,<br />
})<br />
<br />
<br />
de.defstyle("input", {<br />
based_on = "*",<br />
text_align = "left",<br />
spacing = 1,<br />
-- Greyish violet background<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
<br />
de.substyle("*-selection", {<br />
background_colour = "#777799",<br />
foreground_colour = "#000000",<br />
}),<br />
<br />
de.substyle("*-cursor", {<br />
background_colour = "#000000",<br />
foreground_colour = "#9999aa",<br />
}),<br />
})<br />
<br />
dopath("look_xerxes")<br />
<br />
-- Refresh objects' brushes.<br />
gr.refresh()<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=884Ion32005-07-25T09:51:18Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktop environment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).<br />
<br />
the dopath command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre><br />
<br />
==== look.lua ====<br />
In this file you set your themes. Your default theme is set on the bottom with the 'dopath' command. The themes are called 'look_<name>.lua and you can make your own by switching the name to your own.<br />
<pre><br />
--<br />
-- Look_cleanviolet for Ion's default drawing engine. <br />
-- Based on look-clean and look-violetgrey.<br />
-- <br />
<br />
if not gr.select_engine("de") then<br />
return<br />
end<br />
<br />
-- Clear existing styles from memory.<br />
de.reset()<br />
<br />
-- Base style<br />
de.defstyle("*", {<br />
-- Gray background<br />
highlight_colour = "#eeeeee",<br />
shadow_colour = "#eeeeee",<br />
background_colour = "#aaaaaa",<br />
foreground_colour = "#000000",<br />
<br />
shadow_pixels = 1,<br />
highlight_pixels = 1,<br />
padding_pixels = 1,<br />
spacing = 0,<br />
border_style = "elevated",<br />
<br />
font = "-*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*",<br />
text_align = "center",<br />
})<br />
<br />
<br />
de.defstyle("frame", {<br />
based_on = "*",<br />
padding_colour = "#aaaaaa",<br />
background_colour = "#000000",<br />
transparent_background = false,<br />
})<br />
<br />
<br />
de.defstyle("frame-tiled", {<br />
based_on = "frame",<br />
shadow_pixels = 0,<br />
highlight_pixels = 0,<br />
padding_pixels = 0,<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab", {<br />
based_on = "*",<br />
font = "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*",<br />
<br />
de.substyle("active-selected", {<br />
-- Violet tab<br />
highlight_colour = "#aaaacc",<br />
shadow_colour = "#aaaacc",<br />
background_colour = "#666699",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
<br />
de.substyle("inactive-selected", {<br />
-- Greyish violet tab<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame", {<br />
based_on = "tab",<br />
de.substyle("*-*-*-*-activity", {<br />
shadow_colour = "#e0c0c0",<br />
highlight_colour = "#e0c0c0",<br />
background_colour = "#990000",<br />
foreground_colour = "#eeeeee",<br />
}),<br />
})<br />
<br />
de.defstyle("tab-frame-tiled", {<br />
based_on = "tab-frame",<br />
spacing = 1,<br />
bar_inside_frame = true,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry", {<br />
based_on = "tab",<br />
text_align = "left",<br />
spacing = 1,<br />
})<br />
<br />
<br />
de.defstyle("tab-menuentry-big", {<br />
based_on = "tab-menuentry",<br />
font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*",<br />
padding_pixels = 7,<br />
})<br />
<br />
<br />
de.defstyle("input", {<br />
based_on = "*",<br />
text_align = "left",<br />
spacing = 1,<br />
-- Greyish violet background<br />
highlight_colour = "#eeeeff",<br />
shadow_colour = "#eeeeff",<br />
background_colour = "#9999aa",<br />
foreground_colour = "#000000",<br />
<br />
de.substyle("*-selection", {<br />
background_colour = "#777799",<br />
foreground_colour = "#000000",<br />
}),<br />
<br />
de.substyle("*-cursor", {<br />
background_colour = "#000000",<br />
foreground_colour = "#9999aa",<br />
}),<br />
})<br />
<br />
dopath("look_xerxes")<br />
<br />
-- Refresh objects' brushes.<br />
gr.refresh()<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=883Ion32005-07-25T09:42:31Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktop environment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy the configurationfiles to your home directory:<br />
cp /etc/ion3/* ~/.ion3<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).<br />
<br />
the dopath command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=880Ion32005-07-25T09:40:54Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktop environment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br><br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy over the configurationfiles to your home directory:<br />
cp -r /etc/ion3 ~/<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br><br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).<br />
<br />
the dopath command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=879Ion32005-07-25T09:38:17Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktop environment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository. <br />
Refresh Pacman and run the following command:<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy over the configurationfiles to your home directory:<br />
cp -r /etc/ion3 ~/<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br />
<i>'''Note:''' The files below have been heavily modified from the defaults to better suit my needs. /xerxes2</i><br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).<br />
<br />
the dopath command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=878Ion32005-07-25T09:32:25Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktop environment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. It mainly uses the keyboard to access the functions but also supports the mouse for some things. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel-scripts<br />
Copy over the configurationfiles to your home directory:<br />
cp -r /etc/ion3 ~/<br />
Now you're ready to begin to configure Ion to suit your taste as described below.<br />
<br />
==== cfg_ion.lua ====<br />
This is Ion3' main configurationfile.<br />
<pre><br />
-- Ion main configuration file<br />
--<br />
<br />
--<br />
-- Some basic setup<br />
--<br />
<br />
-- Set default modifiers. Alt should usually be mapped to Mod1 on<br />
-- XFree86-based systems. The flying window keys are probably Mod3<br />
-- or Mod4; see the output of 'xmodmap'.<br />
MOD1="Mod4+"<br />
MOD2="Mod1+"<br />
<br />
ioncore.set{<br />
-- Maximum delay between clicks in milliseconds to be considered a<br />
-- double click.<br />
dblclick_delay=250,<br />
<br />
-- For keyboard resize, time (in milliseconds) to wait after latest<br />
-- key press before automatically leaving resize mode (and doing<br />
-- the resize in case of non-opaque move).<br />
kbresize_delay=1500,<br />
<br />
-- Opaque resize?<br />
opaque_resize=false,<br />
<br />
-- Movement commands warp the pointer to frames instead of just<br />
-- changing focus. Enabled by default.<br />
warp=true,<br />
<br />
-- Default workspace type.<br />
default_ws_type="WIonWS",<br />
}<br />
<br />
<br />
--<br />
-- Load some modules, extensions and other configuration files<br />
--<br />
<br />
-- Load some modules.<br />
dopath("mod_query")<br />
dopath("mod_menu")<br />
dopath("mod_ionws")<br />
dopath("mod_floatws")<br />
dopath("mod_panews")<br />
--dopath("mod_statusbar")<br />
--dopath("mod_dock")<br />
dopath("mod_sp")<br />
<br />
-- Load some kludges to make apps behave better.<br />
dopath("cfg_kludges")<br />
<br />
-- Make some bindings.<br />
dopath("cfg_bindings")<br />
<br />
-- Define some menus (mod_menu required)<br />
dopath("cfg_menus")<br />
<br />
-- Load additional user configuration. 'true' as second parameter asks<br />
-- Ion not to complain if the file is not found.<br />
dopath("cfg_user", true)<br />
</pre><br />
The Modkeyes handles your hotkeys when you holds them in(Modkey + hotkey).<br />
<br />
the dopath command includes modules that Ion should load on startup. Just uncomment those you don't want to load.<br />
<br />
==== cfg_bindings.lua ====<br />
In this file you set your basic keybindings.<br />
<pre><br />
-- <br />
-- Ion bindings configuration file. Global bindings and bindings common <br />
-- to screens and all types of frames only. See modules' configuration <br />
-- files for other bindings.<br />
--<br />
<br />
<br />
-- WScreen context bindings<br />
--<br />
-- The bindings in this context are available all the time.<br />
--<br />
-- The variable MOD1 should contain a string of the form 'Mod1+'<br />
-- where Mod1 maybe replaced with the modifier you want to use for most<br />
-- of the bindings. Similarly MOD2 may be redefined to add a <br />
-- modifier to some of the F-key bindings.<br />
<br />
defbindings("WScreen", {<br />
bdoc("Switch to n:th object (workspace, full screen client window) "..<br />
"within current screen."),<br />
kpress(MOD1.."1", "WScreen.switch_nth(_, 0)"),<br />
kpress(MOD1.."2", "WScreen.switch_nth(_, 1)"),<br />
kpress(MOD1.."3", "WScreen.switch_nth(_, 2)"),<br />
kpress(MOD1.."4", "WScreen.switch_nth(_, 3)"),<br />
kpress(MOD1.."5", "WScreen.switch_nth(_, 4)"),<br />
kpress(MOD1.."6", "WScreen.switch_nth(_, 5)"),<br />
kpress(MOD1.."7", "WScreen.switch_nth(_, 6)"),<br />
kpress(MOD1.."8", "WScreen.switch_nth(_, 7)"),<br />
kpress(MOD1.."9", "WScreen.switch_nth(_, 8)"),<br />
kpress(MOD1.."0", "WScreen.switch_nth(_, 9)"),<br />
<br />
-- bdoc("Switch to next/previous object within current screen."),<br />
-- kpress(MOD2.."comma", "ioncore.goto_previous()"),<br />
-- kpress(MOD2.."period", "ioncore.goto_next()"),<br />
<br />
kpress(MOD1.."Left", "WScreen.switch_prev(_)"),<br />
kpress(MOD1.."Right", "WScreen.switch_next(_)"),<br />
<br />
<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Go to previous active object."),<br />
kpress("K", "ioncore.goto_previous()"),<br />
<br />
bdoc("Clear all tags."),<br />
kpress("T", "ioncore.clear_tags()"),<br />
}),<br />
<br />
bdoc("Go to n:th screen on multihead setup."),<br />
kpress(MOD1.."Shift+1", "ioncore.goto_nth_screen(0)"),<br />
kpress(MOD1.."Shift+2", "ioncore.goto_nth_screen(1)"),<br />
<br />
bdoc("Go to next/previous screen on multihead setup."),<br />
kpress(MOD1.."Shift+Left", "ioncore.goto_next_screen()"),<br />
kpress(MOD1.."Shift+Right", "ioncore.goto_prev_screen()"),<br />
<br />
bdoc("Create a new workspace of chosen default type."),<br />
kpress(MOD1.."F9", "ioncore.create_ws(_)"),<br />
<br />
bdoc("Display the main menu."),<br />
kpress(MOD1.."F12", "mod_menu.bigmenu(_, _sub, 'mainmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"),<br />
<br />
bdoc("Display the window list menu."),<br />
mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"),<br />
})<br />
<br />
<br />
-- WMPlex context bindings<br />
--<br />
-- These bindings work in frames and on screens. The innermost of such<br />
-- contexts/objects always gets to handle the key press. Most of these <br />
-- bindings define actions on client windows. (Remember that client windows <br />
-- can be put in fullscreen mode and therefore may not have a frame.)<br />
-- <br />
-- The "_sub:WClientWin" guards are used to ensure that _sub is a client<br />
-- window in order to stop Ion from executing the callback with an invalid<br />
-- parameter if it is not and then complaining.<br />
<br />
defbindings("WMPlex", {<br />
bdoc("Close current object."),<br />
kpress_wait(MOD1.."C", "WRegion.rqclose_propagate(_, _sub)"),<br />
<br />
bdoc("Nudge current client window. This might help with some "..<br />
"programs' resizing problems."),<br />
kpress_wait(MOD1.."L", <br />
"WClientWin.nudge(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Toggle fullscreen mode of current client window."),<br />
kpress_wait(MOD1.."Return", <br />
"WClientWin.set_fullscreen(_sub, 'toggle')", <br />
"_sub:WClientWin"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Kill client owning current client window."),<br />
kpress("C", "WClientWin.kill(_sub)", "_sub:WClientWin"),<br />
<br />
bdoc("Send next key press to current client window. "..<br />
"Some programs may not allow this by default."),<br />
kpress("Q", "WClientWin.quote_next(_sub)", "_sub:WClientWin"),<br />
}),<br />
<br />
bdoc("Query for manual page to be displayed."),<br />
kpress(MOD2.."F1", "mod_query.query_man(_, ':man')"),<br />
<br />
bdoc("Show the Ion manual page."),<br />
kpress(MOD1.."F1", "ioncore.exec_on(_, ':man ion3')"),<br />
<br />
bdoc("Run a terminal emulator."),<br />
kpress(MOD1.."F2", "ioncore.exec_on(_, 'urxvt')"),<br />
<br />
bdoc("Query for command line to execute."),<br />
kpress(MOD2.."F3", "mod_query.query_exec(_)"),<br />
<br />
bdoc("Query for Lua code to execute."),<br />
kpress(MOD1.."F3", "mod_query.query_lua(_)"),<br />
<br />
bdoc("Query for host to connect to with SSH."),<br />
kpress(MOD2.."F4", "mod_query.query_ssh(_, ':ssh')"),<br />
<br />
bdoc("Query for file to edit."),<br />
kpress(MOD2.."F5", <br />
"mod_query.query_editfile(_, 'run-mailcap --action=edit')"),<br />
<br />
bdoc("Query for file to view."),<br />
kpress(MOD2.."F6", <br />
"mod_query.query_runfile(_, 'run-mailcap --action=view')"),<br />
<br />
bdoc("Query for workspace to go to or create a new one."),<br />
kpress(MOD2.."F9", "mod_query.query_workspace(_)"),<br />
<br />
bdoc("Query for a client window to go to."),<br />
kpress(MOD1.."G", "mod_query.query_gotoclient(_)"),<br />
})<br />
<br />
<br />
-- WFrame context bindings<br />
--<br />
-- These bindings are common to all types of frames. The rest of frame<br />
-- bindings that differ between frame types are defined in the modules' <br />
-- configuration files.<br />
<br />
defbindings("WFrame", {<br />
bdoc("Tag current object within the frame."),<br />
kpress(MOD1.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"),<br />
<br />
submap(MOD1.."K", {<br />
bdoc("Switch to n:th object within the frame."),<br />
kpress("1", "WFrame.switch_nth(_, 0)"),<br />
kpress("2", "WFrame.switch_nth(_, 1)"),<br />
kpress("3", "WFrame.switch_nth(_, 2)"),<br />
kpress("4", "WFrame.switch_nth(_, 3)"),<br />
kpress("5", "WFrame.switch_nth(_, 4)"),<br />
kpress("6", "WFrame.switch_nth(_, 5)"),<br />
kpress("7", "WFrame.switch_nth(_, 6)"),<br />
kpress("8", "WFrame.switch_nth(_, 7)"),<br />
kpress("9", "WFrame.switch_nth(_, 8)"),<br />
kpress("0", "WFrame.switch_nth(_, 9)"),<br />
<br />
bdoc("Switch to next/previous object within the frame."),<br />
kpress("N", "WFrame.switch_next(_)"),<br />
kpress("P", "WFrame.switch_prev(_)"),<br />
<br />
bdoc("Move current object within the frame left/right."),<br />
kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"),<br />
kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"),<br />
<br />
bdoc("Maximize the frame horizontally/vertically."),<br />
kpress("H", "WFrame.maximize_horiz(_)"),<br />
kpress("V", "WFrame.maximize_vert(_)"),<br />
<br />
bdoc("Attach tagged objects to this frame."),<br />
kpress("A", "WFrame.attach_tagged(_)"),<br />
}),<br />
<br />
kpress(MOD1.."comma", "WFrame.switch_prev(_)"),<br />
kpress(MOD1.."period", "WFrame.switch_next(_)"),<br />
<br />
bdoc("Query for a client window to attach to active frame."),<br />
kpress(MOD1.."A", "mod_query.query_attachclient(_)"),<br />
<br />
bdoc("Display frame context menu."),<br />
kpress(MOD1.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"),<br />
mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"),<br />
<br />
bdoc("Begin move/resize mode."),<br />
kpress(MOD1.."R", "WFrame.begin_kbresize(_)"),<br />
<br />
bdoc("Switch the frame to display the object indicated by the tab."),<br />
mclick("Button1@tab", "WFrame.p_switch_tab(_)"),<br />
mclick("Button2@tab", "WFrame.p_switch_tab(_)"),<br />
<br />
bdoc("Resize the frame."),<br />
mdrag("Button1@border", "WFrame.p_resize(_)"),<br />
mdrag(MOD1.."Button3", "WFrame.p_resize(_)"),<br />
<br />
bdoc("Move the frame."),<br />
mdrag(MOD1.."Button1", "WFrame.p_move(_)"),<br />
<br />
bdoc("Move objects between frames by dragging and dropping the tab."),<br />
mdrag("Button1@tab", "WFrame.p_tabdrag(_)"),<br />
mdrag("Button2@tab", "WFrame.p_tabdrag(_)"),<br />
<br />
})<br />
<br />
<br />
-- WMoveresMode context bindings<br />
-- <br />
-- These bindings are available keyboard move/resize mode. The mode<br />
-- is activated on frames with the command begin_kbresize (bound to<br />
-- MOD1.."R" above by default).<br />
<br />
defbindings("WMoveresMode", {<br />
bdoc("Cancel the resize mode."),<br />
kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"),<br />
<br />
bdoc("End the resize mode."),<br />
kpress("AnyModifier+Return","WMoveresMode.finish(_)"),<br />
<br />
bdoc("Grow in specified direction."),<br />
kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"),<br />
kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"),<br />
kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"),<br />
kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"),<br />
<br />
bdoc("Shrink in specified direction."),<br />
kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"),<br />
kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"),<br />
kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"),<br />
kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"),<br />
<br />
bdoc("Move in specified direction."),<br />
kpress(MOD1.."Left", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."Right", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."Up", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."Down", "WMoveresMode.move(_, 0, 1)"),<br />
kpress(MOD1.."F", "WMoveresMode.move(_,-1, 0)"),<br />
kpress(MOD1.."B", "WMoveresMode.move(_, 1, 0)"),<br />
kpress(MOD1.."P", "WMoveresMode.move(_, 0,-1)"),<br />
kpress(MOD1.."N", "WMoveresMode.move(_, 0, 1)"),<br />
})<br />
</pre><br />
<br />
==== cfg_menus.lua ====<br />
In this file you configure your main menu.<br />
<pre><br />
--<br />
-- Ion menu definitions<br />
--<br />
<br />
<br />
-- Main menu<br />
defmenu("mainmenu", {<br />
submenu("Programs", "appmenu"),<br />
menuentry("Lock screen", "ioncore.exec_on(_, 'xlock')"),<br />
menuentry("Help", "mod_query.query_man(_)"),<br />
menuentry("About Ion", "mod_query.show_about_ion(_)"),<br />
submenu("Styles", "stylemenu"),<br />
submenu("Session", "sessionmenu"),<br />
})<br />
<br />
<br />
-- Application menu<br />
defmenu("appmenu", {<br />
menuentry("Firefox","ioncore.exec_on(_, 'firefox')"),<br />
menuentry("Thunderbird","ioncore.exec_on(_, 'thunderbird')"),<br />
menuentry("Editor","ioncore.exec_on(_, 'lazy-edit')"),<br />
menuentry("Player","ioncore.exec_on(_, 'lazy-player')"),<br />
menuentry("FTP","ioncore.exec_on(_, 'lazy-ftp')"),<br />
menuentry("GVim","ioncore.exec_on(_, 'gvim')"),<br />
menuentry("Run...", "mod_query.query_exec(_)"),<br />
})<br />
<br />
<br />
-- Session control menu<br />
defmenu("sessionmenu", {<br />
menuentry("Save", "ioncore.snapshot()"),<br />
menuentry("Restart", "ioncore.restart()"),<br />
menuentry("Restart PWM", "ioncore.restart_other('pwm')"),<br />
menuentry("Restart TWM", "ioncore.restart_other('twm')"),<br />
menuentry("Exit", "ioncore.shutdown()"),<br />
})<br />
<br />
<br />
-- Context menu (frame/client window actions)<br />
defctxmenu("WFrame", {<br />
menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"),<br />
menuentry("Kill", "WClientWin.kill(_sub)",<br />
"_sub:WClientWin"),<br />
menuentry("(Un)tag", "WRegion.set_tagged(_sub, 'toggle')",<br />
"_sub:non-nil"),<br />
menuentry("Attach tagged", "WFrame.attach_tagged(_)"),<br />
menuentry("Clear tags", "ioncore.clear_tags()"),<br />
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",<br />
"_sub:WClientWin"),<br />
})<br />
</pre><br />
<br />
==== cfg_ionws.lua ====<br />
In this file you configure your ion workspaces.<br />
<pre><br />
--<br />
-- Ion ionws module configuration file<br />
--<br />
<br />
-- Bindings for the tiled workspaces (ionws). These should work on any <br />
-- object on the workspace.<br />
<br />
defbindings("WIonWS", {<br />
bdoc("Split current frame vertically."),<br />
kpress(MOD1.."V", "WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
<br />
bdoc("Split current frame horizontally."),<br />
kpress(MOD1.."H", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress(MOD1.."Tab", "WIonWS.unsplit_at(_, _sub)"),<br />
<br />
bdoc("Go to frame above/below/right/left of current frame."),<br />
kpress(MOD2.."Up", "WIonWS.goto_dir(_, 'above')"),<br />
kpress(MOD2.."Down", "WIonWS.goto_dir(_, 'below')"),<br />
kpress(MOD2.."Right", "WIonWS.goto_dir(_, 'right')"),<br />
kpress(MOD2.."Left", "WIonWS.goto_dir(_, 'left')"),<br />
submap(MOD1.."K", {<br />
bdoc("Split current frame horizontally."),<br />
kpress("S", "WIonWS.split_at(_, _sub, 'right', true)"),<br />
<br />
bdoc("Destroy current frame."),<br />
kpress("X", "WIonWS.unsplit_at(_, _sub)"),<br />
}),<br />
})<br />
<br />
<br />
-- Frame bindings. These work in (Ion/tiled-style) frames. Some bindings<br />
-- that are common to all frame types and multiplexes are defined in<br />
-- ion-bindings.lua.<br />
<br />
--defbindings("WFrame-on-WIonWS", {<br />
--})<br />
<br />
-- WFloatFrame context menu extras<br />
<br />
if mod_menu then<br />
defctxmenu("WIonWS", {<br />
menuentry("Destroy frame", <br />
"WIonWS.unsplit_at(_, _sub)"),<br />
menuentry("Split vertically", <br />
"WIonWS.split_at(_, _sub, 'bottom', true)"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_at(_, _sub, 'right', true)"),<br />
menuentry("Flip", "WIonWS.flip_at(_, _sub)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_, _sub)"),<br />
submenu("Float split", {<br />
menuentry("At left", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'left')"),<br />
menuentry("At right", <br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'right')"),<br />
menuentry("Above",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'up')"),<br />
menuentry("Below",<br />
"WIonWS.set_floating_at(_, _sub, 'toggle', 'down')"),<br />
}),<br />
submenu("At root", {<br />
menuentry("Split vertically", <br />
"WIonWS.split_top(_, 'bottom')"),<br />
menuentry("Split horizontally", <br />
"WIonWS.split_top(_, 'right')"),<br />
menuentry("Flip", "WIonWS.flip_at(_)"),<br />
menuentry("Transpose", "WIonWS.transpose_at(_)"),<br />
}),<br />
})<br />
end<br />
</pre></div>Xerxes2https://wiki.archlinux.org/index.php?title=Ion3&diff=875Ion32005-07-25T09:01:38Z<p>Xerxes2: </p>
<hr />
<div>==== Introduction ====<br />
Ion is a complete desktop environment built on the tiling windowmanager PWM. It uses Lua as an embedded interpreter which handles all of the configuration. <br />
<br />
==== Installing ====<br />
Ion3 is still in development and hasn't been released yet but packages for the development snapshots can be found in the community repository.<br />
pacman -S ion3-devel<br />
If you want a bunch of extra scripts you can run the following(optional):<br />
pacman -S ion3-devel<br />
Copy over the files to your home directory:<br />
cp -r /etc/ion3 ~/<br />
==== cfg_ion.lua ====<br />
This is Ion3'<br />
==== cfg_bindings.lua ====<br />
<br />
==== cfg_menus.lua ====<br />
<br />
==== cfg_ionws.lua ====</div>Xerxes2https://wiki.archlinux.org/index.php?title=User:Xerxes2&diff=3989User:Xerxes22005-07-25T08:38:38Z<p>Xerxes2: </p>
<hr />
<div>[[Ion3]]</div>Xerxes2https://wiki.archlinux.org/index.php?title=Network_configuration&diff=753Network configuration2005-07-24T09:27:26Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Network]]<br />
==Summary==<br />
A simple guide to get your network running.<br />
<br />
==Load the device module==<br />
Add your eth0 module to the modules array in <code>/etc/rc.conf</code>, eg. tg3<br />
MODULES=(!usbserial tg3 snd-cmipci)<br />
<br />
==Configure IP==<br />
===For DHCP IP===<br />
<br />
Edit <code>/etc/rc.conf</code> like this:<br />
<br />
<pre><br />
lo="lo 127.0.0.1"<br />
eth0="dhcp"<br />
INTERFACES=(lo eth0)<br />
ROUTES=(!gateway)<br />
</pre><br />
<br />
===For Static IP===<br />
<br />
If you share your internet connection from a Windows box without a router, be sure to use static IPs on both computers. Otherwise you will have LAN issues.<br />
<br />
You need:<br />
<br />
* Your static IP address,<br />
* The netmask,<br />
* The broadcast address,<br />
* Your gateway,<br />
* Your nameservers' IP addresses,<br />
* Your domain name.<br />
<br />
<br />
If you are running a private network, it is safe to use IP addresses in 192.168.*.'* for your IPs, with a netmask of 255.255.0.0 and broadcast address of 192.168.255.255. Unless your network has a router, the gateway address does not matter. Edit <code>/etc/rc.conf</code> like this, substituting your own values for the IP, netmask, broadcast, and gateway:<br />
<pre><br />
lo="lo 127.0.0.1"<br />
eth0="eth0 82.137.129.59 netmask 255.255.255.0 broadcast 82.137.129.255"<br />
INTERFACES=(lo eth0)<br />
gateway="default gw 82.137.129.1"<br />
ROUTES=(gateway)<br />
</pre><br />
and your <code>/etc/resolv.conf</code> like this, substituting your nameservers' IPs and your domain name:<br />
<br />
<pre><br />
nameserver 61.23.173.5<br />
nameserver 61.95.849.8<br />
search example.com<br />
</pre><br />
<br />
You may include as many nameserver lines as you wish.<br />
<br />
If you use DHCP and you don't want your DNS servers to change every time you start your network, be sure to add the <code>-R</code> option to code>DHCPCD_ARGS</code> in <code>/etc/conf.d/dhcpcd</code> (used by in <code>/etc/rc.d/network</code>). This prevents DHCP from rewritting your <code>/etc/resolv.conf</code> every time:<br />
DHCPCD_ARGS="-R -t 30 -h $HOSTNAME"<br />
<br />
==Set computer name==<br />
Edit <code>/etc/rc.conf</code> and set HOSTNAME to your desired computer name :<br />
HOSTNAME="banana"<br />
<br />
==Set host name/ip==<br />
<br />
Edit <code>/etc/hosts</code> and add a similar line with the same HOSTNAME you entered at <code>/etc/rc.conf</code> :<br />
127.0.0.1 banana.localdomain banana</div>Xerxes2https://wiki.archlinux.org/index.php?title=Network_configuration&diff=723Network configuration2005-07-24T09:26:12Z<p>Xerxes2: </p>
<hr />
<div>[[Category:Network]]<br />
==Summary==<br />
A simple guide to get your network running.<br />
<br />
==Load the device module==<br />
Add your eth0 module to the modules array in <code>/etc/rc.conf</code>, eg. tg3<br />
MODULES=(!usbserial tg3 snd-cmipci)<br />
<br />
==Configure IP==<br />
===For DHCP IP===<br />
<br />
Edit <code>/etc/rc.conf</code> like this:<br />
<br />
<pre><br />
lo="lo 127.0.0.1"<br />
eth0="dhcp"<br />
INTERFACES=(lo eth0)<br />
ROUTES=(!gateway)<br />
</pre><br />
<br />
===For Static IP===<br />
<br />
If you share your internet connection from a Windows box without a router, be sure to use static IPs on both computers. Otherwise you will have LAN issues.<br />
<br />
You need:<br />
<pre><br />
Your static IP address,<br />
The netmask,<br />
The broadcast address,<br />
Your gateway,<br />
Your nameservers' IP addresses,<br />
Your domain name.<br />
</pre><br />
<br />
If you are running a private network, it is safe to use IP addresses in 192.168.*.'* for your IPs, with a netmask of 255.255.0.0 and broadcast address of 192.168.255.255. Unless your network has a router, the gateway address does not matter. Edit <code>/etc/rc.conf</code> like this, substituting your own values for the IP, netmask, broadcast, and gateway:<br />
<pre><br />
lo="lo 127.0.0.1"<br />
eth0="eth0 82.137.129.59 netmask 255.255.255.0 broadcast 82.137.129.255"<br />
INTERFACES=(lo eth0)<br />
gateway="default gw 82.137.129.1"<br />
ROUTES=(gateway)<br />
</pre><br />
and your <code>/etc/resolv.conf</code> like this, substituting your nameservers' IPs and your domain name:<br />
<br />
<pre><br />
nameserver 61.23.173.5<br />
nameserver 61.95.849.8<br />
search example.com<br />
</pre><br />
<br />
You may include as many nameserver lines as you wish.<br />
<br />
If you use DHCP and you don't want your DNS servers to change every time you start your network, be sure to add the <code>-R</code> option to code>DHCPCD_ARGS</code> in <code>/etc/conf.d/dhcpcd</code> (used by in <code>/etc/rc.d/network</code>). This prevents DHCP from rewritting your <code>/etc/resolv.conf</code> every time:<br />
DHCPCD_ARGS="-R -t 30 -h $HOSTNAME"<br />
<br />
==Set computer name==<br />
Edit <code>/etc/rc.conf</code> and set HOSTNAME to your desired computer name :<br />
HOSTNAME="banana"<br />
<br />
==Set host name/ip==<br />
<br />
Edit <code>/etc/hosts</code> and add a similar line with the same HOSTNAME you entered at <code>/etc/rc.conf</code> :<br />
127.0.0.1 banana.localdomain banana</div>Xerxes2https://wiki.archlinux.org/index.php?title=Display_manager&diff=1443Display manager2005-07-24T00:13:43Z<p>Xerxes2: </p>
<hr />
<div>[[Category:BootProcess]]<br />
This is very easy to do, and will add the login manager as a daemon that will automatically load upon the startup of your computer. All you need is root access.<br />
<br />
Just do the following:<br />
<br />
1. Login as root with <i>su</i>.<br />
<br />
2. Open the file <i>/etc/rc.conf</i> in your editor of choice.<br />
<br />
3. Scroll through the file until you see a line that looks similar to the following (it is most likely near the bottom):<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond)<br />
<br />
4. After the last listed program, add the login manager that you want to use, either KDM, GDM or XDM, such as the following:<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond kdm) #This would load KDM on startup<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond gdm) #This would load GDM on startup<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond xdm) #This would load XDM on startup<br />
<br />
5. Save the file, and exit the editor. The next time you reboot, the login manager should run. If it does not, make sure that your file is correct, and that the program is installed.<br />
<br />
<b>Extra Notes:</b><br />
* The KDM package is a part of the <em>kdebase</em> package. You can acquire it with this <em>pacman</em> command as <b>root</b>:<br />
<br />
pacman -Syu kdebase<br />
<br />
<b><i>Alternate method</i></b><br />
While the above method will work, a side effect is that there will be no difference between run levels 3 and 5, and actually if you start up run level 5 you may have both xdm and kdm/gdm running, depending on what your <i>/etc/inittab</i> looks like. To avoid this, instead of the above, do the following:<br />
<br />
1. Login as root with <i>su</i>.<br />
<br />
2. Open <i>/etc/inittab</i> using an editor of your choice.<br />
<br />
3. Change the line<br />
<br />
id:3:initdefault:<br />
<br />
to<br />
<br />
id:5:initdefault:<br />
<br />
4. Make sure the line<br />
<br />
x:5:respawn:/usr/X11R6/bin/xdm -nodaemon<br />
<br />
appears in the file.<br />
<br />
5. (Optional) If you just want xdm, skip this step. If you want gdm or kdm, change the line<br />
<br />
x:5:respawn:/usr/X11R6/bin/xdm -nodaemon<br />
<br />
to one of<br />
<br />
x:5:respawn:/opt/gnome/bin/gdm -nodaemon<br />
<br />
x:5:respawn:/opt/kde/bin/kdm -nodaemon<br />
<br />
6. Save the file and exit the editor.<br />
<br />
That's it -- next time you boot, your chosen display manager will appear. To start it without rebooting, execute the following command (still as root):<br />
<br />
/sbin/telinit 5<br />
<br />
If you ever need to stop X (to upgrade your video drivers, for example), you can execute (as root):<br />
<br />
/sbin/telinit 3<br />
<br />
to get back to a console-based login. After you're done, you can telinit back to run level 5, no reboot necessary.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Display_manager&diff=563Display manager2005-07-24T00:13:16Z<p>Xerxes2: </p>
<hr />
<div>[[Category:BootProcess]]<br />
<br />
This is very easy to do, and will add the login manager as a daemon that will automatically load upon the startup of your computer. All you need is root access.<br />
<br />
Just do the following:<br />
<br />
1. Login as root with <i>su</i>.<br />
<br />
2. Open the file <i>/etc/rc.conf</i> in your editor of choice.<br />
<br />
3. Scroll through the file until you see a line that looks similar to the following (it is most likely near the bottom):<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond)<br />
<br />
4. After the last listed program, add the login manager that you want to use, either KDM, GDM or XDM, such as the following:<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond kdm) #This would load KDM on startup<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond gdm) #This would load GDM on startup<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond xdm) #This would load XDM on startup<br />
<br />
5. Save the file, and exit the editor. The next time you reboot, the login manager should run. If it does not, make sure that your file is correct, and that the program is installed.<br />
<br />
<b>Extra Notes:</b><br />
* The KDM package is a part of the <em>kdebase</em> package. You can acquire it with this <em>pacman</em> command as <b>root</b>:<br />
<br />
pacman -Syu kdebase<br />
<br />
<b><i>Alternate method</i></b><br />
While the above method will work, a side effect is that there will be no difference between run levels 3 and 5, and actually if you start up run level 5 you may have both xdm and kdm/gdm running, depending on what your <i>/etc/inittab</i> looks like. To avoid this, instead of the above, do the following:<br />
<br />
1. Login as root with <i>su</i>.<br />
<br />
2. Open <i>/etc/inittab</i> using an editor of your choice.<br />
<br />
3. Change the line<br />
<br />
id:3:initdefault:<br />
<br />
to<br />
<br />
id:5:initdefault:<br />
<br />
4. Make sure the line<br />
<br />
x:5:respawn:/usr/X11R6/bin/xdm -nodaemon<br />
<br />
appears in the file.<br />
<br />
5. (Optional) If you just want xdm, skip this step. If you want gdm or kdm, change the line<br />
<br />
x:5:respawn:/usr/X11R6/bin/xdm -nodaemon<br />
<br />
to one of<br />
<br />
x:5:respawn:/opt/gnome/bin/gdm -nodaemon<br />
<br />
x:5:respawn:/opt/kde/bin/kdm -nodaemon<br />
<br />
6. Save the file and exit the editor.<br />
<br />
That's it -- next time you boot, your chosen display manager will appear. To start it without rebooting, execute the following command (still as root):<br />
<br />
/sbin/telinit 5<br />
<br />
If you ever need to stop X (to upgrade your video drivers, for example), you can execute (as root):<br />
<br />
/sbin/telinit 3<br />
<br />
to get back to a console-based login. After you're done, you can telinit back to run level 5, no reboot necessary.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Display_manager&diff=562Display manager2005-07-24T00:10:55Z<p>Xerxes2: </p>
<hr />
<div>[[Category:BootProcess]]<br />
<br />
<b><big><big>Adding a login manager (KDM, GDM, or XDM) to automatically boot on startup</big></big></b><br />
<br />
This is very easy to do, and will add the login manager as a daemon that will automatically load upon the startup of your computer. All you need is root access.<br />
<br />
Just do the following:<br />
<br />
1. Login as root with <i>su</i>.<br />
<br />
2. Open the file <i>/etc/rc.conf</i> in your editor of choice.<br />
<br />
3. Scroll through the file until you see a line that looks similar to the following (it is most likely near the bottom):<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond)<br />
<br />
4. After the last listed program, add the login manager that you want to use, either KDM, GDM or XDM, such as the following:<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond kdm) #This would load KDM on startup<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond gdm) #This would load GDM on startup<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond xdm) #This would load XDM on startup<br />
<br />
5. Save the file, and exit the editor. The next time you reboot, the login manager should run. If it does not, make sure that your file is correct, and that the program is installed.<br />
<br />
<b>Extra Notes:</b><br />
* The KDM package is a part of the <em>kdebase</em> package. You can acquire it with this <em>pacman</em> command as <b>root</b>:<br />
<br />
pacman -Syu kdebase<br />
<br />
<b><i>Alternate method</i></b><br />
While the above method will work, a side effect is that there will be no difference between run levels 3 and 5, and actually if you start up run level 5 you may have both xdm and kdm/gdm running, depending on what your <i>/etc/inittab</i> looks like. To avoid this, instead of the above, do the following:<br />
<br />
1. Login as root with <i>su</i>.<br />
<br />
2. Open <i>/etc/inittab</i> using an editor of your choice.<br />
<br />
3. Change the line<br />
<br />
id:3:initdefault:<br />
<br />
to<br />
<br />
id:5:initdefault:<br />
<br />
4. Make sure the line<br />
<br />
x:5:respawn:/usr/X11R6/bin/xdm -nodaemon<br />
<br />
appears in the file.<br />
<br />
5. (Optional) If you just want xdm, skip this step. If you want gdm or kdm, change the line<br />
<br />
x:5:respawn:/usr/X11R6/bin/xdm -nodaemon<br />
<br />
to one of<br />
<br />
x:5:respawn:/opt/gnome/bin/gdm -nodaemon<br />
<br />
x:5:respawn:/opt/kde/bin/kdm -nodaemon<br />
<br />
6. Save the file and exit the editor.<br />
<br />
That's it -- next time you boot, your chosen display manager will appear. To start it without rebooting, execute the following command (still as root):<br />
<br />
/sbin/telinit 5<br />
<br />
If you ever need to stop X (to upgrade your video drivers, for example), you can execute (as root):<br />
<br />
/sbin/telinit 3<br />
<br />
to get back to a console-based login. After you're done, you can telinit back to run level 5, no reboot necessary.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Display_manager&diff=561Display manager2005-07-24T00:08:57Z<p>Xerxes2: </p>
<hr />
<div>[[Category:BootProcess]]<br />
<br />
<b><big><big>Adding a login manager (KDM, GDM, or XDM) to automatically boot on startup</big></big></b><br />
<br />
This is very easy to do, and will add the login manager as a daemon that will automatically load upon the startup of your computer. All you need is root access.<br />
<br />
Just do the following:<br />
<br />
1. Login as root with <i>su</i>.<br />
<br />
2. Open the file <i>/etc/rc.conf</i> in your editor of choice.<br />
<br />
3. Scroll through the file until you see a line that looks similar to the following (it is most likely near the bottom):<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond)<br />
<br />
4. After the last listed program, add the login manager that you want to use, either KDM, GDM or XDM, such as the following:<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond kdm) #This would load KDM on startup<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond gdm) #This would load GDM on startup<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond xdm) #This would load XDM on startup<br />
<br />
5. Save the file, and exit the editor. The next time you reboot, the login manager should run. If it does not, make sure that your file is correct, and that the program is installed.<br />
<br />
<b>Extra Notes:</b>%%%<br />
* The KDM package is a part of the <em>kdebase</em> package. You can acquire it with this <em>pacman</em> command as <b>root</b>:<br />
<br />
<em>pacman -Syu kdebase</em><br />
<br />
<b><i>Alternate method</i></b>%%%<br />
While the above method will work, a side effect is that there will be no difference between run levels 3 and 5, and actually if you start up run level 5 you may have both xdm and kdm/gdm running, depending on what your <i>/etc/inittab</i> looks like. To avoid this, instead of the above, do the following:<br />
<br />
1. Login as root with <i>su</i>.%%%<br />
%%%<br />
2. Open <i>/etc/inittab</i> using an editor of your choice.%%%<br />
%%%<br />
3. Change the line<br />
<br />
<em>id:3:initdefault:</em><br />
<br />
to<br />
<br />
<em>id:5:initdefault:</em><br />
<br />
4. Make sure the line<br />
<br />
<em>x:5:respawn:/usr/X11R6/bin/xdm -nodaemon</em><br />
<br />
appears in the file.<br />
<br />
5. (Optional) If you just want xdm, skip this step. If you want gdm or kdm, change the line<br />
<br />
<em>x:5:respawn:/usr/X11R6/bin/xdm -nodaemon</em><br />
<br />
to one of<br />
<br />
<em>x:5:respawn:/opt/gnome/bin/gdm -nodaemon</em><br />
<br />
<em>x:5:respawn:/opt/kde/bin/kdm -nodaemon</em><br />
<br />
6. Save the file and exit the editor.<br />
<br />
That's it -- next time you boot, your chosen display manager will appear. To start it without rebooting, execute the following command (still as root):<br />
<br />
<em>/sbin/telinit 5</em><br />
<br />
If you ever need to stop X (to upgrade your video drivers, for example), you can execute (as root):<br />
<br />
<em>/sbin/telinit 3</em><br />
<br />
to get back to a console-based login. After you're done, you can telinit back to run level 5, no reboot necessary.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Display_manager&diff=559Display manager2005-07-24T00:08:27Z<p>Xerxes2: </p>
<hr />
<div>[[Category:BootProcess]]<br />
<br />
<b><big><big>Adding a login manager (KDM, GDM, or XDM) to automatically boot on startup</big></big></b><br />
<br />
This is very easy to do, and will add the login manager as a daemon that will automatically load upon the startup of your computer. All you need is root access.<br />
<br />
Just do the following:<br />
<br />
1. Login as root with <i>su</i>.<br />
<br />
2. Open the file <i>/etc/rc.conf</i> in your editor of choice.<br />
<br />
3. Scroll through the file until you see a line that looks similar to the following (it is most likely near the bottom):<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond)<br />
<br />
4. After the last listed program, add the login manager that you want to use, either KDM, GDM or XDM, such as the following:<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond kdm) #This would load KDM on startup<br />
<br />
DAEMONS=(syslogd klogd !pcmcia network netfs crond gdm) #This would load GDM on startup<br />
<br />
<em>DAEMONS=(syslogd klogd !pcmcia network netfs crond xdm) #This would load XDM on startup</em><br />
<br />
5. Save the file, and exit the editor. The next time you reboot, the login manager should run. If it does not, make sure that your file is correct, and that the program is installed.<br />
<br />
<b>Extra Notes:</b>%%%<br />
* The KDM package is a part of the <em>kdebase</em> package. You can acquire it with this <em>pacman</em> command as <b>root</b>:<br />
<br />
<em>pacman -Syu kdebase</em><br />
<br />
<b><i>Alternate method</i></b>%%%<br />
While the above method will work, a side effect is that there will be no difference between run levels 3 and 5, and actually if you start up run level 5 you may have both xdm and kdm/gdm running, depending on what your <i>/etc/inittab</i> looks like. To avoid this, instead of the above, do the following:<br />
<br />
1. Login as root with <i>su</i>.%%%<br />
%%%<br />
2. Open <i>/etc/inittab</i> using an editor of your choice.%%%<br />
%%%<br />
3. Change the line<br />
<br />
<em>id:3:initdefault:</em><br />
<br />
to<br />
<br />
<em>id:5:initdefault:</em><br />
<br />
4. Make sure the line<br />
<br />
<em>x:5:respawn:/usr/X11R6/bin/xdm -nodaemon</em><br />
<br />
appears in the file.<br />
<br />
5. (Optional) If you just want xdm, skip this step. If you want gdm or kdm, change the line<br />
<br />
<em>x:5:respawn:/usr/X11R6/bin/xdm -nodaemon</em><br />
<br />
to one of<br />
<br />
<em>x:5:respawn:/opt/gnome/bin/gdm -nodaemon</em><br />
<br />
<em>x:5:respawn:/opt/kde/bin/kdm -nodaemon</em><br />
<br />
6. Save the file and exit the editor.<br />
<br />
That's it -- next time you boot, your chosen display manager will appear. To start it without rebooting, execute the following command (still as root):<br />
<br />
<em>/sbin/telinit 5</em><br />
<br />
If you ever need to stop X (to upgrade your video drivers, for example), you can execute (as root):<br />
<br />
<em>/sbin/telinit 3</em><br />
<br />
to get back to a console-based login. After you're done, you can telinit back to run level 5, no reboot necessary.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Display_manager&diff=558Display manager2005-07-24T00:07:38Z<p>Xerxes2: </p>
<hr />
<div>[[Category:BootProcess]]<br />
<br />
<b><big><big>Adding a login manager (KDM, GDM, or XDM) to automatically boot on startup</big></big></b><br />
<br />
This is very easy to do, and will add the login manager as a daemon that will automatically load upon the startup of your computer. All you need is root access.<br />
<br />
Just do the following:<br />
<br />
1. Login as root with <i>su</i>.<br />
<br />
2. Open the file <i>/etc/rc.conf</i> in your editor of choice.<br />
<br />
3. Scroll through the file until you see a line that looks similar to the following (it is most likely near the bottom):<br />
<br />
<em>DAEMONS=(syslogd klogd !pcmcia network netfs crond)</em><br />
<br />
4. After the last listed program, add the login manager that you want to use, either KDM, GDM or XDM, such as the following:<br />
<br />
<em>DAEMONS=(syslogd klogd !pcmcia network netfs crond kdm) #This would load KDM on startup</em><br />
<br />
<em>DAEMONS=(syslogd klogd !pcmcia network netfs crond gdm) #This would load GDM on startup</em><br />
<br />
<em>DAEMONS=(syslogd klogd !pcmcia network netfs crond xdm) #This would load XDM on startup</em><br />
<br />
5. Save the file, and exit the editor. The next time you reboot, the login manager should run. If it does not, make sure that your file is correct, and that the program is installed.<br />
<br />
<b>Extra Notes:</b>%%%<br />
* The KDM package is a part of the <em>kdebase</em> package. You can acquire it with this <em>pacman</em> command as <b>root</b>:<br />
<br />
<em>pacman -Syu kdebase</em><br />
<br />
<b><i>Alternate method</i></b>%%%<br />
While the above method will work, a side effect is that there will be no difference between run levels 3 and 5, and actually if you start up run level 5 you may have both xdm and kdm/gdm running, depending on what your <i>/etc/inittab</i> looks like. To avoid this, instead of the above, do the following:<br />
<br />
1. Login as root with <i>su</i>.%%%<br />
%%%<br />
2. Open <i>/etc/inittab</i> using an editor of your choice.%%%<br />
%%%<br />
3. Change the line<br />
<br />
<em>id:3:initdefault:</em><br />
<br />
to<br />
<br />
<em>id:5:initdefault:</em><br />
<br />
4. Make sure the line<br />
<br />
<em>x:5:respawn:/usr/X11R6/bin/xdm -nodaemon</em><br />
<br />
appears in the file.<br />
<br />
5. (Optional) If you just want xdm, skip this step. If you want gdm or kdm, change the line<br />
<br />
<em>x:5:respawn:/usr/X11R6/bin/xdm -nodaemon</em><br />
<br />
to one of<br />
<br />
<em>x:5:respawn:/opt/gnome/bin/gdm -nodaemon</em><br />
<br />
<em>x:5:respawn:/opt/kde/bin/kdm -nodaemon</em><br />
<br />
6. Save the file and exit the editor.<br />
<br />
That's it -- next time you boot, your chosen display manager will appear. To start it without rebooting, execute the following command (still as root):<br />
<br />
<em>/sbin/telinit 5</em><br />
<br />
If you ever need to stop X (to upgrade your video drivers, for example), you can execute (as root):<br />
<br />
<em>/sbin/telinit 3</em><br />
<br />
to get back to a console-based login. After you're done, you can telinit back to run level 5, no reboot necessary.</div>Xerxes2https://wiki.archlinux.org/index.php?title=Display_manager&diff=557Display manager2005-07-24T00:06:44Z<p>Xerxes2: </p>
<hr />
<div>[[Category:BootProcess]]<br />
<br />
<b><big><big>Adding a login manager (KDM, GDM, or XDM) to automatically boot on startup</big></big></b><br />
<br />
This is very easy to do, and will add the login manager as a daemon that will automatically load upon the startup of your computer. All you need is root access.<br />
<br />
Just do the following:<br />
<br />
1. Login as root with <i>su</i>.<br><br><br />
<br />
2. Open the file <i>/etc/rc.conf</i> in your editor of choice.<br><br><br />
<br />
3. Scroll through the file until you see a line that looks similar to the following (it is most likely near the bottom):<br />
<br />
<em>DAEMONS=(syslogd klogd !pcmcia network netfs crond)</em><br />
<br />
4. After the last listed program, add the login manager that you want to use, either KDM, GDM or XDM, such as the following:<br />
<br />
<em>DAEMONS=(syslogd klogd !pcmcia network netfs crond kdm) #This would load KDM on startup</em><br />
<br />
<em>DAEMONS=(syslogd klogd !pcmcia network netfs crond gdm) #This would load GDM on startup</em><br />
<br />
<em>DAEMONS=(syslogd klogd !pcmcia network netfs crond xdm) #This would load XDM on startup</em><br />
<br />
5. Save the file, and exit the editor. The next time you reboot, the login manager should run. If it does not, make sure that your file is correct, and that the program is installed.<br />
<br />
<b>Extra Notes:</b>%%%<br />
* The KDM package is a part of the <em>kdebase</em> package. You can acquire it with this <em>pacman</em> command as <b>root</b>:<br />
<br />
<em>pacman -Syu kdebase</em><br />
<br />
<b><i>Alternate method</i></b>%%%<br />
While the above method will work, a side effect is that there will be no difference between run levels 3 and 5, and actually if you start up run level 5 you may have both xdm and kdm/gdm running, depending on what your <i>/etc/inittab</i> looks like. To avoid this, instead of the above, do the following:<br />
<br />
1. Login as root with <i>su</i>.%%%<br />
%%%<br />
2. Open <i>/etc/inittab</i> using an editor of your choice.%%%<br />
%%%<br />
3. Change the line<br />
<br />
<em>id:3:initdefault:</em><br />
<br />
to<br />
<br />
<em>id:5:initdefault:</em><br />
<br />
4. Make sure the line<br />
<br />
<em>x:5:respawn:/usr/X11R6/bin/xdm -nodaemon</em><br />
<br />
appears in the file.<br />
<br />
5. (Optional) If you just want xdm, skip this step. If you want gdm or kdm, change the line<br />
<br />
<em>x:5:respawn:/usr/X11R6/bin/xdm -nodaemon</em><br />
<br />
to one of<br />
<br />
<em>x:5:respawn:/opt/gnome/bin/gdm -nodaemon</em><br />
<br />
<em>x:5:respawn:/opt/kde/bin/kdm -nodaemon</em><br />
<br />
6. Save the file and exit the editor.<br />
<br />
That's it -- next time you boot, your chosen display manager will appear. To start it without rebooting, execute the following command (still as root):<br />
<br />
<em>/sbin/telinit 5</em><br />
<br />
If you ever need to stop X (to upgrade your video drivers, for example), you can execute (as root):<br />
<br />
<em>/sbin/telinit 3</em><br />
<br />
to get back to a console-based login. After you're done, you can telinit back to run level 5, no reboot necessary.</div>Xerxes2