Reaper: вопросы присматривающихся к этой программе

  • Автор темы Автор темы goa
  • Дата начала Дата начала
При добавлении нового трека мне конкретно нужно чтобы он:
1.Раскрашивался в рандомный цвет
2.Просил ввести название трека
3.Включался мониторинг
На пиво с вас ))
Иногда может не срабатывать, но это редко, как смог.
JavaScript:
    local DC = {};
    local function doubleClick(interval);
       
        local Mouse_GState = reaper.JS_Mouse_GetState(1);
       
        if Mouse_GState ~= 1 then DC.dblClick = nil end;
       
        if Mouse_GState == 1 and not DC.time1 and not DC.dblClick then;
            DC.time1 = os.clock();
            DC.x1,DC.y1 = reaper.GetMousePosition();
        end;
       
       
        if Mouse_GState ~= 1 and not DC.time2 and DC.time1 then;
            DC.time2 = os.clock();
        end;
       
        if Mouse_GState == 1 and not DC.time3 and DC.time2 and DC.time1 then;
            DC.time3 = os.clock();
            DC.x2,DC.y2 = reaper.GetMousePosition();
           
            if DC.x2 < DC.x1-1    or DC.x2 > DC.x1+1 or
               DC.y2 < DC.y1-1    or DC.y2 > DC.y1+1 then
                DC.time1, DC.time2, DC.time3 = nil,nil,nil;
                DC.x2,DC.x1,DC.y2,DC.y1 = nil,nil,nil,nil;
            end;
        end;
       
       
        if DC.time1 and DC.time2 and DC.time3 then;
            if DC.time1+interval >= DC.time3 then;
                DC.time1, DC.time2, DC.time3 = nil,nil,nil;
                DC.dblClick = true;
                return true;
            else;
                DC.time1, DC.time2, DC.time3 = nil,nil,nil;
                return false;
            end;
        end;
       
       
        if DC.time1 and DC.time1+interval < os.clock()then;
            DC.time1, DC.time2, DC.time3 = nil,nil,nil;
        end
       
        return false;
    end;
   
   
    local function rand();
        local x = math.random(1,9);
        for i = 1,16 do;
            x = x..math.random(0,9);
        end;
        math.randomseed(x);
        return math.random(0,255);
    end;
   
   
   
    local lP = {};
    local function loop();
       
        local ProjState = reaper.GetProjectStateChangeCount(0)
        if ProjState ~= lP.ProjState2 then
            lP.ProjState2 = ProjState
            lastTrack = reaper.GetTrack(0,reaper.CountTracks(0)-1); 
            if lastTrack ~= lP.lastTrack2 then
                lP.lastTrack2 = lastTrack
                lP.NTR = true
            else
                lP.NTR = nil
            end
        end
       
       
        local window, segment, details = reaper.BR_GetMouseCursorContext();
        if (window == "tcp" or window == "mcp") and segment == "empty" and (not details or details == "") then;
            lP.x1,lP.y1 = reaper.GetMousePosition();
            lP.work = true;
        else
            lP.x2,lP.y2 = reaper.GetMousePosition();
            if lP.x2~=lP.x1 or lP.y2~=lP.y1 then lP.work = nil end
        end  
        
       
        if lP.work then
           
            local dblClick = doubleClick(.53)
            if dblClick then
                if lP.NTR then
               
                    -------
                    reaper.Undo_BeginBlock();
                    local lstTrack = reaper.GetTrack(0,reaper.CountTracks(0)-1);
                    local col = reaper.ColorToNative(rand(),rand(),rand());                
                    reaper.SetMediaTrackInfo_Value(lstTrack,"I_CUSTOMCOLOR",col|0x1000000);                
                                       
                    reaper.SetOnlyTrackSelected(lstTrack);
                    reaper.Main_OnCommand(40696,0);--Rename last
                    reaper.Undo_EndBlock("New Track/random color/rename",-1)
                    ------
                    lP.NTR = nil
                    lP.work = nil
                    t=(t or 0)+1
                end;
            end;
         end;
        
        reaper.defer(loop);
    end;
   
    loop();
 
