Примеры - Макросы

Programming Far Manager plugins

Примеры


<macro
  area="Disks"
  key="Tab"
  flags="DisableOutput"
  description="Переход в меню выбора дисков на противоположной панели включение видимости панели в которой будет происходить смена диска, если её не было"><text>
Esc
$If (!PPanel.Visible)
  $If (APanel.Left)
    CtrlF2
  $Else
    CtrlF1
  $End
$End
Tab F9 Enter End Enter
</text></macro>

<macro
  area="Editor"
  key="RAlt"
  flags="DisableOutput"
  description="выделить/(снять выделение) слово(а) под курсором"><text>
RCtrl9 CtrlRight CtrlLeft
$If (!Selected)
  CtrlShiftRight
$Else
  CtrlU
$End
Ctrl9
</text></macro>

<macro
  area="Shell"
  key="CtrlShiftF7"
  flags="DisableOutput|NoPluginPanels"
  description="создание папки с именем = текущей дате"><text>
%folder=date("%d.%m0.%Y");
$If (!panel.fexist(0,%folder))
  F7
  CtrlY
  $Text %folder
  Enter
$End
</text></macro>

<!--
искать тот же файл на другой панели что и на активной
F5 ShiftEnter CtrlIns - применено чтобы получить имя файла вне зависимости
пусто/непусто в cmdline и сколько выделено на панели файлов
-->
<macro
  area="Shell"
  key="CtrlAltLeft"
  flags="DisableOutput"
  description="искать тот же файл на другой панели что и на активной"><text>
<![CDATA[
clip(5)
$If (((Bof && APanel.Root) || !Bof) && PPanel.Visible)
  $If (fexist(PPanel.Path+@"\\"+APanel.Current) == 1)
    F5 ShiftEnter
    CtrlIns Esc Tab Home
    Alt< ShiftIns Esc
  $End
$End
]]></text></macro>

<macro
  area="Shell"
  key="CtrlAltRight"
  flags="DisableOutput"
  description="искать тот же файл на другой панели что и на активной"><text>
<![CDATA[
clip(5)
$If (((Bof && APanel.Root) || !Bof) && PPanel.Visible)
  $If (fexist(PPanel.Path+@"\\"+APanel.Current) == 1)
    F5 ShiftEnter CtrlIns
    Esc Tab Home Alt<
    ShiftIns Esc
  $End
$End
]]></text></macro>

<macro
  area="Shell"
  key="CtrlDown"
  flags="DisableOutput"
  description="Выделение следующих нижних 30 файлов"><text>
$If (!Eof)
  $Rep (30)
    $If (Eof)
      Ins
      $Exit
    $Else
      Ins
    $End
  $End
$End
</text></macro>

<macro
  area="Shell"
  key="CtrlUp"
  flags="DisableOutput"
  description="Выделение следующих верхних 30 файлов"><text>
<text>
Up
$If (Bof)
  $If (!APanel.Root)
    Down
  $End
  $Exit
$Else
  Down
$End
$If (Eof)
  Ins
$Else
  Ins Up
$End
$Rep (29)
  Up
  Ins
  Up
  $If (Bof)
    $If (!APanel.Root)
      Down
    $End
    $Exit
  $End
$End
Up
</text></macro>

<macro
  area="Dialog"
  key="AltP"
  flags="DisableOutput"
  description="сграбить весь экран в текстовый файл far-screen.out работает в области Dialog"><text>
<![CDATA[

clip(5) AltIns CtrlHome ShiftEnd ShiftPgDn Enter Esc
$If (!Shell) Esc $End
$If (Shell && !APanel.Plugin) ShiftF4 CtrlY
print("far-screen.out") Enter ShiftIns Enter Enter F2 Esc $End

]]></text></macro>

<!--
удаление файла/папки по клавише Del
если стояли на элементе .. то пытаемся удалить вышестоящую папку
если не в конце ком строки то удаляем символы в ней
-->
<macro
  area="Shell"
  key="Del"
  flags="DisableOutput"
  description="удаление файла/папки по клавише Del"><text>
<![CDATA[

$If (!CmdLine.Eof) Del $Exit $Else
$If ((APanel.Bof && !APanel.Selected) &&
(!APanel.Root || APanel.Plugin)) CtrlPgUp $End F8 $End

]]></text></macro>

