Подружить Far и bash (Cygwin и другие)

Хотите говорить о Far и не знаете, куда обратиться?
User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Подружить Far и bash (Cygwin и другие)

Post by DrKnS » Fri 29 Apr, 2016 15:41

Latest post of the previous page:

gene.pavlovsky wrote: сейчас это " <>|&", причём учитываются они только тогда, когда не в кавычках
Ну если вы сможете изобразить regex, под который попадают "<>|& не в кавычках" и если каким-нибудь другим регексом можно матчить эти ваши $VAR, \$ и т. п. то я буду только рад выкинуть текущий кусок кода в пользу такого регекса из far:config.

User avatar
HaRT
Moderator
Posts: 7980
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 66 times
Been thanked: 97 times

Подружить Far и bash (Cygwin и другие)

Post by HaRT » Fri 29 Apr, 2016 16:25

DrKnS wrote: если вы сможете изобразить regex
Так а на регэкспах что ли свет клином сошёлся?
Можно ж матчить функцией на Lua…
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Подружить Far и bash (Cygwin и другие)

Post by DrKnS » Fri 29 Apr, 2016 17:11

HaRT wrote: Можно ж матчить функцией на Lua…
Мне бы не хотелось, чтобы без lua в фаре не работал (или работал неполноценно) запускатель.
Это базовая функциональность и она должна быть всегда.
"Давайте сделаем функцию на луа" - это отдельный вопрос.

gene.pavlovsky
Posts: 157
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

Подружить Far и bash (Cygwin и другие)

Post by gene.pavlovsky » Fri 29 Apr, 2016 22:36

DrKnS wrote:Ну если вы сможете изобразить regex, под который попадают "<>|& не в кавычках" и если каким-нибудь другим регексом можно матчить эти ваши $VAR, \$ и т. п. то я буду только рад выкинуть текущий кусок кода в пользу такого регекса из far:config.
Регэксом тут вряд ли обойтись. Нужен примитивный парсер, некий state machine, написанный под конкретный shell с его особенностями. Это целый гемор и вряд ли кто будет так сильно заморачиваться, да и нелогично это хардкодить в execute.cpp. Тут либо надо выносить возможность подменять эту функцию плагинными или макросовыми, или перестраховываться и всё выполнять в режиме external, кроме разве что запуска известных команд без аргументов, или с аргументами без всяких спецсимволов, определяемых просто строчкой с набором символов, или же допустим регэксом из конфига или массивом из регэксов. Текущий код - весьма узкоспециализированный, рассчитан на cmd-подобные шеллы. Т.к. фар родом из виндовс, логично, что он интегрирован, но хотелось бы иметь возможность его целиком подменять.

И действительно всё-таки хочется подумать, нужна ли возможность быстрой подмены shell-а? Хочется, чтобы этот процесс можно было выполнить одной командой (например bat файлом) или макросом.

gene.pavlovsky
Posts: 157
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

Подружить Far и bash (Cygwin и другие)

Post by gene.pavlovsky » Sat 30 Apr, 2016 00:25

Имхо пускай текущий код будет заточен под cmd и иже с ними, и работает без всяких луа и прочих опций конфига. И бат/cmd файлы выполняет через cmd. И при этом чтоб была возможность написать или плагин, или луа-функции для интегрирования любого другого кастом шелла. Это и код фара не загромождается, и полные возможности кастомизации шелла. Тут у меня такой вопрос про батники - понятно, что bash не может выполнять bat/cmd файлы. Судя по описанию переменной ComSpec в википедии, это именно command line interpreter, а не batch file interpreter. Я не знаю, какова практика использования этой переменной в мире винды, но вопрос такой - не было ли разумно сделать один из следующих вариантов?
1. Запускать бат-файлы через cmd.exe (far:config опция или хардкод, если не установлена). Использовать ComSpec для запуска ком. строки.
2. Запускать бат-файлы через ComSpec. Добавить другую far:config опцию, какой шелл использовать для запуска ком. строки.

User avatar
HaRT
Moderator
Posts: 7980
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 66 times
Been thanked: 97 times

Подружить Far и bash (Cygwin и другие)

Post by HaRT » Sat 30 Apr, 2016 01:02

gene.pavlovsky wrote:сделать один из следующих вариантов?
1. Запускать бат-файлы через cmd.exe (far:config опция или хардкод, если не установлена). Использовать ComSpec для запуска ком. строки.
2. Запускать бат-файлы через ComSpec. Добавить другую far:config опцию, какой шелл использовать для запуска ком. строки.
3. Запускать батники через их системную ассоциацию (по возможности в этой же консоли), а уж если ассоциации нет, то 1 или 2.
Фар есть инструмент, а не нянька. © 2009 DrKnS