Последнее редактирование:
На пиво с вас ))
Иногда может не срабатывать, но это редко, как смог.
JavaScript:
    local DC = {};
    local function doubleClick(interval);
      
        local Mouse_GState = reaper.JS_Mouse_GetState(1);
      
        if Mouse_GState ~= 1 then DC.dblClick = nil end;
      
        if Mouse_GState == 1 and not DC.time1 and not DC.dblClick then;
            DC.time1 = os.clock();
            DC.x1,DC.y1 = reaper.GetMousePosition();
        end;
      
      
        if Mouse_GState ~= 1 and not DC.time2 and DC.time1 then;
            DC.time2 = os.clock();
        end;
      
        if Mouse_GState == 1 and not DC.time3 and DC.time2 and DC.time1 then;
            DC.time3 = os.clock();
            DC.x2,DC.y2 = reaper.GetMousePosition();
          
            if DC.x2 < DC.x1-1    or DC.x2 > DC.x1+1 or
               DC.y2 < DC.y1-1    or DC.y2 > DC.y1+1 then
                DC.time1, DC.time2, DC.time3 = nil,nil,nil;
                DC.x2,DC.x1,DC.y2,DC.y1 = nil,nil,nil,nil;
            end;
        end;
      
      
        if DC.time1 and DC.time2 and DC.time3 then;
            if DC.time1+interval >= DC.time3 then;
                DC.time1, DC.time2, DC.time3 = nil,nil,nil;
                DC.dblClick = true;
                return true;
            else;
                DC.time1, DC.time2, DC.time3 = nil,nil,nil;
                return false;
            end;
        end;
      
      
        if DC.time1 and DC.time1+interval < os.clock()then;
            DC.time1, DC.time2, DC.time3 = nil,nil,nil;
        end
      
        return false;
    end;
  
  
    local function rand();
        local x = math.random(1,9);
        for i = 1,16 do;
            x = x..math.random(0,9);
        end;
        math.randomseed(x);
        return math.random(0,255);
    end;
  
  
  
    local lP = {};
    local function loop();
      
        local ProjState = reaper.GetProjectStateChangeCount(0)
        if ProjState ~= lP.ProjState2 then
            lP.ProjState2 = ProjState
            lastTrack = reaper.GetTrack(0,reaper.CountTracks(0)-1);
            if lastTrack ~= lP.lastTrack2 then
                lP.lastTrack2 = lastTrack
                lP.NTR = true
            else
                lP.NTR = nil
            end
        end
      
      
        local window, segment, details = reaper.BR_GetMouseCursorContext();
        if (window == "tcp" or window == "mcp") and segment == "empty" and (not details or details == "") then;
            lP.x1,lP.y1 = reaper.GetMousePosition();
            lP.work = true;
        else
            lP.x2,lP.y2 = reaper.GetMousePosition();
            if lP.x2~=lP.x1 or lP.y2~=lP.y1 then lP.work = nil end
        end 
       
      
        if lP.work then
          
            local dblClick = doubleClick(.53)
            if dblClick then
                if lP.NTR then
              
                    -------
                    reaper.Undo_BeginBlock();
                    local lstTrack = reaper.GetTrack(0,reaper.CountTracks(0)-1);
                    local col = reaper.ColorToNative(rand(),rand(),rand());               
                    reaper.SetMediaTrackInfo_Value(lstTrack,"I_CUSTOMCOLOR",col|0x1000000);               
                                      
                    reaper.SetOnlyTrackSelected(lstTrack);
                    reaper.Main_OnCommand(40696,0);--Rename last
                    reaper.Undo_EndBlock("New Track/random color/rename",-1)
                    ------
                    lP.NTR = nil
                    lP.work = nil
                    t=(t or 0)+1
                end;
            end;
         end;
       
        reaper.defer(loop);
    end;
  
    loop();
ОК, спасибо за труды, но я ведь так и не выяснил как назначать чтото на двойной клик по области треков :).
Ну тогда я решил что это просто скрипт который вкл или выкл постоянно. Но окошечко State в меню экшнов пустое и не содержит on/off.
Ну ладно, я решил что он работает каким то неизвестным мне способом. Но при запуске скрипта все время вылетает вот это:
2c58bd4e2224.jpg


Не могли бы вы еще и инструкцию приложить как его запустить?
 
Товарищи, подскажите есть возможность сделать что бы Рипер определял и показывал нажатый аккорд? (ну там Ам, Cadd9.... и тд) как в Лоджике?
И еще вопрос, у всех на Мак с шрифтами проблема? (В остальных программах ок)
 
Запуск Action автоматически
помогите найти пожалуйста запуска экшенов в автоматическом режиме (наподобие функции macro markers, когда экшен запускается при прохождении маркера с id экшена)
может как-то с помощью миди айтемов ?
 
@shprot,

но я ведь так и не выяснил как назначать чтото на двойной клик по области треков
Что то и не получится назначать на двойной клик по области треков, ты описал конкретную задачу, я ее и попытался реализовать.
Но при запуске скрипта все время вылетает вот это:
Ошибка вылетает потому что у тебя не установлено расширение JS_.... , Для его установки надо поставить репозиторий ReaTeam Extensions или если у тебя не установлен реапак, то напиши какая у тебя ос и я скажу какой и откуда скачать файл и куда положить.
-------------
Можешь удалить тот скрипт, я потестил и он не будет работать, он работает пока в проекте мало треков и то через раз, а когда треков больше пятидесяти, то вообще перестает работать.
Оказывается при создании трека рипер отключает выполнение скрипта, т.е. ставит его на паузу и скрипт из за этого не видет второго нажатия.
Так что с двойным кликом не получится сделать.
Как альтернативу - могу предложить с зажатой клавишей. Т.е. не двойной клик, а зажать клавишу мыши, т.е. зажал например на одну секунду левую клавишу мыши и добавился трек с твоей конфигурацией. В этом варианте можно не только добавлять трек, но и что то другое реализовывать.
Т.е. будет у тебя по двойному клику добавляться стандартный трек, как и раньше, а при зажатии мыши добавляться твой трек.
 
Запуск Action автоматически
помогите найти пожалуйста запуска экшенов в автоматическом режиме (наподобие функции macro markers, когда экшен запускается при прохождении маркера с id экшена)
может как-то с помощью миди айтемов ?
Что значит автоматически? По какому событию?
 
@shprot,


Что то и не получится назначать на двойной клик по области треков, ты описал конкретную задачу, я ее и попытался реализовать.

Ошибка вылетает потому что у тебя не установлено расширение JS_.... , Для его установки надо поставить репозиторий ReaTeam Extensions или если у тебя не установлен реапак, то напиши какая у тебя ос и я скажу какой и откуда скачать файл и куда положить.
-------------
Можешь удалить тот скрипт, я потестил и он не будет работать, он работает пока в проекте мало треков и то через раз, а когда треков больше пятидесяти, то вообще перестает работать.
Оказывается при создании трека рипер отключает выполнение скрипта, т.е. ставит его на паузу и скрипт из за этого не видет второго нажатия.
Так что с двойным кликом не получится сделать.
Как альтернативу - могу предложить с зажатой клавишей. Т.е. не двойной клик, а зажать клавишу мыши, т.е. зажал например на одну секунду левую клавишу мыши и добавился трек с твоей конфигурацией. В этом варианте можно не только добавлять трек, но и что то другое реализовывать.
Т.е. будет у тебя по двойному клику добавляться стандартный трек, как и раньше, а при зажатии мыши добавляться твой трек.
SWS and ReaPack все есть, установил Js_...API теперь ошибка lua:5: attempt to index a nil value (global 'DC').

Давайте альтернативные варианты, если возможно такие. А возможно назначить на среднюю кнопку мышку (колесико)? Клик, или двойной клик, или зажатие? Если нет тогда левую зажатую
 
Давайте альтернативные варианты, если возможно такие. А возможно назначить на среднюю кнопку мышку (колесико)? Клик, или двойной клик, или зажатие? Если нет тогда левую зажатую
171562

JavaScript:
    -- Insert track double middle click in empty TCP and random color,rename
    -- Вставьте трек двойным средним кликом в пустой TCP и случайным цветом, переименовать
   
   
   
    local interval = .5   -- second
   
   
   
    ---------------------------------
    local function rand();
        local x = math.random(1,9);
        for i = 1,16 do;
            x = x..math.random(0,9);
        end;
        math.randomseed(x);
        return math.random(0,255);
    end;
    ---------------------------------
   
   
    ------------------------------------------------
    local function body();
        ------
        reaper.Undo_BeginBlock();
        reaper.PreventUIRefresh(1);
        local CountTrack = reaper.CountTracks(0);
        reaper.InsertTrackAtIndex(CountTrack,true);
        local lstTrack = reaper.GetTrack(0,CountTrack);
        local col = reaper.ColorToNative(rand(),rand(),rand());               
        reaper.SetMediaTrackInfo_Value(lstTrack,"I_CUSTOMCOLOR",col|0x1000000);               
                          
        reaper.SetOnlyTrackSelected(lstTrack);
        reaper.PreventUIRefresh(-1);
        reaper.Main_OnCommand(40696,0);--Rename last
        reaper.Undo_EndBlock("New Track/random color/rename",-1)
        ------
    end;
    ------------------------------------------------
   
   
    ------------------------------------------------
    if not tonumber(interval)then interval = .5 end;
    ------------------------------------------------
   
   
   
    ------------------------------------------------
    ----v    |    Double Middle Click    |    v----
    ------------------------------------------------
    local
    DC = {};
    local function DoubleMiddleClick(interval);
      
        local Mouse_GState = reaper.JS_Mouse_GetState(127);
      
        if Mouse_GState == 0 then DC.dblClick = nil end;
      
        if Mouse_GState == 64 and not DC.time1 and not DC.dblClick then;
            DC.time1 = os.clock();
            DC.x1,DC.y1 = reaper.GetMousePosition();
        end;
      
      
        if Mouse_GState == 0 and not DC.time2 and DC.time1 then;
            DC.time2 = os.clock();
        end;
       
       
        if Mouse_GState == 64 and not DC.time3 and DC.time2 and DC.time1 then;
            DC.time3 = os.clock();
            DC.x2,DC.y2 = reaper.GetMousePosition();
           
            if (math.abs(DC.x2 - DC.x1) > 3) or
               (math.abs(DC.y2 - DC.y1) > 3) then
               DC = {};
            end;
        end;
       
       
        if DC.time1 and DC.time2 and DC.time3 then;
            if DC.time1+interval >= DC.time3 then;
                DC = {};
                DC.dblClick = true;
                return true;
            else;
                DC = {};
                return false;
            end;
        end;
      
      
        if DC.time1 and DC.time1+interval < os.clock()then;
            DC = {};
        end;
        return false;
    end;
    ------------------------------------------------
   
   
   
    ---------------------------------
    local function loop();
       
        local window, segment, details = reaper.BR_GetMouseCursorContext();
        if (window == "tcp" or window == "mcp") and
           segment == "empty" and (not details or details == "") then;
          
           local DblMidClick = DoubleMiddleClick(.5);
           if DblMidClick then;
               body();
               --t=(t or 0)+1; 
           end; 
        end;
       
        reaper.defer(loop);
    end;
    ---------------------------------
   
   
   
    ------------------------------------
    function SetToggleButtonOnOff(numb);
        local value,ScriptWay,sec,cmd,mod,res,val = reaper.get_action_context();
        reaper.SetToggleCommandState(sec,cmd,numb or 0);
        reaper.RefreshToolbar2(sec,cmd);
    end;
    ------------------------------------
   
   
   
    ------------------------------------
    SetToggleButtonOnOff(1);
    reaper.defer(loop);
    reaper.atexit(SetToggleButtonOnOff);
    ------------------------------------
 
то, как в такой ситуации видеослейв воспроизводит видео, никуда не годится. Он его воспроизводит рывкамии и без звука, как будто каждую долю секунды происходит точечная локация. Если присмотреться к твоей гифке мастер+слейв, можно увидеть, что у слейва не нажимается кнопка воспроизведения. Гы, это ж трансерфинг Зеланда в действии: мы не воспроизводим видео в слейве, а каждую долю секунды перебираем варианты, в которых курсор стоит на долю секунды позже))

Update: воспроизведение налаживается, если активировать в опшнах внешнюю синхронизацию - обратно возвращаясь к MTC. Но тогда наверняка MTC как-то конфликтует с постоянно отсылаемым OSC? (т. е. возвращаемся к тому, с чем уже столкнулся Стефан и почему ему понадобился OSCII бот)
 