<!--
перед вызовом быстрого просмотра сделать пассивную панель
максимально большего размера.
для обратной операции восстановить панели.
-->
<macro
  area="Shell"
  key="CtrlQ"
  flags="DisableOutput"
  description=""><text>
<![CDATA[

Tab $If (QView) Tab Ctrl2 Tab CtrlClear $Else Tab Ctrl6 Tab
$If (APanel.Left) $Rep (APanel.width) CtrlRight $End $Else
$Rep (APanel.width) CtrlLeft $End $End $End Tab CtrlQ

]]></text></macro>

<constants>
 <constant name="FSPLIT_EXT" type="qword"><text>8</text></constant>
 <constant name="FSPLIT_NAME" type="qword"><text>4</text></constant>
 <constant name="ACTIVEPANEL" type="qword"><text>0</text></constant>
 <constant name="PANELITEM_SELECTED" type="qword"><text>8</text></constant>
</constants>
<keymacros>
<!--
При непустой командной строке макрос не вызывается чтобы можно пользоваться первоначальной
функцией сочетания CtrlShiftIns - Поместить помеченные имена в Буфер Обмена
-->
<macro
  area="Shell"
  key="CtrlShiftIns"
  flags="DisableOutput|EmptyCommandLine"
  description="Пометить вместе с htm-файлом и парную ему папку"><text>
<![CDATA[

%Current=APanel.Current;
%Ext=substr(%Current,len(%Current)-6);
$If (%Ext=="_files")
  %Name=substr(%Current,0,len(%Current)-6);
$Else
  %Ext=fsplit(%Current,FSPLIT_EXT);
  %Name=fsplit(%Current,FSPLIT_NAME);
$End
$if (%Ext==".htm" || %Ext==".html")
  panel.setpos(ACTIVEPANEL,%Name+".files")
  panel.setpos(ACTIVEPANEL,%Name+"_files")
$end
$if (%Ext==".files" || %Ext=="_files")
  panel.setpos(ACTIVEPANEL,%Name+".htm")
  panel.setpos(ACTIVEPANEL,%Name+".html")
$End
$if (APanel.Current!=%Current)
  $If(!panel.item(ACTIVEPANEL,0,PANELITEM_SELECTED)) Ins $End
  panel.setpos(ACTIVEPANEL,%Current)
  $If(!panel.item(ACTIVEPANEL,0,PANELITEM_SELECTED)) Ins $End
$End
mmode(1,2)
]]></text></macro>
</keymacros>

Скроллинг текста по горизонтали:

При включённом ScrollLock клавиши Left/Right выполняют скроллинг текста по горизонтали

[HKEY_CURRENT_USER\Software\far2\KeyMacros\Editor\Right]
"Sequence"="$if(flock(2,-1) == 1) editor.pos(1,5,editor.pos(0,5)+1); $else Right $end"
"DisableOutput"=dword:00000001

[HKEY_CURRENT_USER\Software\far2\KeyMacros\Editor\Left]
"Sequence"="$if(flock(2,-1) == 1) editor.pos(1,5,editor.pos(0,5)-1); $else Left $end"
"DisableOutput"=dword:00000001

Пример использования eval():

Требуется по F10 запускать окно проводника для папки на активной панели, содержимое командной строки должно сохраняться.
В области Vars задаём 2 строковых переменных макропроцедуры, описывающие сохранение и восстановление содержимое командной строки:

%%CmdSave=$If (!CmdLine.Empty) %Flg_Cmd=1;
          %CmdCurPos=CmdLine.ItemCount-CmdLine.CurPos+1;
          %CmdVal=CmdLine.Value; Esc $End

%%CmdRestore=$If (%Flg_Cmd==1) $Text %CmdVal
          %Flg_Cmd=0; %Num=%CmdCurPos;
          $While (%Num!=0) %Num=%Num-1; CtrlS $End $End
далее на F10 вешаем макрос:
$If (APanel.Visible && (!APanel.Plugin || (!APanel.Bof &&(APanel.OPIFlags & 0x20))))
  Eval(%%CmdSave)
  $If (APanel.Current == "..")
    .
    ShiftEnter
  $Else
    "%SystemRoot%\\explorer.exe /select,"
    $If (Apanel.LFN)
      CtrlN
    $End
    CtrlEnter
    $If (!Apanel.LFN)
      CtrlN
    $End
    Enter
  $End
  Eval(%%CmdRestore)
$End
Смотрите также: