FAR Manager
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.113] |
|
|
ПРАВИЛА РАЗДЕЛА
| Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
FAR Manager
|
Прикр. сообщ.
#1
,
|
|
|
|
Far Manager
Windows. FreeWare. Многофункциональный файловый менеджер для работы с различными файлами, позволяет просматривать файлы и каталоги, редактировать, копировать и переименовывать файлы. Поддерживает Unicode имеет удобный и простой в использовании пользовательский интерфейс с многоязычной поддержкой. Позволяет работать с архивами, FTP-клиентами, и просматривать сеть с помощью реализованных в стандартную поставку плагинов. Кроме того есть возможность расширения функциональности за счет подключения дополнительных плагинов. ![]() Ну очень странно что его уже давным давно не включили в разделе "Полезного ПО" Подключаемые модули (плагины) Возможности FAR существенно расширяются благодаря плагинам различного назначения: Домашняя страничка: https://farmanager.com |
|
Сообщ.
#16
,
|
|
|
|
В общем, разгадка на поверхности, хотя и не так уж очевидна. CompareString() же выполняет лексикографическое сравнение с учётом национальных предпочтений. Это очевидно. А вот что не так уж, так это то, что '-' ассоциируется с дефисами и тире, в частности переносами, как явными, так и мягкими. Ну и лексикографически они располагаются перед разделителями, типа там пробел, таб итп, т.к. по сравнению с ними должны иметь меньший вес.
Я заглянул в 7-ку, там такое же поведение. Даже поставил XPю на виртуалку и заморочился пакетом её поддержки в Студии, что собрать под неё. И в ней тоже Greater. Осталось только ради интереса чекнуть 98SE, но это VS6 расчехлять... ну так мы тут крутые парни или зумеры ленивые |
|
Сообщ.
#17
,
|
|
|
|
В общем, это был непростой процесс. Даже на виртуалке под современными процессорами 98-я не работает должным образом. Пришлось искать патчи. Но это уже был не просто спортивный интерес, это было дело принципа. Нашёл образ, нашёл патчи, нашёл ключ активации, проинсталил, нашёл, как и чем собрать под Win98. Greater. Ну кто б сомневался.
|
|
Сообщ.
#18
,
|
|
|
|
Цитата Qraizer @ Частично. Указывая сортировать по расширению, он группирует мои *.txt-файлы, это так. Но далее меня б более чем устроила сортировка по коду символа (в некоем смысле это очевидный порядок), но разрабы зачек-то замутили ещё какой-то смысл в дальнейшем упорядочении. Эх... Так он сортирует по одному указанному критерию. По другим критериям никаких гарантий какого-либо порядка. Тебе же нужно два критерия одновременно. |
|
Сообщ.
#19
,
|
|
|
|
Это не разрабы, это правила юникода. Тебе бы понравилось, если файлы с именами из латиницы+кириллицы сортировались на основе хрен пойми чего вместо национальных правил? и заметь, кириллица не обязательно означает русский, как и латиница не обязательно английский, французы с немцами тебе это подтвердят, а уж турки так вообще.
|
|
Сообщ.
#20
,
|
|
|
|
Цитата Qraizer @ 1. Хочется пример этого "хрен пойми чего", дабы не на эмоциях рассуждать, а по логике.Тебе бы понравилось, если файлы с именами из латиницы+кириллицы сортировались на основе хрен пойми чего вместо национальных правил? 2. Думаю, что понравилось бы, несмотря на местами встречавшийся порядок "ЁЈАБВ...", т.к. логика абсолютна. |
|
Сообщ.
#21
,
|
|
|
|
Хозяйке на заметку: временнЫе штампы
Может кому и пригодиться... Моя шляпа позволяет в начало имени файла или каталога вставлять дату-время. Спросите "зачем это надо". А-б-и-с-ь-н-я-ю! Очень удобно иметь список файлов и каталогов, отсортированных по имени (а по факту по дате-времени) не меняя порядок сортировки в самом ФАРе. Особенно прекрасно это ощущается в каталогах резервных копий - просто душа дятлом поёт!!! Т.е. делаете просто файл или каталог под именем "1", травите на него команду и получаете к примеру "2025.08.19-15.43.56_1". Осталось только при переименовании убрать последних два символа, если нужен просто временной штамп. ⭐ Солюшен 1) В самом ФАРе делаете очередной пункт меню в его меню, вызываемом по [F2], допустим "Вставить временной штамп" 2) В качестве горячей клавиши что угодно, а можно и без нее. А в качестве команды что-то типа C:\Tools\set-timestamp.cmd "!.!", ну или ваш варик В качестве командного файла: ![]() ![]() @echo off SET HOUR=%TIME:~0,2% SET STAMP=%date:~6,4%.%date:~3,2%.%date:~0,2%-%HOUR: =0%.%TIME:~3,2%.%TIME:~6,2% SET FOLDER=%STAMP::=-% SET FILE=%1 SET FILE=%FILE:~1,-1% ren %1 "%FOLDER%_%FILE%" |
|
Сообщ.
#22
,
|
|
|
|
Нужна была подобная функциональность для ведения логов. Никак не смог заставить возвращать секунды.
|
|
Сообщ.
#23
,
|
|
|
|
Цитата Qraizer @ Никак не смог заставить возвращать секунды. ?? %TIME% возвращает секунды с точностью до сотых... |
|
Сообщ.
#24
,
|
|
|
|
Я ж об этом. Сорри, непонятно выразился. Я использовал что-то типа
![]() ![]() rem Время запуска for /f %%a in ('date /t') do set curdate=%%a for /f %%a in ('time /t') do set curtime=%%a echo: >>> %~dp0runlog.txt echo ----------------------------------------------------------------------------------- >>> %~dp0runlog.txt echo %curdate% %curtime%: run started >>> %~dp0runlog.txt echo ----------------------------------------------------------------------------------- >>> %~dp0runlog.txt |
|
Сообщ.
#25
,
|
|
|
|
Хозяйке на заметку: удобочитаемая распечатка PATH
Может кому и пригодиться... Так бывает, что при "задействовании" очередного пакета, требующего изменение системного параметра PATH, уже теряется "понимание" содержимого этой переменной. Ибо путей уже over дохера... Мой солюшен это решает - он позволяет вывести содержимое переменной поэлементно и в столбец. Для этого делаем пункт в меню Фар, вызываемом по [F2], допустим "Смотрим пути". В качестве горячей клавиши что угодно, а можно и без нее. А в качестве команды что-то типа: ![]() ![]() path | E:\Tools\MSys64\usr\bin\sed -e 's/;/\n/g' И получаем что-то типа на выводе в консоль: ![]() ![]() E:\Documents\3.Projects>path | E:\Tools\MSys64\usr\bin\sed -e 's/;/\n/g' C:\Tools\Perl-5.40.0-x64\c\bin C:\Tools\Perl-5.40.0-x64\perl\site\bin C:\Program Files\Common Files\Oracle\Java\javapath C:\Program Files (x86)\VMware\VMware Workstation\bin\ C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64 C:\Tools\Python310\ C:\Tools\Python310\Scripts\ C:\Tools\Prolog\bin C:\Tools\ImageMagick C:\Program Files\dotnet\ C:\WINDOWS\system32 C:\WINDOWS C:\WINDOWS\System32\Wbem C:\WINDOWS\System32\WindowsPowerShell\v1.0\ C:\WINDOWS\System32\OpenSSH\ C:\Tools\gs\bin D:\Tools\SDK-Flutter\bin C:\Program Files\Java\jdk-17\bin C:\Program Files\nodejs\ C:\Tools\Git\cmd D:\Tools\Topaz Gigapixel AI\bin\ C:\Program Files\Calibre2\ D:\Tools\OpenServer\bin C:\Users\Majestio\AppData\Local\ValidatorBuddy C:\Users\Majestio\AppData\Local\Microsoft\WindowsApps C:\Users\Majestio\AppData\Roaming\Programs\Zero Install C:\Users\Majestio\AppData\Roaming\npm Одна "беда" - нужно иметь установленным MSYS2. В моём случае в E:\Tools\MSys64 |
|
Сообщ.
#26
,
|
|
|
|
У кого его нет:
![]() ![]() @echo off setlocal set var=%path% :onceMore for /f "tokens=1,* delims=;" %%a in ("%var%") do ( echo %%a set var=%%b goto onceMore ) endlocal |
|
Сообщ.
#27
,
|
|
|
|
Может кому и пригодиться... Как говорится "мопед не мой". Пришлось знатно переписать скрипт, так как оригинальный постоянно съедал последнюю строку. Сегодня меня это уже достало! Shift+Tab - сдвигает выделенный потоковый блок вправо Shift+BS - сдвигает выделенный потоковый блок влево УПС: Есть баги! Буду дорабатывать Макро ложить вот сюда: %FARHOME%\Profile\Macros\scripts\BlockIndent (ну или где у вас там хранится, может в профилях пользователя венды) Скрытый текст BlockIndent.lua ![]() ![]() --[[ Block Indent for Far Manager Version: 2.2 Copyright (C) 2001 Alex Yaroslavsky Copyright (C) 2025 Majestio (fixxxx) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Features: - Right or Left Indentation of the selected block (or the current line) by a tab or a space. - Each line in the block is indented relatively to its own position with no respect to other lines in the block. - Tab indentation as in Borland Turbo IDE, text is indented to the nearest tab position and not just by tab size. - Works correctly with any editor settings (expand tabs or not, inserts real tabs). --]] local function Indent(IndentByTabSize, Forward) local F = far.Flags local ei = editor.GetInfo() if not ei then return end local hasBlock = (ei.BlockType == F.BTYPE_STREAM or ei.BlockType == F.BTYPE_COLUMN) and ei.BlockStartLine local startLine = hasBlock and ei.BlockStartLine or ei.CurLine editor.UndoRedo(nil, F.EUR_BEGIN) if hasBlock then if ei.BlockType == F.BTYPE_STREAM then -- Принудительно делаем выделение "до конца окна" на всех строках блока editor.Select(nil, "BTYPE_STREAM", ei.BlockStartLine, 1, -1, ei.TotalLines) elseif ei.BlockType == F.BTYPE_COLUMN then -- Для вертикального блока — просто расширяем до конца файла editor.Select(nil, "BTYPE_COLUMN", ei.BlockStartLine, ei.BlockStartCol, ei.TotalLines - ei.BlockStartLine + 1, ei.BlockWidth) end end local IndentSize = IndentByTabSize and ei.TabSize or 1 local IndentChar = IndentByTabSize and "\t" or " " local line = startLine while true do local s = editor.GetString(nil, line, 0) if not s then break end local inBlock = not hasBlock if hasBlock then local ss = s.SelStart or 0 local se = s.SelEnd or 0 inBlock = (ss > 0) and (se == -1 or ss <= se) end if not inBlock then break end local text = s.StringText or "" local firstNonSpace = text:find("[^ \t]") or (#text + 1) local tabCol = editor.RealToTab(nil, line, firstNonSpace) - 1 local steps = math.floor(tabCol / IndentSize) if not Forward and (tabCol % IndentSize) == 0 then steps = steps - 1 end steps = math.max(0, Forward and steps + 1 or steps) -- Удаляем старый отступ editor.SetString(nil, line, text:sub(firstNonSpace), s.StringEOL) -- Вставляем новый editor.SetPosition(nil, line, 1) for i = 1, steps do editor.InsertText(nil, IndentChar) end line = line + 1 end -- Восстанавливаем курсор editor.SetPosition(nil, ei) editor.Redraw() editor.UndoRedo(nil, F.EUR_END) end Macro { area="Editor"; key="ShiftTab"; flags=""; description="Indent right by space"; action = function() Indent(false, true) end; } Macro { area="Editor"; key="ShiftBS"; flags=""; description="Indent left by space"; action = function() Indent(false, false) end; } NoMacro { area="Editor"; key=""; flags=""; description="Indent right by tab size"; action = function() Indent(true, true) end; } NoMacro { area="Editor"; key=""; flags=""; description="Indent left by tab size"; action = function() Indent(true, false) end; } |
|
Сообщ.
#28
,
|
|
|
|
Хозяйке на заметку: извлечение встроенной BASE64-кодированной картинки во встроенном редакторе Far
Может кому и пригодиться... Надоело пользоваться online-извлекаторами с тоннами рекламы, сделал свой. Уютный и ламповый! Пользоваться просто. Допустим есть нечто в виде: ![]() ![]() <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII="> Выделяем все, что между двойными кавычками и жмём Ctrl+Alt+I, в открывшемся диалоге вводим имя сохраняемого файла без расширения. Бинго! Макро ложить вот сюда: %FARHOME%\Profile\Macros\scripts\DecodeImage (ну или где у вас там хранится, может в профилях пользователя венды) Скрытый текст DecodeBase64Image.lua ![]() ![]() --[[ DecodeBase64Image для Far Manager Версия: 1.0 Автор: Majestio Copyright © 2025 Majestio Данная программа распространяется под лицензией MIT. Разрешается использование, копирование, изменение, слияние, публикация, распространение, сублицензирование и/или продажа копий программы без каких-либо ограничений при соблюдении следующих условий: 1. Вышеуказанное уведомление об авторских правах и данное условие разрешения должны быть включены во все копии или существенные части программы. 2. ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, явных или подразумеваемых, включая (но не ограничиваясь) гарантии товарного состояния, пригодности для конкретной цели и отсутствия нарушений прав третьих лиц. Ни при каких обстоятельствах автор не несёт ответственности за любые претензии, убытки или иные обязательства, возникшие в связи с использованием программы. Назначение: - декодирует внедрённую в текст картинку Base64 и сохраняет её в файл Пример использования: выделяем всё, что находится между двойными кавычками: "data:image/png;base64,iVBORw0KGgoAAAANSUh...абырвалг=" --]] local checkImageFormat = function(format) local validFormats = { ["image/png"] = true, ["image/jpeg"] = true, ["image/jpg"] = true, ["image/gif"] = true, ["image/bmp"] = true, ["image/webp"] = true, ["image/svg+xml"] = true } return validFormats[format] end ------------------------------------------------------------------------------------------------------------------------------------- local isValidBase64 = function(str) local base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" local padding_char = "=" -- Проверка длины строки if #str % 4 ~= 0 then return false end -- Проверка символов строки local padding_count = 0 for i = 1, #str do local char = str:sub(i, i) if char == padding_char then padding_count = padding_count + 1 elseif not base64_chars:find(char, 1, true) then return false end end -- Проверка символов заполнения if padding_count > 2 then return false elseif padding_count > 0 then local last_char = str:sub(-1) if last_char ~= padding_char or str:sub(-2, -2) == padding_char then return false end end return true end ------------------------------------------------------------------------------------------------------------------------------------- local base64_decode = function(input) local output = "" local base64_reverse_chars = { ["A"]=0,["B"]=1,["C"]=2,["D"]=3,["E"]=4,["F"]=5,["G"]=6,["H"]=7,["I"]=8,["J"]=9, ["K"]=10,["L"]=11,["M"]=12,["N"]=13,["O"]=14,["P"]=15,["Q"]=16,["R"]=17,["S"]=18,["T"]=19, ["U"]=20,["V"]=21,["W"]=22,["X"]=23,["Y"]=24,["Z"]=25,["a"]=26,["b"]=27,["c"]=28,["d"]=29, ["e"]=30,["f"]=31,["g"]=32,["h"]=33,["i"]=34,["j"]=35,["k"]=36,["l"]=37,["m"]=38,["n"]=39, ["o"]=40,["p"]=41,["q"]=42,["r"]=43,["s"]=44,["t"]=45,["u"]=46,["v"]=47,["w"]=48,["x"]=49, ["y"]=50,["z"]=51,["0"]=52,["1"]=53,["2"]=54,["3"]=55,["4"]=56,["5"]=57,["6"]=58,["7"]=59, ["8"]=60,["9"]=61,["+"]=62,["/"]=63 } -- Убираем все = с конца input = input:gsub("=*$", "") local input_length = #input for i = 1, input_length, 4 do local c1 = input:sub(i, i) local c2 = input:sub(i+1, i+1) local c3 = input:sub(i+2, i+2) local c4 = input:sub(i+3, i+3) local b1 = base64_reverse_chars[c1] or 0 local b2 = base64_reverse_chars[c2] or 0 local b3 = base64_reverse_chars[c3] or 0 local b4 = base64_reverse_chars[c4] or 0 local byte1 = bit.bor(bit.lshift(b1, 2), bit.rshift(b2, 4)) local byte2 = bit.bor(bit.lshift(bit.band(b2, 0x0F), 4), bit.rshift(b3, 2)) local byte3 = bit.bor(bit.lshift(bit.band(b3, 0x03), 6), b4) output = output .. string.char(byte1) if c3 ~= "" then output = output .. string.char(byte2) end if c4 ~= "" then output = output .. string.char(byte3) end end return output end ------------------------------------------------------------------------------------------------------------------------------------- local DecodeBase64Image = function () local ei = editor.GetInfo(nil) if ei.BlockType == 0 then far.Message("Блок не выделен и декодировать нечего!", "Ошибка", nil, "w") return end local selectedText = Editor.SelValue -- Проверка формата изображения local format = selectedText:match("^data:([+%a/]+);base64,") if not format or not checkImageFormat(format) then far.Message("Выделенный блок не содержит информации об изображении", "Ошибка", nil, "w") return end -- Проверка валидности кодированной информации local encodedImage = selectedText:match(";base64,(.*)") if not encodedImage or not isValidBase64(encodedImage) then far.Message("Выделенный блок содержит некорректную информацию об изображении", "Ошибка", nil, "w") return end -- Запрос имени файла local filePath = far.InputBox(nil, "Сохранение изображения", "Введите имя файла:", nil, nil, 128, nil, 0) if not filePath or filePath == "" then return end -- Декодирование и сохранение изображения local decodedImage = base64_decode(encodedImage) local fileExtension = format:match("image/(%a+)") local fullPath = filePath .. "." .. fileExtension if win.GetFileInfo(fullPath) then local overwrite = far.Message("Файл уже существует. Перезаписать?", "Вопрос", ";YesNo", "w") if overwrite ~= 1 then return end end local file = io.open(fullPath, "wb") if file then file:write(decodedImage) file:close() far.Message("Изображение сохранено успешно!", "Успех") else far.Message("Не удалось сохранить изображение", "Ошибка", nil, "w") end end ------------------------------------------------------------------------------------------------------------------------------------- Macro { area="Editor"; key="CtrlAltI"; flags=""; description="Save Image from Base64 line"; action = function() DecodeBase64Image() end; } ЗЫ: Валидацию самого сохраняемого изображения я не делал. Выделяйте блок аккуратно и правильно |
|
Сообщ.
#29
,
|
|
|
|
Цитата Majestio @ Было бы логично, если бы он сам выделял нужное просто по факту нахождения курсора где-то внутри нужного текста.Выделяйте блок аккуратно и правильно Прикреплённый файл Screenshot_from_2025_11_30_11_26_52.png (57,24 Кбайт, скачиваний: 10)
|
|
Сообщ.
#30
,
|
|
|
|
Цитата Dushevny @ Было бы логично, если бы он сам выделял нужное просто по факту нахождения курсора где-то внутри нужного текста. Возможно, но мне лениво. Особенно если это касается парсинга многострочного src... |