[cmdopts] Convert /rawxml, fix /buffer arguments
authorMyhailo Danylenko <isbear@ukrpost.net>
Wed, 27 Feb 2013 23:35:53 +0200
changeset 73 feae79fcc408
parent 72 99d64d6ebe89
child 74 a879ea179877
[cmdopts] Convert /rawxml, fix /buffer arguments
cmdopts.diff
--- a/cmdopts.diff	Wed Feb 27 03:22:28 2013 +0200
+++ b/cmdopts.diff	Wed Feb 27 23:35:53 2013 +0200
@@ -25,10 +25,11 @@
     * -j(--jid), -g(--group), -n(--name)
   * /move uses parser
     * -j(--jid), -n(--name)
+  * /rawxml uses parser
 
 diff -r 92fa48ef53c9 mcabber/doc/help/cs/hlp_buffer.txt
 --- a/mcabber/doc/help/cs/hlp_buffer.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/cs/hlp_buffer.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/cs/hlp_buffer.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -25,7 +25,7 @@
   Přesune se o [n] řádků nahoru (výchozí: polovina obrazovky).
  /buffer down [n]
@@ -40,7 +41,7 @@
   Přesune se na procentuální pozici n%.
 diff -r 92fa48ef53c9 mcabber/doc/help/cs/hlp_del.txt
 --- a/mcabber/doc/help/cs/hlp_del.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/cs/hlp_del.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/cs/hlp_del.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,4 @@
  
 - /DEL
@@ -49,7 +50,7 @@
  Smaže aktuální kontakt ze seznamu kontaktů (rosteru) a zruší povolení oznamování o stavu daného kontaktu (autorizaci) na obou stranách.
 diff -r 92fa48ef53c9 mcabber/doc/help/cs/hlp_move.txt
 --- a/mcabber/doc/help/cs/hlp_move.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/cs/hlp_move.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/cs/hlp_move.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,5 +1,6 @@
  
 - /MOVE [skupina]
@@ -60,7 +61,7 @@
  Tip: V módu rozhovoru lze použít "/roster alternate" pro skok na přesunutý kontakt.
 diff -r 92fa48ef53c9 mcabber/doc/help/cs/hlp_rename.txt
 --- a/mcabber/doc/help/cs/hlp_rename.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/cs/hlp_rename.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/cs/hlp_rename.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,6 @@
  
 - /RENAME jméno
@@ -72,7 +73,7 @@
 +Optionally you can use one of --jid, --group or --name to select object, different from current.
 diff -r 92fa48ef53c9 mcabber/doc/help/de/hlp_buffer.txt
 --- a/mcabber/doc/help/de/hlp_buffer.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/de/hlp_buffer.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/de/hlp_buffer.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -25,7 +25,7 @@
   Scrollt den Puffer um n Zeilen hoch. Gibt man keine Zahl an, scrollt er um einen halben Bildschirm
  /buffer down [n]
@@ -84,7 +85,7 @@
   Springe zur Position "n" im Chatpuffer
 diff -r 92fa48ef53c9 mcabber/doc/help/de/hlp_del.txt
 --- a/mcabber/doc/help/de/hlp_del.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/de/hlp_del.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/de/hlp_del.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,4 @@
  
 - /DEL
@@ -93,7 +94,7 @@
  Löscht den gerade ausgewählten Buddy vom Roster. Außerdem werden die automatischen Presence Benachrichtigungen vom/zum Buddy gestoppt.
 diff -r 92fa48ef53c9 mcabber/doc/help/de/hlp_move.txt
 --- a/mcabber/doc/help/de/hlp_move.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/de/hlp_move.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/de/hlp_move.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,6 +1,7 @@
  
 - /MOVE [groupname]
@@ -105,7 +106,7 @@
  Tipp: Wenn der Chatmodus aktiviert ist, kannst du "/roster alternate" benutzen um zu dem gerade bewegten Buddy zu springen.
 diff -r 92fa48ef53c9 mcabber/doc/help/de/hlp_rename.txt
 --- a/mcabber/doc/help/de/hlp_rename.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/de/hlp_rename.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/de/hlp_rename.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,6 @@
  
 - /RENAME name
@@ -117,7 +118,7 @@
 +Optionally you can use one of --jid, --group or --name to select object, different from current.
 diff -r 92fa48ef53c9 mcabber/doc/help/en/hlp_buffer.txt
 --- a/mcabber/doc/help/en/hlp_buffer.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/en/hlp_buffer.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/en/hlp_buffer.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -25,7 +25,7 @@
   Scroll the buffer up [n] lines (default: half a screen)
  /buffer down [n]
@@ -129,7 +130,7 @@
   Jump to position %n of the buddy chat buffer
 diff -r 92fa48ef53c9 mcabber/doc/help/en/hlp_del.txt
 --- a/mcabber/doc/help/en/hlp_del.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/en/hlp_del.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/en/hlp_del.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,4 @@
  
 - /DEL
@@ -139,7 +140,7 @@
 +Delete the current buddy or one, specified with [jid] from our roster, unsubscribe from its presence notification and unsubscribe it from ours.
 diff -r 92fa48ef53c9 mcabber/doc/help/en/hlp_move.txt
 --- a/mcabber/doc/help/en/hlp_move.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/en/hlp_move.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/en/hlp_move.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,5 +1,6 @@
  
 - /MOVE [groupname]
@@ -150,7 +151,7 @@
  Tip: if the chatmode is enabled, you can use "/roster alternate" to jump to the moved buddy.
 diff -r 92fa48ef53c9 mcabber/doc/help/en/hlp_rename.txt
 --- a/mcabber/doc/help/en/hlp_rename.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/en/hlp_rename.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/en/hlp_rename.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,6 @@
  
 - /RENAME name
@@ -162,7 +163,7 @@
 +Optionally you can use one of --jid, --group or --name to select object, different from current.
 diff -r 92fa48ef53c9 mcabber/doc/help/fr/hlp_buffer.txt
 --- a/mcabber/doc/help/fr/hlp_buffer.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/fr/hlp_buffer.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/fr/hlp_buffer.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -25,7 +25,7 @@
   Défile vers le haut de [n] lignes (par défaut un demi écran)
  /buffer down [n]
@@ -174,7 +175,7 @@
   Va à la position n% du tampon
 diff -r 92fa48ef53c9 mcabber/doc/help/fr/hlp_del.txt
 --- a/mcabber/doc/help/fr/hlp_del.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/fr/hlp_del.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/fr/hlp_del.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,4 @@
  
 - /DEL
@@ -183,7 +184,7 @@
  Supprime le contact sélectionné du roster, supprime notre abonnement à ses notifications de présence et supprime son abonnement aux nôtres.
 diff -r 92fa48ef53c9 mcabber/doc/help/fr/hlp_move.txt
 --- a/mcabber/doc/help/fr/hlp_move.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/fr/hlp_move.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/fr/hlp_move.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,5 +1,6 @@
  
 - /MOVE [groupname]
@@ -194,7 +195,7 @@
  Astuce : si le mode discussion (chatmode) est activé, vous pouvez utiliser "/roster alternate" pour vous positionner sur le contact que vous venez de déplacer.
 diff -r 92fa48ef53c9 mcabber/doc/help/fr/hlp_rename.txt
 --- a/mcabber/doc/help/fr/hlp_rename.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/fr/hlp_rename.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/fr/hlp_rename.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,6 @@
  
 - /RENAME nom
@@ -206,7 +207,7 @@
 +Optionally you can use one of --jid, --group or --name to select object, different from current.
 diff -r 92fa48ef53c9 mcabber/doc/help/it/hlp_buffer.txt
 --- a/mcabber/doc/help/it/hlp_buffer.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/it/hlp_buffer.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/it/hlp_buffer.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -25,7 +25,7 @@
   Fa scorrere indietro il buffer di [n] linee (default: metà schermo)
  /buffer down [n]
@@ -218,7 +219,7 @@
   Salta alla posizione %n del buffer di chat corrente
 diff -r 92fa48ef53c9 mcabber/doc/help/it/hlp_del.txt
 --- a/mcabber/doc/help/it/hlp_del.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/it/hlp_del.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/it/hlp_del.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,4 @@
  
 - /DEL
@@ -227,7 +228,7 @@
  Elimina il contatto corrente dal roster, cancellando la sottoscrizione alle reciproche notifiche della propria presenza.
 diff -r 92fa48ef53c9 mcabber/doc/help/it/hlp_move.txt
 --- a/mcabber/doc/help/it/hlp_move.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/it/hlp_move.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/it/hlp_move.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,5 +1,6 @@
  
 - /MOVE [gruppo]
@@ -238,7 +239,7 @@
  Trucco: se la modalità chat è abilitata, puoi usare "/roster alternate" per spostarti sul contatto appena mosso.
 diff -r 92fa48ef53c9 mcabber/doc/help/it/hlp_rename.txt
 --- a/mcabber/doc/help/it/hlp_rename.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/it/hlp_rename.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/it/hlp_rename.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,6 @@
  
 - /RENAME nome
@@ -250,7 +251,7 @@
 +Optionally you can use one of --jid, --group or --name to select object, different from current.
 diff -r 92fa48ef53c9 mcabber/doc/help/nl/hlp_buffer.txt
 --- a/mcabber/doc/help/nl/hlp_buffer.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/nl/hlp_buffer.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/nl/hlp_buffer.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -25,7 +25,7 @@
   Scroll de buffer [n] regels omhoog (standaard: een half scherm)
  /buffer down [n]
@@ -262,7 +263,7 @@
   Spring naar positie %n in de buddy chat buffer
 diff -r 92fa48ef53c9 mcabber/doc/help/nl/hlp_del.txt
 --- a/mcabber/doc/help/nl/hlp_del.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/nl/hlp_del.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/nl/hlp_del.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,4 @@
  
 - /DEL
@@ -271,7 +272,7 @@
  Verwijder de actieve buddy uit ons roster, en zet het wederzijds toezenden van status veranderingen stop.
 diff -r 92fa48ef53c9 mcabber/doc/help/nl/hlp_move.txt
 --- a/mcabber/doc/help/nl/hlp_move.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/nl/hlp_move.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/nl/hlp_move.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,5 +1,6 @@
  
 - /MOVE [groepsnaam]
@@ -282,7 +283,7 @@
  Tip: indien chatmode actief is, kun je "/roster alternate" gebruiken om direct naar de verplaatste buddy te springen.
 diff -r 92fa48ef53c9 mcabber/doc/help/nl/hlp_rename.txt
 --- a/mcabber/doc/help/nl/hlp_rename.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/nl/hlp_rename.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/nl/hlp_rename.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,6 @@
  
 - /RENAME naam
@@ -294,7 +295,7 @@
 +Optionally you can use one of --jid, --group or --name to select object, different from current.
 diff -r 92fa48ef53c9 mcabber/doc/help/pl/hlp_del.txt
 --- a/mcabber/doc/help/pl/hlp_del.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/pl/hlp_del.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/pl/hlp_del.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,4 @@
  
 - /DEL
@@ -303,7 +304,7 @@
  Usuwa aktualnie zaznaczoną osobę z rostera, usuwa subskrypcję powiadomienia dostępności u danej osoby oraz u nas.
 diff -r 92fa48ef53c9 mcabber/doc/help/pl/hlp_move.txt
 --- a/mcabber/doc/help/pl/hlp_move.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/pl/hlp_move.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/pl/hlp_move.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,5 +1,6 @@
  
 - /MOVE [nazwa grupy]
@@ -314,7 +315,7 @@
  Podpowiedź: jeśli jest włączony tryb czatu, możesz użyć "/roster alternate" aby skoczyć do przeniesionej osoby.
 diff -r 92fa48ef53c9 mcabber/doc/help/pl/hlp_rename.txt
 --- a/mcabber/doc/help/pl/hlp_rename.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/pl/hlp_rename.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/pl/hlp_rename.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,6 @@
  
 - /RENAME nazwa
@@ -326,7 +327,7 @@
 +Optionally you can use one of --jid, --group or --name to select object, different from current.
 diff -r 92fa48ef53c9 mcabber/doc/help/ru/hlp_buffer.txt
 --- a/mcabber/doc/help/ru/hlp_buffer.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/ru/hlp_buffer.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/ru/hlp_buffer.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -25,7 +25,7 @@
   Перемещает на [n] строк вверх в буфере (истории переписки) (по умолчанию: половина экрана)
  /buffer down [n]
@@ -338,7 +339,7 @@
   Перемещает на позицию %n в текущем буфере (истории переписки)
 diff -r 92fa48ef53c9 mcabber/doc/help/ru/hlp_del.txt
 --- a/mcabber/doc/help/ru/hlp_del.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/ru/hlp_del.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/ru/hlp_del.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,4 @@
  
 - /DEL
@@ -348,7 +349,7 @@
 +Удаляет текущего пользователя (или указанного с помощью jid) из списка контактов, отключает уведомления о его статусе и отключает уведомление пользователя о вашем статусе.
 diff -r 92fa48ef53c9 mcabber/doc/help/ru/hlp_move.txt
 --- a/mcabber/doc/help/ru/hlp_move.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/ru/hlp_move.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/ru/hlp_move.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,6 +1,7 @@
  
 - /MOVE [groupname]
@@ -360,7 +361,7 @@
  
 diff -r 92fa48ef53c9 mcabber/doc/help/ru/hlp_rename.txt
 --- a/mcabber/doc/help/ru/hlp_rename.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/ru/hlp_rename.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/ru/hlp_rename.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,6 @@
  
 - /RENAME name
@@ -372,7 +373,7 @@
 +Для указания обьекта, отличного от текущего, можно использовать опции --jid, --group и --name.
 diff -r 92fa48ef53c9 mcabber/doc/help/uk/hlp_buffer.txt
 --- a/mcabber/doc/help/uk/hlp_buffer.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/uk/hlp_buffer.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/uk/hlp_buffer.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -25,7 +25,7 @@
   Посунути буфер вверх на n рядків (якщо не вказано - пів екрану).
  /buffer down [n]
@@ -384,7 +385,7 @@
   Перейти до вказаної у процентах позиції.
 diff -r 92fa48ef53c9 mcabber/doc/help/uk/hlp_del.txt
 --- a/mcabber/doc/help/uk/hlp_del.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/uk/hlp_del.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/uk/hlp_del.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,4 @@
  
 - /DEL
@@ -394,7 +395,7 @@
 +Потерти поточний контакт (або контакт, що має вказаний jid) зі списку. Також відписатися від його сповіщень про статус і відписати його від ваших.
 diff -r 92fa48ef53c9 mcabber/doc/help/uk/hlp_move.txt
 --- a/mcabber/doc/help/uk/hlp_move.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/uk/hlp_move.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/uk/hlp_move.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,5 +1,6 @@
  
 - /MOVE [група]
@@ -406,7 +407,7 @@
  Примітка: в режимі розмови можна використати "/roster alternate", щоб перейти до нового місця контакту контакту.
 diff -r 92fa48ef53c9 mcabber/doc/help/uk/hlp_rename.txt
 --- a/mcabber/doc/help/uk/hlp_rename.txt	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/doc/help/uk/hlp_rename.txt	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/doc/help/uk/hlp_rename.txt	Wed Feb 27 23:34:50 2013 +0200
 @@ -1,4 +1,6 @@
  
 - /RENAME ім'я