MDM
Posts: 86
Joined: Fri 02 Dec, 2005 20:47
Location: Москва
Has thanked: 2 times
Been thanked: 2 times

Подружить Far и bash (Cygwin и другие)

Post by MDM » Sat 30 Apr, 2016 14:06

gene.pavlovsky wrote: Я не знаю, какова практика использования этой переменной в мире винды
Странно звучит. Что прописано в %comspec%, то и является шеллом по умолчанию. Насколько этот шелл отвечает требованиям каждый решает сам. Может у кого-нибудь в %comspec% notepad.exe -- сколько пользователей, столько причуд.
gene.pavlovsky wrote: понятно, что bash не может выполнять bat/cmd файлы.
bash и perl-скрипты не выполняет, и python и ruby тоже не выполняет. Неожиданно однако. Ну так запускайте командные файлы через cmd /c

Smitis
Posts: 1440
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 22 times
Contact:

Подружить Far и bash (Cygwin и другие)

Post by Smitis » Sun 01 May, 2016 10:39

gene.pavlovsky wrote:1. Запускать бат-файлы через cmd.exe (far:config опция или хардкод, если не установлена). Использовать ComSpec для запуска ком. строки.
2. Запускать бат-файлы через ComSpec. Добавить другую far:config опцию, какой шелл использовать для запуска ком. строки.
Непонятно, что с этим делать при использовании TakeCommand. Во-первых, там есть свои "батники" с расширением btm, во-вторых, там есть свои ассоциации, которые можно назначить (переназначить) прямо в командном файле, в том числе и bat и cmd.
Разум когда-нибудь победит.

gene.pavlovsky
Posts: 157
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

Подружить Far и bash (Cygwin и другие)

Post by gene.pavlovsky » Sat 07 May, 2016 23:43

Мои последние продвижения по теме - https://dl.dropboxusercontent.com/u/494 ... comspec.7z
В комплекте:
- bashcmd.exe (с исходниками) - его ставим ComSpec-ом. Он квотирует кавычки и бэкслэши в команде так, чтобы bash воспринял в точности то, что ввёл на ком. строке пользователь. Если поставить set BASHCMD_CDEBUG=1, выводит отладочную информацию. В far:config System.Executor.ComspecArguments менять не требуется - использовать те, что для cmd (/S /C "{0}").
- bashcmd.sh - wrapper script. Подключает специальный rcfile (у меня это /etc/bash.bashcmdrc), там могут быть алиасы, настройки шелла (shopt, set), доп. переменные среды и т.д. Проверяет, если выполняемая команда - это запуск файла bat|cmd|vbs|vbe|js|jse|wsf|wsh|msc, то выполняет его через cmd, иначе выполняет команду bash-ем (в том же процессе, с помощью eval). Если поставить set BASHCMD_DEBUG=1, выводит отладочную информацию. Полезно, чтобы понять, когда Far вызывает команды через ComSpec, а когда напрямую.
- Bash.lua - макросы для быстрого переключения ComSpec между cmd и bash. Также по AltEnter (работает только, если у вас есть скрипт XKeys, иначе поменяйте) можно выполнить текущую команду или текущий файл (если ком строка пуста) в альтернативном (не текущем) ComSpec.

gene.pavlovsky
Posts: 157
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

Подружить Far и bash (Cygwin и другие)

Post by gene.pavlovsky » Fri 13 May, 2016 21:01

DrKnS wrote:
gene.pavlovsky wrote: сейчас это " <>|&", причём учитываются они только тогда, когда не в кавычках
Ну если вы сможете изобразить regex, под который попадают "<>|& не в кавычках" и если каким-нибудь другим регексом можно матчить эти ваши $VAR, \$ и т. п. то я буду только рад выкинуть текущий кусок кода в пользу такого регекса из far:config.
А всё-таки, как насчёт добавить возможность делать это регэкспом из far:config или функцией на луа? Регэксп (если указан), или функция могут быть опциональным дополнением к уже имеющемуся штатному коду.
Пока для bash нашёл такой выход - если какая-то команда выполняется не через ComSpec, а хочется через него, то в начале строки добавить `:;`
`:` - это в bash ничего не делать (no-op), а `;` - конец команды, всё что после `;` тогда выполняется. Кстати какая-то занятная вещь, если написать просто команду `;`, то вызывается "=Folders==", что это такое?

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Подружить Far и bash (Cygwin и другие)