Последнее редактирование:
Посмотреть вложение 171562
JavaScript:
    -- Insert track double middle click in empty TCP and random color,rename
    -- Вставьте трек двойным средним кликом в пустой TCP и случайным цветом, переименовать



    local interval = .5   -- second



    ---------------------------------
    local function rand();
        local x = math.random(1,9);
        for i = 1,16 do;
            x = x..math.random(0,9);
        end;
        math.randomseed(x);
        return math.random(0,255);
    end;
    ---------------------------------


    ------------------------------------------------
    local function body();
        ------
        reaper.Undo_BeginBlock();
        reaper.PreventUIRefresh(1);
        local CountTrack = reaper.CountTracks(0);
        reaper.InsertTrackAtIndex(CountTrack,true);
        local lstTrack = reaper.GetTrack(0,CountTrack);
        local col = reaper.ColorToNative(rand(),rand(),rand());           
        reaper.SetMediaTrackInfo_Value(lstTrack,"I_CUSTOMCOLOR",col|0x1000000);           
                      
        reaper.SetOnlyTrackSelected(lstTrack);
        reaper.PreventUIRefresh(-1);
        reaper.Main_OnCommand(40696,0);--Rename last
        reaper.Undo_EndBlock("New Track/random color/rename",-1)
        ------
    end;
    ------------------------------------------------


    ------------------------------------------------
    if not tonumber(interval)then interval = .5 end;
    ------------------------------------------------



    ------------------------------------------------
    ----v    |    Double Middle Click    |    v----
    ------------------------------------------------
    local
    DC = {};
    local function DoubleMiddleClick(interval);
  
        local Mouse_GState = reaper.JS_Mouse_GetState(127);
  
        if Mouse_GState == 0 then DC.dblClick = nil end;
  
        if Mouse_GState == 64 and not DC.time1 and not DC.dblClick then;
            DC.time1 = os.clock();
            DC.x1,DC.y1 = reaper.GetMousePosition();
        end;
  
  
        if Mouse_GState == 0 and not DC.time2 and DC.time1 then;
            DC.time2 = os.clock();
        end;
   
   
        if Mouse_GState == 64 and not DC.time3 and DC.time2 and DC.time1 then;
            DC.time3 = os.clock();
            DC.x2,DC.y2 = reaper.GetMousePosition();
       
            if (math.abs(DC.x2 - DC.x1) > 3) or
               (math.abs(DC.y2 - DC.y1) > 3) then
               DC = {};
            end;
        end;
   
   
        if DC.time1 and DC.time2 and DC.time3 then;
            if DC.time1+interval >= DC.time3 then;
                DC = {};
                DC.dblClick = true;
                return true;
            else;
                DC = {};
                return false;
            end;
        end;
  
  
        if DC.time1 and DC.time1+interval < os.clock()then;
            DC = {};
        end;
        return false;
    end;
    ------------------------------------------------



    ---------------------------------
    local function loop();
   
        local window, segment, details = reaper.BR_GetMouseCursorContext();
        if (window == "tcp" or window == "mcp") and
           segment == "empty" and (not details or details == "") then;
      
           local DblMidClick = DoubleMiddleClick(.5);
           if DblMidClick then;
               body();
               --t=(t or 0)+1;
           end;
        end;
   
        reaper.defer(loop);
    end;
    ---------------------------------



    ------------------------------------
    function SetToggleButtonOnOff(numb);
        local value,ScriptWay,sec,cmd,mod,res,val = reaper.get_action_context();
        reaper.SetToggleCommandState(sec,cmd,numb or 0);
        reaper.RefreshToolbar2(sec,cmd);
    end;
    ------------------------------------



    ------------------------------------
    SetToggleButtonOnOff(1);
    reaper.defer(loop);
    reaper.atexit(SetToggleButtonOnOff);
    ------------------------------------
При запуске рипера скрипт каждый раз оказывается в неактивном состоянии, галочку ставил, проект-шаблон с включенным скриптом сохранял, но увы...

У меня кстати такая же проблема с пунктом "показывать в микшере треки в несколько рядов когда место позволяет", там наоборот, как не пытался, функция всегда в включенном состоянии при запуске рипера, даже если я запускаю сохраненный шаблонный с выключенной функцией
 
Последнее редактирование:
При запуске рипера скрипт каждый раз оказывается в неактивном состоянии, галочку ставил, проект-шаблон с включенным скриптом сохранял, но увы...
При запуске рипера все скрипты всегда неактивные! Если хочешь что бы скрипт запускался вместе с рипером, то нужно его добавить в автозагрузку.
171597


Жмешь set project как показано на скриншоте выше и в появившемся окне вводишь id скрипта (правый клик по скрипту в экшен листе и
171598
)
Все , теперь скрипт будет запускаться вместе с рипером одновременно.
----------------------