@@ -417,7 +418,7 @@
 +Опції --jid, --group та --name дозволяють перейменовувати об’єкти, відмінні від поточного.
 diff -r 92fa48ef53c9 mcabber/mcabber/commands.c
 --- a/mcabber/mcabber/commands.c	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/commands.c	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/mcabber/commands.c	Wed Feb 27 23:34:50 2013 +0200
 @@ -502,7 +502,9 @@
    if (!iscmd && scr_get_multimode() == 2
        && (strncasecmp(xpline, mkcmdstr("msay "), strlen(mkcmdstr("msay "))))) {
@@ -553,26 +554,44 @@
    }
  
 -  if (!strcasecmp(subcmd, "top")) {
-+  if (subcmd == roster_scmd_top) {
++  if (subcmd == roster_scmd_bottom) {
++    scr_roster_bottom();
++    update_roster = TRUE;
++  } else if (subcmd == roster_scmd_top) {
      scr_roster_top();
      update_roster = TRUE;
 -  } else if (!strcasecmp(subcmd, "bottom")) {
-+  } else if (subcmd == roster_scmd_bottom) {
-     scr_roster_bottom();
+-    scr_roster_bottom();
++  } else if (subcmd == roster_scmd_up) {
++    roster_updown(-1, arg);
++  } else if (subcmd == roster_scmd_down) {
++    roster_updown(1, arg);
++  } else if (subcmd == roster_scmd_group_prev) {
++    scr_roster_prev_group();
++  } else if (subcmd == roster_scmd_group_next) {
++    scr_roster_next_group();
++  } else if (subcmd == roster_scmd_alternate) {
++    scr_roster_jump_alternate();
++  } else if (subcmd == roster_scmd_unread_first) {
++    scr_roster_unread_message(0);
++  } else if (subcmd == roster_scmd_unread_next) {
++    scr_roster_unread_message(1);
++  } else if (subcmd == roster_scmd_search) {
++    scr_roster_search(arg);
      update_roster = TRUE;
 -  } else if (!strcasecmp(subcmd, "hide")) {
-+  } else if (subcmd == roster_scmd_hide) {
-     scr_roster_visibility(0);
+-    scr_roster_visibility(0);
 -  } else if (!strcasecmp(subcmd, "show")) {
-+  } else if (subcmd == roster_scmd_show) {
-     scr_roster_visibility(1);
+-    scr_roster_visibility(1);
 -  } else if (!strcasecmp(subcmd, "toggle")) {
-+  } else if (subcmd == roster_scmd_toggle) {
-     scr_roster_visibility(-1);
+-    scr_roster_visibility(-1);
 -  } else if (!strcasecmp(subcmd, "hide_offline")) {
++  } else if (subcmd == roster_scmd_display) {
++    scr_roster_display(arg);
 +  } else if (subcmd == roster_scmd_hide_offline) {
      buddylist_set_hide_offline_buddies(TRUE);
-     if (current_buddy)
+-    if (current_buddy)
++    if (current_buddy) // XXX
        buddylist_build();
      update_roster = TRUE;
 -  } else if (!strcasecmp(subcmd, "show_offline")) {
@@ -586,8 +605,7 @@
      buddylist_build();
      update_roster = TRUE;
 -  } else if (!strcasecmp(subcmd, "display")) {
-+  } else if (subcmd == roster_scmd_display) {
-     scr_roster_display(arg);
+-    scr_roster_display(arg);
 -  } else if (!strcasecmp(subcmd, "item_lock")) {
 +  } else if (subcmd == roster_scmd_item_lock) {
      roster_buddylock(arg, 1);
@@ -598,14 +616,11 @@
 +  } else if (subcmd == roster_scmd_item_toggle_lock) {
      roster_buddylock(arg, -1);
 -  } else if (!strcasecmp(subcmd, "unread_first")) {
-+  } else if (subcmd == roster_scmd_unread_first) {
-     scr_roster_unread_message(0);
+-    scr_roster_unread_message(0);
 -  } else if (!strcasecmp(subcmd, "unread_next")) {
-+  } else if (subcmd == roster_scmd_unread_next) {
-     scr_roster_unread_message(1);
+-    scr_roster_unread_message(1);
 -  } else if (!strcasecmp(subcmd, "alternate")) {
-+  } else if (subcmd == roster_scmd_alternate) {
-     scr_roster_jump_alternate();
+-    scr_roster_jump_alternate();
 -  } else if (!strncasecmp(subcmd, "search", 6)) {
 -    strip_arg_special_chars(arg);
 -    if (!arg || !*arg) {
@@ -613,21 +628,16 @@
 -      free_arg_lst(paramlst);
 -      return;
 -    }
-+  } else if (subcmd == roster_scmd_search) {
-     scr_roster_search(arg);
-     update_roster = TRUE;
+-    scr_roster_search(arg);
+-    update_roster = TRUE;
 -  } else if (!strcasecmp(subcmd, "up")) {
-+  } else if (subcmd == roster_scmd_up) {
-     roster_updown(-1, arg);
+-    roster_updown(-1, arg);
 -  } else if (!strcasecmp(subcmd, "down")) {
-+  } else if (subcmd == roster_scmd_down) {
-     roster_updown(1, arg);
+-    roster_updown(1, arg);
 -  } else if (!strcasecmp(subcmd, "group_prev")) {
-+  } else if (subcmd == roster_scmd_group_prev) {
-     scr_roster_prev_group();
+-    scr_roster_prev_group();
 -  } else if (!strcasecmp(subcmd, "group_next")) {
-+  } else if (subcmd == roster_scmd_group_next) {
-     scr_roster_next_group();
+-    scr_roster_next_group();
 -  } else if (!strcasecmp(subcmd, "note")) {
 +  } else if (subcmd == roster_scmd_note) {
      roster_note(arg);
@@ -635,11 +645,17 @@
 +  } else if (subcmd == roster_scmd_resource_lock) {
      roster_resourcelock(arg, TRUE);
 -  } else if (!strcasecmp(subcmd, "resource_unlock")) {
-+  } else { // roster_scmd_resource_unlock
++  } else if (subcmd == roster_scmd_resource_unlock) {
      roster_resourcelock(arg, FALSE);
 -  } else
 -    scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!");
 -  free_arg_lst(paramlst);
++  } else if (subcmd == roster_scmd_hide) {
++    scr_roster_visibility(0);
++  } else if (subcmd == roster_scmd_show) {
++    scr_roster_visibility(1);
++  } else { // roster_scmd_toggle
++    scr_roster_visibility(-1);
 +  }
 +
 +  cmdopts_free(&options);
@@ -1891,12 +1907,12 @@
 +      { "bottom", NULL, NULL, NULL, (gpointer)buffer_scmd_bottom, 0 },
 +      { "up", NULL,
 +        (cmdarg_t[1]){
-+          { CMDOPT_LAST, { .arg = "1" } }, // lines
++          { CMDOPT_LAST, { .arg = NULL } }, // lines
 +        },
 +        NULL, (gpointer)buffer_scmd_up, 0 },
 +      { "down", NULL,
 +        (cmdarg_t[1]){
-+          { CMDOPT_LAST, { .arg = "1" } }, // lines
++          { CMDOPT_LAST, { .arg = NULL } }, // lines
 +        },
 +        NULL, (gpointer)buffer_scmd_down, 0 },
 +      { "date", NULL,
@@ -1959,42 +1975,42 @@
 -  if (*arg1 && arg2 && *arg2) {     // Two values
 -    scr_LogPrint(LPRINT_NORMAL, "Wrong parameters.");
 -    return;
-+  if (subcmd == buffer_scmd_top) {
++  if (subcmd == buffer_scmd_close) {
++    scr_buffer_purge(1, options.cmds[0].args[0].value.arg);
++  } else if (subcmd == buffer_scmd_close_all) {
++    scr_buffer_purge_all(1);
++  } else if (subcmd == buffer_scmd_clear) {
++    scr_buffer_clear();
++  } else if (subcmd == buffer_scmd_purge) {
++    scr_buffer_purge(0, options.cmds[3].args[0].value.arg);
++  } else if (subcmd == buffer_scmd_list) {
++    scr_buffer_list();
++  } else if (subcmd == buffer_scmd_top) {
 +    scr_buffer_top_bottom(-1);
 +  } else if (subcmd == buffer_scmd_bottom) {
 +    scr_buffer_top_bottom(1);
-+  } else if (subcmd == buffer_scmd_clear) {
-+    scr_buffer_clear();
-+  } else if (subcmd == buffer_scmd_close) {
-+    scr_buffer_purge(1, options.cmds[0].args[0].value.arg);
-+  } else if (subcmd == buffer_scmd_close_all) {
-+    scr_buffer_purge_all(1);
-+  } else if (subcmd == buffer_scmd_purge) {
-+    scr_buffer_purge(0, options.cmds[3].args[0].value.arg);
++  } else if (subcmd == buffer_scmd_up) {
++    buffer_updown(-1, options.cmds[7].args[0].value.arg);
++  } else if (subcmd == buffer_scmd_down) {
++    buffer_updown(1, options.cmds[8].args[0].value.arg);
++  } else if (subcmd == buffer_scmd_date) {
++    buffer_date(options.cmds[9].args[0].value.arg);
++  } else if (subcmd == buffer_scmd_percent) {
++    scr_buffer_percent(atoi(options.cmds[10].args[0].value.arg));
++  } else if (subcmd == buffer_scmd_readmark) {
++    scr_buffer_jump_readmark();
++  } else if (subcmd == buffer_scmd_search_backward) {
++    scr_buffer_search(-1, options.cmds[12].args[0].value.arg);
++  } else if (subcmd == buffer_scmd_search_forward) {
++    scr_buffer_search(1, options.cmds[13].args[0].value.arg);
 +  } else if (subcmd == buffer_scmd_scroll_lock) {
 +    scr_buffer_scroll_lock(1);
 +  } else if (subcmd == buffer_scmd_scroll_unlock) {
 +    scr_buffer_scroll_lock(0);
 +  } else if (subcmd == buffer_scmd_scroll_toggle) {
 +    scr_buffer_scroll_lock(-1);
-+  } else if (subcmd == buffer_scmd_up) {
-+    buffer_updown(-1, options.cmds[6].args[0].value.arg);
-+  } else if (subcmd == buffer_scmd_down) {
-+    buffer_updown(1, options.cmds[7].args[0].value.arg);
-+  } else if (subcmd == buffer_scmd_search_backward) {
-+    scr_buffer_search(-1, options.cmds[11].args[0].value.arg);
-+  } else if (subcmd == buffer_scmd_search_forward) {
-+    scr_buffer_search(1, options.cmds[12].args[0].value.arg);
-+  } else if (subcmd == buffer_scmd_date) {
-+    buffer_date(options.cmds[8].args[0].value.arg);
-+  } else if (subcmd == buffer_scmd_percent) {
-+    scr_buffer_percent(atoi(options.cmds[9].args[0].value.arg));
-+  } else if (subcmd == buffer_scmd_save) {
++  } else { // buffer_scmd_save
 +    scr_buffer_dump(options.cmds[17].args[0].value.arg);
-+  } else if (subcmd == buffer_scmd_list) {
-+    scr_buffer_list();
-+  } else { // buffer_scmd_readmark
-+    scr_buffer_jump_readmark();
    }
  
 -  scr_buffer_percent(atoi((*arg1 ? arg1 : arg2)));
@@ -2160,7 +2176,7 @@
 +      { CMDOPT_LAST,   'j', "jid",   { .opt = "." } },
 +    },
 +    (cmdarg_t[1]){
-+      { CMDOPT_CATCHALL | CMDOPT_LAST, { .arg = NULL } }, // new name
++      { CMDOPT_CATCHALL | CMDOPT_LAST, { .arg = "" } }, // new name
 +    },
 +    NULL,
 +  };
@@ -2405,7 +2421,78 @@
    update_roster = TRUE;
  }
  
-@@ -2874,7 +3100,7 @@
+@@ -2468,50 +2694,33 @@
+ 
+ static void do_rawxml(char *arg)
+ {
+-  char **paramlst;
+-  char *subcmd;
++  cmdopts_t options = {
++    "rawxml",
++    NULL,
++    (cmdarg_t[1]){
++      { CMDOPT_REQUIRED | CMDOPT_SUBCOMMAND | CMDOPT_LAST, { .cmd = NULL } },
++    },
++    (cmdopts_t[1]){
++      { "send", NULL,
++        (cmdarg_t[1]){
++          { CMDOPT_REQUIRED | CMDOPT_CATCHALL | CMDOPT_PLAIN | CMDOPT_LAST,
++            { .arg = NULL } },
++        },
++        NULL },
++    },
++  };
+ 
+   if (!xmpp_is_online()) {
+     scr_LogPrint(LPRINT_NORMAL, "You are not connected.");
+     return;
+   }
+ 
+-  paramlst = split_arg(arg, 2, 1); // subcmd, arg
+-  subcmd = *paramlst;
+-  arg = *(paramlst+1);
+-
+-  if (!subcmd || !*subcmd) {
+-    scr_LogPrint(LPRINT_NORMAL, "Please read the manual page"
+-                 " before using /rawxml :-)");
+-    free_arg_lst(paramlst);
++  if (cmdopts_parse(arg, &options))
+     return;
+-  }
+-
+-  if (!strcasecmp(subcmd, "send"))  {
+-    gchar *buffer;
+-
+-    if (!subcmd || !*subcmd) {
+-      scr_LogPrint(LPRINT_NORMAL, "Missing parameter.");
+-      free_arg_lst(paramlst);
+-      return;
+-    }
+-
+-    // We don't strip_arg_special_chars() here, because it would be a pain for
+-    // the user to escape quotes in a XML stream...
+-
+-    buffer = to_utf8(arg);
+-    if (buffer) {
+-      scr_LogPrint(LPRINT_NORMAL, "Sending XML string");
+-      lm_connection_send_raw(lconnection, buffer, NULL);
+-      g_free(buffer);
+-    } else {
+-      scr_LogPrint(LPRINT_NORMAL, "Conversion error in XML string.");
+-    }
+-  } else {
+-    scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!");
+-  }
+-
+-  free_arg_lst(paramlst);
++
++  scr_LogPrint(LPRINT_NORMAL, "Sending XML string");
++  lm_connection_send_raw(lconnection, options.cmds[0].args[0].value.arg, NULL);
++  cmdopts_free(&options);
+ }
+ 
+ //  check_room_subcommand(arg, param_needed, buddy_must_be_a_room)
+@@ -2874,7 +3083,7 @@
    fjid_utf8 = g_strdup_printf("%s/%s", buddy_getjid(bud), nick_utf8);
    g_free (nick_utf8);
    msg = to_utf8(arg);
@@ -2414,7 +2501,7 @@
    g_free(fjid_utf8);
    g_free(msg);
    free_arg_lst(paramlst);
-@@ -3347,7 +3573,7 @@
+@@ -3347,7 +3556,7 @@
        cmd_room_leave(bud, arg);
    } else if (!strcasecmp(subcmd, "names"))  {
      if ((arg = check_room_subcommand(arg, FALSE, bud)) != NULL)
@@ -2425,7 +2512,7 @@
        room_nick(bud, arg);
 diff -r 92fa48ef53c9 mcabber/mcabber/commands.h
 --- a/mcabber/mcabber/commands.h	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/commands.h	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/mcabber/commands.h	Wed Feb 27 23:34:50 2013 +0200
 @@ -14,6 +14,12 @@
    gpointer userdata;
  } cmd;
@@ -2453,7 +2540,7 @@
  
 diff -r 92fa48ef53c9 mcabber/mcabber/roster.c
 --- a/mcabber/mcabber/roster.c	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/roster.c	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/mcabber/roster.c	Wed Feb 27 23:34:50 2013 +0200
 @@ -1586,13 +1586,14 @@
  // Look for a buddy whose name or jid contains string.
  // Search begins at current_buddy; if no match is found in the the buddylist,
@@ -2494,7 +2581,7 @@
      }
 diff -r 92fa48ef53c9 mcabber/mcabber/utils.c
 --- a/mcabber/mcabber/utils.c	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/utils.c	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/mcabber/utils.c	Wed Feb 27 23:34:50 2013 +0200
 @@ -555,6 +555,318 @@
      *str = tolower(*str);
  }
@@ -2816,8 +2903,8 @@
  // Only quotes need a backslash
 diff -r 92fa48ef53c9 mcabber/mcabber/utils.h
 --- a/mcabber/mcabber/utils.h	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/utils.h	Wed Feb 27 03:19:07 2013 +0200
-@@ -43,6 +43,97 @@
++++ b/mcabber/mcabber/utils.h	Wed Feb 27 23:34:50 2013 +0200
+@@ -43,6 +43,125 @@
  char **split_arg(const char *arg, unsigned int n, int dontstriplast);
  void free_arg_lst(char **arglst);
  
@@ -2862,17 +2949,45 @@
 +// Implicitly last argument.
 +#define CMDOPT_SUBCOMMAND ( 1<<5 )
 +
-+// FURTHER TODO:
-+// Allow to specify catchall argument in the middle of string (requires some reverse parser)?
-+// Better error messages (caller frees them)
-+// --help generates error with short usage, based on info in options struct
++// TODO:
++// * Options/arguments value should become 'default' field, value field will go
++//   later, so that user will not need to initialize it.
++// * Clustering of options/switches
++// * --help
++//   * Add argument names for --help.
++//   * Argument or command/subcommand descriptions for --help?
++//   * Or maybe just do "/help foo"?
++// * Add argument type field and subsystem to check values. Uses so far:
++//   - fjid (handle . and ./resource, perform check_jid_syntax())
++//   - bjid (handle ., strip resource, perform check_jid_syntax())
++//   - bjid in roster/buddylist (result - buddy?)
++//   - name in roster/buddylist (result - buddy?)
++//   - group in roster (result - buddy?)
++//   - other non-space string (strip trailing/starting spaces)
++//     - statusmask (restrictive)
++//     - jidmask (non-restrictive)
++//     - search string
++//     - rosternote
++//     - color (restrictive, semi-defined list)
++//     - nick (non-restrictive)
++//     - defined lists (restrictive)
++//     - date (restrictive)
++//     - percent (numerical, restrictive)
++//   - number (result - int)
++//   - filename (expand_filename(), g_utf8_to_filename()?)
++//   - custom (maybe some helpers for constant stringlists)
++//   - text message (complete nicks in rooms)
++// * Add non-argument checks for commands/subcommands:
++//   - xmpp_is_online()
++//   - current_buddy
++// * --help generates error with short usage, based on info in options struct.
++// * Subcommands with fallback to argument?
++// * [+foo|-foo] support?
++// * Integrate with commands
++// * Integrate with completion
++// * Usable subsystem for completion, based on user-supplied argument types
++// * Update docs above
 +
-+// thoughts about future:
-+// integration with command structure
-+// cmdopt/cmdarg struct contains argument type, that implies completion id and argument correctness checks
-+// cmdopt/cmdarg struct contains default value
-+// when building completion for command, we allow options (if not before --)
-+//
 +// so, the process of command execution would look like:
 +// - we walk through the options, set default values
 +// - we parse argument string, populating options  - on this or on next step
@@ -2917,7 +3032,7 @@
  char *ut_unescape_tabs_cr(const char *text);
 diff -r 92fa48ef53c9 mcabber/mcabber/xmpp_iq.c
 --- a/mcabber/mcabber/xmpp_iq.c	Sun Jan 27 00:40:37 2013 +0200
-+++ b/mcabber/mcabber/xmpp_iq.c	Wed Feb 27 03:19:07 2013 +0200
++++ b/mcabber/mcabber/xmpp_iq.c	Wed Feb 27 23:34:50 2013 +0200
 @@ -289,10 +289,7 @@
        if (value) {
          for (s = adhoc_status_list; !s->name || strcmp(s->name, value); s++);