Post by DrKnS » Fri 13 May, 2016 21:11

gene.pavlovsky wrote: А всё-таки, как насчёт добавить возможность делать это регэкспом из far:config
Ну в процитированном же всё написано: изобразите регекс, который матчит дефолтный "<>|& не в кавычках" - добавим.

gene.pavlovsky
Posts: 157
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

Подружить Far и bash (Cygwin и другие)

Post by gene.pavlovsky » Fri 13 May, 2016 22:33

Я сомневаюсь, что это возможно... Поэтому предлагаю добавить поддержку оных в дополнение к штатному коду.

2useven10
Posts: 2954
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 77 times

Подружить Far и bash (Cygwin и другие)

Post by 2useven10 » Fri 13 May, 2016 22:46

Может просто ввести штатный способ принудительного выполнения команды через COMSPEC ?
Кажется уже был когда-то момент, что команда начинающаяся с пробела так выполнялась...

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Подружить Far и bash (Cygwin и другие)

Post by DrKnS » Fri 13 May, 2016 23:55

gene.pavlovsky wrote: Я сомневаюсь, что это возможно...
https://google.com/search?q=regex+match+not+in+quotes
2useven10 wrote: Может просто ввести штатный способ принудительного выполнения команды через COMSPEC ?
Кажется уже был когда-то момент, что команда начинающаяся с пробела так выполнялась...
Штатный способ принудительного выполнения команды через COMSPEC уже введён.
Команда, начинающаяся с %comspec% /c, будет так выполняться, я гарантирую это.

2useven10
Posts: 2954
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 77 times

Подружить Far и bash (Cygwin и другие)

Post by 2useven10 » Sat 14 May, 2016 01:02

DrKnS wrote: Команда, начинающаяся с %comspec% /c, будет так выполняться
Только, если /c отрабатывается как в cmd.exe

gene.pavlovsky
Posts: 157
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

Подружить Far и bash (Cygwin и другие)

Post by gene.pavlovsky » Sat 14 May, 2016 01:12

DrKnS wrote:
gene.pavlovsky wrote: Я сомневаюсь, что это возможно...
https://google.com/search?q=regex+match+not+in+quotes
Понял, я просто look-behind в regexp ранее не пользовался. Попробую завтра изобразить регэксп тогда.

gene.pavlovsky
Posts: 157
Joined: Tue 11 Aug, 2015 16:53
Has thanked: 11 times

Подружить Far и bash (Cygwin и другие)

Post by gene.pavlovsky » Sun 15 May, 2016 19:26

DrKnS wrote:Ну в процитированном же всё написано: изобразите регекс, который матчит дефолтный "<>|& не в кавычках" - добавим.
В фаре увидел RegExp.cpp/hpp, только не знаю, как им пользоваться. Просто подключение RegExp.hpp к пустому проекту Win32 Console application в VS 2015 выдаёт кучу ошибок при попытке компиляции.

В-общем, я пробовал с std::regex, но вот только они не поддерживают lookbehind.
Если с lookbehind (например PCRE), то:
(?<=^(?:[^"]*|"[^"]*")*)[<>|&]
Тестил в RegexBuddy (тип регэкспа - PCRE или C#).

Без lookbehind-а, работает с std::regex:
^(?:[^\"]|\"[^\"]*\")*?[<>|&]

Code: Select all

#include <iostream>
#include <regex>

using namespace std;

void testRX(wstring str, wregex rx, bool expectedResult) {
	bool result = regex_search(str, rx);
	wcout << L"\"" << str << L"\": " << endl << "  " << (result ? "true" : "false");
	if (result != expectedResult)
		wcout << L" FAILED";
	wcout << endl;
}

int main() {
	wregex tooComplexRX(L"^(?:[^\"]|\"[^\"]*\")*?[<>|&]");
	testRX(L"grep word file", tooComplexRX, false);
	testRX(L"grep \"[<>|&]\" file", tooComplexRX, false);
	testRX(L"echo \"&\"", tooComplexRX, false);
	testRX(L"grep word file | grep word2", tooComplexRX, true);
	testRX(L"grep word file && echo found", tooComplexRX, true);
	testRX(L"backup 2>err.log", tooComplexRX, true);
}
Last edited by gene.pavlovsky on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: [c]

Post Reply

Return to “Обсуждение Far Manager”

Who is online

Users browsing this forum: No registered users and 4 guests