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

Хотите говорить о Far и не знаете, куда обратиться?
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

Latest post of the previous page:

HaRT wrote:Для полноты информации: дружба с разными командными интерпретаторами упрочена реализацией
Имхо, реализация не совсем удобная для использования различных оболочек с одной копией ФАРа, т.к. настройки возможны только для одной оболочки. Можно использовать что-то типа -set:System.Executor.ComspecArguments="/S /C \"{0}\"" (например, через ярлык). Но это настройка запоминается и при обычном запуске там может оказаться сосвсем не то, что нужно.
Разум когда-нибудь победит.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

gene.pavlovsky wrote: сейчас это " <>|&", причём учитываются они только тогда, когда не в кавычках
Ну если вы сможете изобразить regex, под который попадают "<>|& не в кавычках" и если каким-нибудь другим регексом можно матчить эти ваши $VAR, \$ и т. п. то я буду только рад выкинуть текущий кусок кода в пользу такого регекса из far:config.
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

DrKnS wrote: если вы сможете изобразить regex
Так а на регэкспах что ли свет клином сошёлся?
Можно ж матчить функцией на Lua…
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

HaRT wrote: Можно ж матчить функцией на Lua…
Мне бы не хотелось, чтобы без lua в фаре не работал (или работал неполноценно) запускатель.
Это базовая функциональность и она должна быть всегда.
"Давайте сделаем функцию на луа" - это отдельный вопрос.
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

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

Post by gene.pavlovsky »

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

И действительно всё-таки хочется подумать, нужна ли возможность быстрой подмены shell-а? Хочется, чтобы этот процесс можно было выполнить одной командой (например bat файлом) или макросом.
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

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

Post by gene.pavlovsky »

Имхо пускай текущий код будет заточен под 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: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

gene.pavlovsky wrote:сделать один из следующих вариантов?
1. Запускать бат-файлы через cmd.exe (far:config опция или хардкод, если не установлена). Использовать ComSpec для запуска ком. строки.
2. Запускать бат-файлы через ComSpec. Добавить другую far:config опцию, какой шелл использовать для запуска ком. строки.
3. Запускать батники через их системную ассоциацию (по возможности в этой же консоли), а уж если ассоциации нет, то 1 или 2.
Фар есть инструмент, а не нянька. © 2009 DrKnS
MDM
Posts: 90
Joined: Fri 02 Dec, 2005 20:47
Location: Москва
Has thanked: 4 times
Been thanked: 2 times

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

Post by MDM »

gene.pavlovsky wrote: Я не знаю, какова практика использования этой переменной в мире винды
Странно звучит. Что прописано в %comspec%, то и является шеллом по умолчанию. Насколько этот шелл отвечает требованиям каждый решает сам. Может у кого-нибудь в %comspec% notepad.exe -- сколько пользователей, столько причуд.
gene.pavlovsky wrote: понятно, что bash не может выполнять bat/cmd файлы.
bash и perl-скрипты не выполняет, и python и ruby тоже не выполняет. Неожиданно однако. Ну так запускайте командные файлы через cmd /c
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

gene.pavlovsky wrote:1. Запускать бат-файлы через cmd.exe (far:config опция или хардкод, если не установлена). Использовать ComSpec для запуска ком. строки.
2. Запускать бат-файлы через ComSpec. Добавить другую far:config опцию, какой шелл использовать для запуска ком. строки.
Непонятно, что с этим делать при использовании TakeCommand. Во-первых, там есть свои "батники" с расширением btm, во-вторых, там есть свои ассоциации, которые можно назначить (переназначить) прямо в командном файле, в том числе и bat и cmd.
Разум когда-нибудь победит.
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

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

Post by gene.pavlovsky »

Мои последние продвижения по теме - 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: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

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

Post by gene.pavlovsky »

DrKnS wrote:
gene.pavlovsky wrote: сейчас это " <>|&", причём учитываются они только тогда, когда не в кавычках
Ну если вы сможете изобразить regex, под который попадают "<>|& не в кавычках" и если каким-нибудь другим регексом можно матчить эти ваши $VAR, \$ и т. п. то я буду только рад выкинуть текущий кусок кода в пользу такого регекса из far:config.
А всё-таки, как насчёт добавить возможность делать это регэкспом из far:config или функцией на луа? Регэксп (если указан), или функция могут быть опциональным дополнением к уже имеющемуся штатному коду.
Пока для bash нашёл такой выход - если какая-то команда выполняется не через ComSpec, а хочется через него, то в начале строки добавить `:;`
`:` - это в bash ничего не делать (no-op), а `;` - конец команды, всё что после `;` тогда выполняется. Кстати какая-то занятная вещь, если написать просто команду `;`, то вызывается "=Folders==", что это такое?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

gene.pavlovsky wrote: А всё-таки, как насчёт добавить возможность делать это регэкспом из far:config
Ну в процитированном же всё написано: изобразите регекс, который матчит дефолтный "<>|& не в кавычках" - добавим.
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

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

Post by gene.pavlovsky »

Я сомневаюсь, что это возможно... Поэтому предлагаю добавить поддержку оных в дополнение к штатному коду.
2useven10
Posts: 5204
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

Может просто ввести штатный способ принудительного выполнения команды через COMSPEC ?
Кажется уже был когда-то момент, что команда начинающаяся с пробела так выполнялась...
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

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

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

Post by 2useven10 »

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

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