Есть ли способ заставить bash иметь подсветку синтаксиса, как у рыбы?

41

В командной оболочке рыбы выделена синтаксическая строка:

введите описание изображения здесь

Есть ли способ получить такое же поведение в bash?

Есть что-то подобное, но для zsh, а не для bash. Возможно ли, что это может быть перенесено на bash?

Чтобы уточнить для тех, кто не понимает скриншот, объяснение или предоставленную ссылку: Я хочу выделить фактический текст, который вводится в терминале. Команды, скобки, кавычки и т. Д.

Wuffers
источник
Не думайте, что bash принимает плагины, как zsh, поэтому может потребоваться специальная сборка оболочки / двоичного файла bash. Есть ли причина не использовать рыбу? Кроме того, спасибо, что указали мне на другую оболочку, чтобы поиграть и посмотреть, смогу ли я изучить некоторые дополнительные возможности хаха.
Матрица Крот
1
@Matrix: я не могу использовать рыбу, потому что у меня очень сложная конфигурация bash, от которой я не мог отказаться.
Вуфферс
К сожалению, я не думаю, что в настоящее время это возможно в bash. Я уверен, что проведенное вами исследование также указывает на это. Если вы абсолютно не можете переключиться на zsh, это понятно, но в противном случае вы можете захотеть взглянуть на fizsh, который включает в себя некоторые похожие на рыбу функции в zsh, хотя он не обновлялся с февраля, так что, возможно, ссылка на подсветку синтаксиса zsh то, что вы предоставили, было бы более надежным.
voithos
1
Это было бы чрезвычайно полезно для изучения bash, так как оно позволяет играть совершенно по-другому. Простое обнаружение того, что вы забыли убежать от специального персонажа, будет ценно.
Sirap

Ответы:

8

Bash использует readlineдля интерактивного ввода, поэтому подсветка синтаксиса должна быть реализована в этой программе. Я нашел обсуждение в группах Google о том, как закодировать такую ​​функцию.

Оболочка fish использует собственный редактор строк, специфичный для этой программы, и его нельзя перенести напрямую.

Вы можете обнаружить, что zshэто очень похоже на bash, и его редактор строк является расширяемым . Я нашел zsh-syntax-подсветку, чтобы включить эту функцию в zsh.

razzintown
источник
1

Нет простого способа получить подсветку синтаксиса в GNU Bash (или GNU Readline), но в принципе возможно реализовать собственный редактор строк в сценариях Bash, привязав все пользовательские входные данные к функциям оболочки с помощью встроенной команды bind -x 'BYTE: SHELL-COMMAND'. Конечно, можно интегрировать функцию подсветки синтаксиса в свой собственный редактор строк.

Фактически я реализовал линейный редактор ble.shс такими функциями, как подсветка синтаксиса и автоматические предложения. Он поддерживает Bash 3.0--5.0. Поскольку он написан в (почти) чистых скриптах Bash, вы можете просто написать sourceскрипт ~/.bashrc. Вот пример для настройки ble.shв bashrc (см. README ):

$ git clone https://github.com/akinomyoga/ble.sh.git
$ cd ble.sh
$ make
$ make INSDIR="$HOME/.local/share/blesh" install
# bashrc

# Add the following line at the beginning of bashrc
[[ $- == *i* ]] &&
  source "$HOME/.local/share/blesh/ble.sh" --attach=none

# ... other bashrc settings ...

# Add the following line at the end of bashrc
((_ble_bash)) && ble-attach

Примечание : я знаю, что иногда ответы на вопросы со ссылками на собственные продукты считаются саморекламой и неприемлемыми, поэтому я воздерживался от ответа на этот вопрос. Однако никаких других решений не появилось долгое время, а также этот вопрос имеет много точек зрения (что отражает его значительный спрос). Поэтому я решил ответить на этот вопрос сегодня. Ссылаясь на следующие мета вопросы / ответы, я сначала описал идею, а затем предоставил ссылку на мой проект в качестве примера реализации.

Да, я должен признать, что это на самом деле самореклама , но я считаю, что это помогает людям, которые хотят эту функцию. Если есть проблемы, я был бы признателен, если бы вы могли сказать мне это в комментариях.

akinomyoga
источник
-1

Я не думаю, что подсветка синтаксиса должна происходить на уровне оболочки, но на уровне интерфейса (только мое мнение - и чье-то другое кажется), поэтому я бы посмотрел на «плагины» для терминала или вашей любимой консоли, например, этот плагин для Кейт может помочь, или этот другой, который предлагает подсветку синтаксиса в нано

Вот еще больше разговоров о том, как подсветить синтаксис в терминале:

Добавьте псевдоним ls = 'ls -G' в .bash_profile.

хотя тут лучше объяснили как

Надеюсь, это поможет

Purefan
источник
11
Похоже, вы отвечаете, как настроить подсветку синтаксиса в редакторах, а не в оболочке. Ls-colorization - это даже не подсветка синтаксиса.
Кайл Стрэнд
Я думаю, что вы сосредотачиваетесь на семантике больше, чем на решении, с помощью кода из ссылок и предлагаемого решения я получаю цвета в bash, что, как я полагаю, это то, что ОП хотел знать
Purefan
10
Оригинальный вопрос на самом деле довольно ясно о фактической подсветке синтаксиса. Это показано как на скриншоте оболочки рыбы, так и в последнем предложении: «Я хочу выделить фактический текст, который вводится в терминале. Команды, скобки, кавычки и т. Д.»
Кайл Стрэнд,
9
Как я уже сказал, это не подсветка синтаксиса. Они выделяют вывод команды в lsзависимости от типа файла, который не имеет ничего общего с синтаксисом оболочки.
Кайл Стрэнд
2
Zsh ( github.com/zsh-users/zsh-syntax-highlighting ) и Fish ( fishshell.com/docs/current/tutorial.html ) оба имеют подсветку синтаксиса, этот вопрос, очевидно, задает вопрос об аналогичной функции для bash. Это совершенно обоснованный запрос, чтобы запросить функцию, которую «сложно реализовать и поддерживать согласованной», особенно если она уже существует в других оболочках
Брэндон