Жду спасибо

171600
 
  • Like
Реакции: vax
Что значит автоматически? По какому событию?
В смысле при проигрывании трека можно например поставить marker с
Что значит автоматически? По какому событию?
Что значит автоматически? По какому событию?
В смысле можно например при проигрывании трека поставить маркер с id любого экшена +! , и при пересечении лини маркера срабатывает экшен, Этот способ для меня не работает, так как пользуюсь регионами и плэйлистами регионов, в случае когда маркер находится внутри региона выскакивает ошибка и плэйлист регионов не работает коректно. Ищу способ запуска экшена каким либо другим способом, например с помощью миди региона,
 
@Martin10, повторяю вопрос -
ПО КАКОМУ СОБЫТИЮ?
При Плее, при достижении плей курсором определённого положения на таймлайне???
Что у вас должно произойти, после чего запустится Экшин?
Что вы делать собираетесь этим Экшином?

Можете задачу свою описать целиком, а не из середины? И не опираться на свои знания Рипера, а прозой.
Типпа - "Хочу чтобы когда проигрался первый Регион, в его конце произошло то-то и то-то"
 
@Martin10, повторяю вопрос -
ПО КАКОМУ СОБЫТИЮ?
При Плее, при достижении плей курсором определённого положения на таймлайне???
Что у вас должно произойти, после чего запустится Экшин?
Что вы делать собираетесь этим Экшином?

Можете задачу свою описать целиком, а не из середины? И не опираться на свои знания Рипера, а прозой.
Типпа - "Хочу чтобы когда проигрался первый Регион, в его конце произошло то-то и то-то"

при проигрывании песни в месте региона срабатывал кастомный экшен допустим запускающий цепь гитарных эффектов

если использовать маркер выскакивает такая ошибка (фото2)
 

Вложения

  • Снимок экрана 2019-11-29 в 0.24.04.png
    Снимок экрана 2019-11-29 в 0.24.04.png
    268,6 KB · Просмотры: 292
  • Снимок экрана 2019-11-29 в 0.30.08.png
    Снимок экрана 2019-11-29 в 0.30.08.png
    79 KB · Просмотры: 295
@Martin10, вы напишите наконец ЧТО ВАМ НУЖНО?
Ни что у вас было, а теперь не получается - а что вы хотите.
Не фразами - допустим, а чётко, подробно и ясно.
В Рипере на каждую из вами придуманных задач есть минимум два-три решения, вот только задачи вы ни как не сформулируете.
 
А подскажите пожалуйста как закрепить навсегда в докере окно плагина. Если я закрепляю в докере Fx Window, то все остальные плагины тоже оказываются в докере. Я просто хочу, чтобы, например, Melodyne был внизу в докере (без Fx Window), а остальные в плавающем режиме открывались классическим способом. Возможно ли так сделать?
 
Ну некоторые люди привыкли, к примеру, видеть в доке миди редактор или менеджер файлов.
Это самостоятельные модули Рипера и они имеют каждый своё в нём окно.
Я хочу видеть в доке Melodyne т.к. это тоже своего рода редактор.
А это ОДИН из плагинов, которые ВСЕ открываются в одном и том-же окне.
Теоретически можно его показывать в Доке если вы именно его выбрали, сделали активным, но это значит, что кто-то третий должен следить, что в Windows FX стал активным именно Мелодайн и Windows FX отправлять в док - только так.
В общем - всё время Мелодайн там не будет. Да и как быть, если Мелодайн у вас на кучи разных треках стоит - какой вам из них в Доке показывать?
 
Последнее редактирование:
Да и как быть, если Мелодайн у вас на кучи разных треках стоит - какой вам из них в Доке показывать?
Ну так я когда трек выделяю, то показывается Melodyne именно этого трека, но пока в отдельном плавающем окне только. Хотелось бы иметь возможность закреплять позиции эффектов перманентно именно для отдельных плагинов.

как в S1 человек хочет
Ну да! Я просто был уверен, что Рипер всё может:)
 
Когда Мелодайн сделают модулем Рипера, тогда и он сможет.
Жаль. Фиг сним, с докерм. Я думал, что Рипер способен хотя бы перманентно зафиксировать при открытии плагина расположение его окна в нужном мне месте экрана.
 

Сейчас просматривают