<!--
    SPDX-FileCopyrightText: 2000-2003 Shie Erlich <erlich@users.sourceforge.net>
    SPDX-FileCopyrightText: 2000-2003 Rafi Yanai <yanai@users.sourceforge.net>
    SPDX-FileCopyrightText: 2004-2010 Frank Schoolmeesters <codeknight@users.sourceforge.net>
    SPDX-FileCopyrightText: 2000-2022 Krusader Krew <https://krusader.org>
-->
<sect1 id="useractions">
  <title>UserActions</title>
  <indexterm>
    <primary>UserActions</primary>
  </indexterm>
  <!-- Thanks to Jonas Bar -->
  <para>With ActionMan you can set up, configure and manage
  UserActions. Some general settings are configured with 
  <link linkend="konfig-useractions">Konfigurator</link>. With
  UserActions you can perform actions on files in the panel or to
  access &krusader; internal functions with parameters
  directly using placeholders. The actions integrate seamlessly
  into &plasma; action system, which means that the
  standard Edit Toolbar and Edit Shortcut dialogs will show
  UserActions, too. The UserActions are stored in 
  <filename>
  ~/.local/share/krusader/useractions.xml</filename> or <filename>krusader/useraction.xml</filename> in the folder which can be determined using the <userinput>qtpaths --paths GenericDataLocation</userinput> command.
  Several 
  <link linkend="useraction-xml">examples</link> are included in the
  documentation. UserActions can be edited / added / imported /
  exported by using ActionMan. The default UserActions are stored
  in 
  <filename>
  /usr/share/krusader/useraction-examples.xml</filename>.
  UserActions can appear nearly everywhere where <quote>normal</quote> KActions
  can be placed. The actions can even be placed in the menu bar, but for that the 
  <filename>krusaderui.rc</filename> file must be edited. A few
  examples:</para> 
  <itemizedlist>
    <listitem>
      <para>
        <link linkend="useractions-menu">Useractions Menu</link>
      </para>
    </listitem>
    <listitem>
      <para><link linkend="useractions">User Menu</link></para>
    </listitem>
    <listitem>
      <para><link linkend="actions_toolbar">Actions Toolbar</link></para>
    </listitem>
    <listitem>
      <para>right click menus</para>
    </listitem>
    <listitem>
      <para>&etc;</para>
    </listitem>
  </itemizedlist>
  <para>&krusader;'s UserActions tool is very
  powerful and customizable if you are familiar with writing
  UserActions in general.</para>
  <tip>
    <para>Several UserActions are provided by default. Please 
    <link linkend="help_krusader">upload your favorite
    UserActions</link> so that they become available for the
    &krusader; community. Thanks!<!-- We provide also an
<ulink url="https://krusader.org/phpBB/viewforum.php?f=11">UserActions Forum</ulink>.--></para>
  </tip>
  <figure id="screenshot-actionman" float="1">
    <title>ActionMan</title>
    <mediaobject>
      <imageobject>
        <imagedata fileref="actionman.png"></imagedata>
      </imageobject>
      <textobject>
        <phrase>ActionMan</phrase>
      </textobject>
    </mediaobject>
  </figure>
  <para>Basically, UserActions are a method to call external
  programs with variable parameters. For example, you could have a
  UserAction with the following 
  <command>xmms 
  <option>--enqueue %aList("Selected")%</option></command> to
  enqueue all selected items of the active panel to the current
  instance of xmms. Additionally, there is limited access to
  &krusader; internal functions requiring parameters.
  For example, 
  <command>%aPanelSize("80")%</command> will set the width of the
  active panel to 80% of the &krusader; mainwindow.
  Since the parameter of placeholders can contain other
  placeholders, few scripts are possible.
  </para>
  <para>
    <emphasis role="bold">Managing UserActions</emphasis>
  </para>
  <para>Open Konfigurator and choose <menuchoice><guimenu>User Actions</guimenu>
  <guimenuitem>Start ActionMan</guimenuitem></menuchoice>, in which you can add, edit, remove, import and export
  UserActions.</para> 
  <itemizedlist>
    <listitem>
      <para>
      <guimenuitem>Add Action</guimenuitem>: If you add an new
      action, you get an empty input mask where you can enter all
      the properties you desire. The action will be added as soon
      as you press 
      <guimenuitem>Apply</guimenuitem>. Afterwards, the name is shown
      in the list on the left.</para>
    </listitem>
    <listitem>
      <para>To edit a UserAction: Select the UserAction on the
      left. Then choose it if you want to edit its properties. The
      changes will only take effect when you press 
      <guimenuitem>Apply</guimenuitem>.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>To remove a UserAction</guimenuitem>: Select the
      UserAction on the left and click the <inlinemediaobject>
