Page 2 of 4

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

Posted: Fri 29 Apr, 2016 15:41
by DrKnS

Latest post of the previous page:

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

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

Posted: Fri 29 Apr, 2016 16:25
by HaRT
DrKnS wrote: если вы сможете изобразить regex
Так а на регэкспах что ли свет клином сошёлся?
Можно ж матчить функцией на Lua…

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

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

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

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

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

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

Posted: Sat 30 Apr, 2016 00:25
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 опцию, какой шелл использовать для запуска ком. строки.

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

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

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

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

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

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

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

Posted: Sat 07 May, 2016 23:43
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.

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

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

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

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

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

Posted: Fri 13 May, 2016 22:33
by gene.pavlovsky
Я сомневаюсь, что это возможно... Поэтому предлагаю добавить поддержку оных в дополнение к штатному коду.

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

Posted: Fri 13 May, 2016 22:46
by 2useven10
Может просто ввести штатный способ принудительного выполнения команды через COMSPEC ?
Кажется уже был когда-то момент, что команда начинающаяся с пробела так выполнялась...

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

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

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

Posted: Sat 14 May, 2016 01:02
by 2useven10
DrKnS wrote: Команда, начинающаяся с %comspec% /c, будет так выполняться
Только, если /c отрабатывается как в cmd.exe

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

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