<imageobject> <imagedata fileref="Icon-edit-delete.png"
format="PNG"/> </imageobject> </inlinemediaobject>button.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>To import a UserAction</guimenuitem>: If you
      import some actions, they will be automatically added to your
      list. If there are name conflicts (the names have to be
      unique because these are the ID for &plasma; action
      system), you are asked to resolve them. For this, the list on
      the left will only show the actions where conflicts exist.
      You can now give them new names or remove them.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Export Action</guimenuitem>: If you export a
      UserAction you have to give a filename in which to store it.
      If it does not exist, it will be created. If the file already
      contains UserActions, the action you are exporting will be
      added to that file.</para>
    </listitem>
  </itemizedlist>
  <para>All actions you have defined are now shown in the
  user menu and in &plasma; dialogs for changing shortcuts
  and managing the toolbar. In addition, all actions available for
  the current item will also show up in the right click
  menu.</para>
  <para>
    <emphasis role="bold">Basic Properties</emphasis>
  </para>
  <para>
  <guimenuitem>Identifier</guimenuitem>, <guimenuitem>Title</guimenuitem>
  and <guimenuitem>Command line</guimenuitem> are always required, all the other properties
  are optional.</para> 
  <itemizedlist>
    <listitem>
      <para>
      <guimenuitem>Identifier</guimenuitem>: A unique name of
      the UserAction, used to identify it for &plasma;
      action system.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Icon button</guimenuitem>: The icon for your
      UserAction.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Category</guimenuitem>: Categories are used for a
      better overview. They appear as submenu items in
      the <guimenuitem>Useractions</guimenuitem> menu.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Title</guimenuitem>: The title displayed in
      the menus or dialogs.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Tooltip</guimenuitem>: A tooltip for your
      UserAction, &eg; displayed in the toolbar on
      mouseover.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Description</guimenuitem>: A description of
      what the UserAction does. This is also displayed as 
      <guimenuitem>What's This</guimenuitem> if you 
      <keycombo action="simul">&Shift;
      <keycap>F1</keycap></keycombo> click on your
      UserAction.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Command</guimenuitem>: The command which
      will be executed. You can add placeholder using a &GUI; with
      the <guibutton>add</guibutton> button.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Workdir</guimenuitem>: The working folder
      for the command which will be executed.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Execution mode</guimenuitem>:</para>
      <itemizedlist>
        <listitem>
          <para>
          <guimenuitem>Normal</guimenuitem>: Normal execution
          mode.</para>
        </listitem>
        <listitem>
          <para>
          <guimenuitem>Run in terminal</guimenuitem>: Runs the
          command in the terminal.</para>
        </listitem>
        <listitem>
          <para>
          <guimenuitem>Run in embedded terminal emulator</guimenuitem>: Runs the
          command in the embedded terminal.</para>
        </listitem>
        <listitem>
          <para>
          <guimenuitem>Collect output</guimenuitem>: Collects the
          output of the executed program in a &GUI;
          window.</para>
        </listitem>
        <listitem>
          <para>
          <guimenuitem>Separate standard error</guimenuitem>:
          When <quote>Collect output</quote> is used the stdout and stderr are
          separately collected.</para>
        </listitem>
      </itemizedlist>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Command accepts</guimenuitem>:</para>
      <itemizedlist>
        <listitem>
          <para>
          <guimenuitem>Local files only (no &URL;s)</guimenuitem>: Tells
          the placeholder it should return local addresses.</para>
        </listitem>
        <listitem>
          <para>
          <guimenuitem>&URL;s (remote and local)</guimenuitem>:
          Tells the placeholder it should return
          &URL;s.</para>
        </listitem>
      </itemizedlist>
    </listitem>
    <!--    Not yet implemented, but will be after 1.50 stable is released
        <listitem><para><guimenuitem>On multiple selection</guimenuitem>:  </para>
        <itemizedlist>
   <listitem><para><guimenuitem>Separate call for each file</guimenuitem>: executes the command for each selected file.
             </para></listitem>
         </itemizedlist>
      </listitem> -->
    <listitem>
      <para>
      <guimenuitem>Default shortcut</guimenuitem>: Configures a default
      shortcut for the UserAction.</para>
    </listitem>
    <listitem>
      <para>
      <guimenuitem>Enabled</guimenuitem>: if checked, the useraction is shown in the <link linkend="useractions">User Menu</link>, 
       otherwise the useraction will be hidden.</para>
    </listitem>
  </itemizedlist>
  <para>
    <emphasis role="bold">Command-line syntax</emphasis>
  </para>
  <para>Basically, everything you type in the command line will get
  executed (if you type <quote>ls -l</quote>, <quote>ls -l</quote> gets executed). You have
  the possibility to get a character string from
  &krusader; which represents the current state of the
  panel. This is done using placeholders. A placeholder begins with
  a percent-sign ('%') and is followed by a panel indicator ('a'
  for the active, 'o' for the other, 'l' for the left and 'r' for
  the right panel. If the placeholder does not need a panel to
  operate on, you have to indicate this by an underscore ('_')).
  Then comes the name of the placeholder (see the list below),
  which may get some parameters enclosed in quotes. Finally, again
  the percent sign.</para>
  <para>This sounds very complicated, so let's make an example:
  '%aList("Selected")%' is replaced by a list of all selected items
  in the active panel. So a command like 'xmms --enqueue
  %aList("All", " ", "", "*.mp3")%' will execute xmms with a list
  of all .mp3s in the current panel, separated by a single
  blank.</para>
  <para>Currently, these placeholders are implemented:</para> 
  <itemizedlist>
    <listitem>
      <para>
      <userinput>Path</userinput> - replaced by the panels
      path</para>
      <orderedlist>
        <listitem>
          <para>Parameter (optional):
          Automatic escape spaces. Default:
          yes</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Count</userinput> - replaced by the number of
      &lt;first parameter&gt;</para>
      <orderedlist>
        <listitem>
          <para>Parameter: Which items;
          either <quote>All</quote>, <quote>Selected</quote>, <quote>Files</quote> or <quote>Dirs</quote></para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Filter</userinput> - replaced by the panel's filter
      mask</para>
    </listitem>
    <listitem>
      <para>
      <userinput>Current</userinput> - replaced by the current
      item</para>
      <orderedlist>
        <listitem>
          <para>Parameter (optional): Omit the
          current path. Default: no</para>
        </listitem>
        <listitem>
          <para>Parameter (optional):
          Automatic escape spaces. Default:
          yes</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>List</userinput> - replaced by a list of all
      &lt;first parameter&gt;</para>
      <orderedlist>
        <listitem>
          <para>Parameter: Which items;
          either <quote>All</quote>, <quote>Selected</quote>, <quote>Files</quote> or <quote>Dirs</quote></para>
        </listitem>
        <listitem>
          <para>Parameter (optional):
          Separator between the items.
          Default:
          <quote>&nbsp;</quote></para>
        </listitem>
        <listitem>
          <para>Parameter (optional): Omit the
          current path. Default: no</para>
        </listitem>
        <listitem>
          <para>Parameter (optional):
          Filtermask (for all but <quote>Selected</quote>).
          Default: *</para>
        </listitem>
        <listitem>
          <para>Parameter (optional):
          Automatic escape spaces. Default:
          yes</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Select</userinput> - manipulates the selection in a
      panel</para>
      <orderedlist>
        <listitem>
          <para>Parameter: Filtermask</para>
        </listitem>
        <listitem>
          <para>Parameter (optional):
          manipulate in which way; either <quote>Set</quote>, <quote>Add</quote> or <quote>Remove</quote>.
          Default: <quote>Set</quote></para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Goto</userinput> - changes the panels' path to
      &lt;first parameter&gt;</para>
      <orderedlist>
        <listitem>
          <para>Parameter: A relative or
          absolute path, or an &URL;</para>
        </listitem>
        <listitem>
          <para>Parameter (optional): Open the
          location in a new tab. Default:
          no</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Ask</userinput> - asks the user for some text and
      is replaced by the answer</para>
      <orderedlist>
        <listitem>
          <para>Parameter: The
          Question</para>
        </listitem>
        <listitem>
          <para>Parameter (optional): A
          default answer</para>
        </listitem>
        <listitem>
          <para>Parameter (optional): A
          caption for the question box</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Clipboard</userinput> - manipulates the
      clipboard</para>
      <orderedlist>
        <listitem>
          <para>Parameter: The text that
          should go to the clipboard (you may want to use
          <quote>%aCurrent%</quote> here)</para>
        </listitem>
        <listitem>
          <para>Parameter (optional): Append
          the text to the current content of the clipboard with
          this separator</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Copy</userinput> - copies a file, useful for quick,
      local backups</para>
      <orderedlist>
        <listitem>
          <para>Parameter: What should be
          copied</para>
        </listitem>
        <listitem>
          <para>Parameter: Where it should
          be copied</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Sync</userinput> - opens the Synchronizer with a
      given profile</para>
      <orderedlist>
        <listitem>
          <para>Parameter: A profile for the
          Synchronizer</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>NewSearch</userinput> - opens the search windows
      with a given profile</para>
      <orderedlist>
        <listitem>
          <para>Parameter: A profile for the
          search module</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Profile</userinput> - loads a given panel
      profile</para>
      <orderedlist>
        <listitem>
          <para>Parameter: A panel
          profile</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Each</userinput> - splits the commandline into a
      list. These commands are executed one after another.</para>
      <orderedlist>
        <listitem>
          <para>Parameter: A list item (all,
          all files, all dirs, all selected).</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Move</userinput> - move from source to
      destination.</para>
      <orderedlist>
        <listitem>
          <para>Parameter: A source</para>
        </listitem>
        <listitem>
          <para>Parameter: A
          destination</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>PanelSize</userinput> - change the ratio between
      the two panels.</para>
      <orderedlist>
        <listitem>
          <para>Parameter (optional): A
          integer value, &eg;, 80 makes the active panel use 80% of
          &krusader;'s width (height in vertical mode),
          omitting the parameter means 50%.</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>Ask</userinput> - cancel the execution.</para>
      <orderedlist>
        <listitem>
          <para>Parameter (optional): A string
          for the cancel question.</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>ListFile</userinput> - is replaced by path/file name
      of a temporary file containing a list of items</para>
      <orderedlist>
        <listitem>
          <para>Parameter:
          path/filename</para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>ColSort</userinput> - set the sorting on a column
      of a specific panel.</para>
      <orderedlist>
        <listitem>
          <para>Parameter: Column: Either
          <quote>Name</quote>, <quote>Ext</quote>, <quote>Type</quote>, <quote>Size</quote>, <quote>Modified</quote>, <quote>Perms</quote>,
          <quote>rwx</quote>, <quote>Owner</quote> and <quote>Group</quote></para>
        </listitem>
        <listitem>
          <para>Parameter: Sort sequence:
          Either <quote>Toggle</quote>, <quote>Asc</quote>, <quote>Desc</quote></para>
        </listitem>
      </orderedlist>
    </listitem>
    <listitem>
      <para>
      <userinput>View</userinput> - set the view mode.</para>
      <orderedlist>
        <listitem>
          <para>Parameter: View mode: Either
          <quote>generic</quote>, <quote>text</quote>, <quote>hex</quote></para>
        </listitem>
        <listitem>
          <para>Parameter: Window Mode:
          Either <quote>tab</quote>, <quote>window</quote></para>
        </listitem>
      </orderedlist>
    </listitem>
  </itemizedlist>
  <para>A &GUI;-based helper for placeholder adding is
  provided. Spaces in Path, Current and List are by default,
  automatically escaped. There is one more important thing to know:
  All placeholders that interact with &krusader;
  internal functions are called at expand time (meaning directly
  when the placeholders are replaced). External programs are
  called at execution time (meaning after all placeholders are
  replaced).</para>
  <para>
    <emphasis role="bold">Advanced Properties</emphasis>
  </para>
  <para>Here you can configure where your command should be visible
  (for the right click menu). In addition, it is possible to change
  the command executed and confirm it separately. You can also set
  a user under which the command should be executed.</para> 
  <itemizedlist>
    <listitem>
      <para>Configures if the action is valid for a Protocol, Path,
      &MIME; type or File name.</para>
    </listitem>
    <listitem>
      <para>Tweaking the command line before being executed.</para>
    </listitem>
    <listitem>
      <para>Set a different user for the execution (this has no
      effect in &krusader; internal functions)</para>
    </listitem>
  </itemizedlist>
</sect1>
