В [[https://www.opennet.me/tips/3018_help_cheat.shtml прошлой заметке]] было показано как, пользуясь сервисом cheat.sh, можно получить краткую справку практически по любой популярной команде UNIX/Linux. Сервис использует для этого популярные репозитории шпаргалок (cheat sheets), такие как tldr, cheat и прочие.Возможности сервиса cheat.sh были расширены, и теперь с его помощью можно получать не только подсказки по командам UNIX/Linux, но и получать ответы на любые вопросы по программированию.
В простейшем случае использование сервиса выглядит следующим образом:
curl cheat.sh/python/append+file
Этот запрос возвращает ответ на вопрос, как дописать файл (append file) в python.
Вместо python в запросе можно указать другой язык программирования (из 55 поддерживаемых
сервисом в настоящий момент):
curl cheat.sh/js/append+file
curl cheat.sh/go/append+file
Возвращаемые запросы отформатированы по умолчанию как код на соотвествующем
языке программирования: текстовые пояснения оформлены как комментарии языка.
Их можно убрать полностью (опция Q) или оставить как незакомментированный текст:
(с комментариями)
$ curl cht.sh/lua/merge+tables
-- Lua - merge tables?
for k,v in pairs(second_table) do first_table[k] = v end
-- [Doug Currie] [so/q/1283388] [cc by-sa 3.0]
(без комментариев)
$ curl cht.sh/lua/merge+tables?Q
for k,v in pairs(second_table) do first_table[k] = v end
Сервис поддерживает множество других опций, описание которых можно получить по запросу /:help
curl cht.sh/:help
Обратите внимание, что к сервису можно обращаться как по полному имени (cheat.sh),
так и по краткому имени cht.sh. Для запросов можно использовать оба протокола HTTP и HTTPS.
Примеры запросов:
curl cht.sh/go/reverse+a+list
curl cht.sh/python/random+list+elements
curl cht.sh/js/parse+json
curl cht.sh/lua/merge+tables
curl cht.sh/clojure/variadic+function
Демонстрация: https://www.opennet.me/opennews/pics_base/0_1530858949.gif
++ cht.sh: Клиент для комадной строки
Сервис не требует инсталляции никакого дополнительного программного обеспечения
за исключением curl (или его альтернатив, таких как wget, httpie или fetch),
однако у него существует одноимённый клиент, cht.sh, который упрощает использование
сервиса и делает его использование более удобным:
$ cht.sh python append file
Клиент поддерживаем режим оболочки (шелла), в котором можно задавать вопросы напрямую,
не вводя каждый раз при этом название языка и не вызывая клиент:
$ cht.sh --shell python
python> append file
...
python> generate random string
...
python> parse json
...
В зкспериментальном режиме сервис поддерживает запросы и на других языках кроме английского:
python> дописать файл
python> скопировать файл
python> переименовать файл
python> рекурсивный обход каталога
python> cd /lua
lua> использовать внешнюю функцию
lua> отсортировать таблицу
js> cd /js
js> асинхронное чтение файла
Все запросы, приведённые выше, произвольны (и все возвращают корректные ответы).
Сервис работает следующим образом: после получения запроса он пытается обработать его пользуясь
данными из доступных репозиториев шпаргалок, таких как tldr, cheat, learnxiny и так далее (а точнее,
их локальных копий, проиндексированных и находящихся в памяти, благодаря чему, в том числе,
достигается такая высокая скорость реакции). В простейших случаях, когда запросы односложны,
и являются, например, названием команд UNIX/Linux, этого оказывается достаточно.
Если же запрос обработать таким образом не удаётся, осуществляется поиск на внешних ресурсах
(в первую очередь stackoverflow.com и других сайтах stackexchange), и если подходящий ответ
найти удалось, он обрабатывается и возвращается пользователю. Код ответа форматируется,
как уже было сказано выше, таким образом, что текст в нём оформляется как комментарии,
код остаётся кодом, а внизу добавляется источник ответа, имя его автора и лицензия, по которой
он распространяется.
Если найденный для ответа вопрос не подходит, следующий можно посмотреть, добавив /номер после него:
python> generate random string
python> generate random string /1
python> generate random string /2
Клиент cht.sh имеет предоставляет ряд других приятных возможностей, таких как:
* автопродолжение;
* история поиска;
* копирование в буфер обмена (C);
и ряда других (для просмотра нужно вызвать help в cht.sh).
Кроме этого к cheat.sh можно обращаться напрямую из текстового редактора.
Демонстрация: https://www.opennet.me/opennews/pics_base/0_1530859122.gif
++ Доступ из редактора
Запросы к cheat.sh, а значит к StackOverflow и к прочим источникам информации, использующимся в cheat.sh,
можно отправлять напрямую из текстового редактора Vim или Emacs.
Для этого нужно установить дополнительные плагины (подробнее в cht.sh/:vim и в cht.sh/:emacs).
После этого запросы можно писать напрямую в коде программы
и получать ответы на них в самом редакторе (в текущем или в отдельном буфере)
или в пейджере.
Предположим, что вы пишете программу на python и вы забыли, как лучше всего можно сгенерировать
случайную строку в нём.
Традиционным решением было бы:
* открыть браузер,
* в нём — google,
* ввести "generate random string",
* получить ссылку на stackoverflow,
* перейти по ней,
* скопировать найденный ответ в буфер обмена,
* вставить его в редактор,
* подправить его под конкретную программу.
Вместо этого, используя плагин cheat.sh-vim:
* ввести запрос прямо в буфере редактора;
* нажать <leader>KP (или <leader>KB, или <leader>KK).
Ответ будет вставлен в код, показан в отдельном буфере редактора (<leader>KB)
или во внешнем пейджере (<leader>KK).
Демонстрация возможностей плагина: https://www.opennet.me/opennews/pics_base/0_1530859160.gif
++ Альтернативные решения
Существуют альтернативные решения, которые позволяют достичь похожих результатов:
* tldr — подсказки по командам UNIX/Linux;
* cheat — подсказкт по командам UNIX/Linux;
* how2 — поиск ответов на stackoverflow из командной строки;
* howdoi — поиск ответов на stackexchange из командной строки.
Все вышеназванные утилиты хорошо справляются с названными задачами.
При этом cheat.sh обладает рядом преимуществом в сравнении с каждой из них:
* Не требует инсталляции, может использоваться везде, где есть curl/wget/httpie или любой HTTP-клиент;
* Предоставляет доступ как к шпаргалкам, так и к ответам на вопросы;
* Намного быстрее чем how2 и howdoi;
* Комментирует пояснительный текст в ответах;
* Может использоваться для автоматических запросов;
* Не требует актуализации репозиториев шпаргалок (как в случае с tldr и cheat);
* Поддерживает запросы на разных языках, в том числе на русском;
* Интеграция с текстовыми редакторами Vim и Emacs;
* Поддерживает Tab-completion (для bash, zsh и fish).
Недостатки (на данный момент):
* Не может работать в оффлайн-режиме (tldr и cheat могут; howdoi и how2 тоже нет).
++ Ссылки
* https://github.com/chubin/cheat.sh &n... главный репозиторий проекта
* https://github.com/dbeniamine/cheat.sh-vim ... плагин для Vim
* https://github.com/davep/cheat-sh.el ... плагин для Emacs
* https://twitter.com/igor_chubin  ... — твиттер главного разработчика проекта (используется для анонса существенных обновлений проектов и новых проектов)
Другие подобные проекты (подмножество функций cheat.sh):
* https://github.com/tldr-pages/tldr &n... подсказки для командной строки
* https://github.com/chrisallenlane/cheat &nb... — подсказки для командной строки
* https://github.com/adambard/learnxinyminutes-docs — краткие учебники по языкам программирования
* https://github.com/gleitz/howdoi &nbs... поиск ответов на вопросы по языкам программирования из командной строки
* https://github.com/santinic/how2 &nbs... поиск ответов на вопросы по языкам программирования из командной строки
Сервисы для терминала:
* curl wttr.in — погода из терминала
* curl rate.sx ; curl rate.sx/btc — курс валют и криптовалют из терминала
* curl qrenco.de — сервис для генерация QR-кода в терминале
* ix.io, sprunge.us, ptpb.pw, 0x0.st, clbin.com — Pastebin для терминала
* curl ifcfg.me, curl ip-addr.es и множество других — определение внешнего IP-адреса в терминале
* https://github.com/chubin/awesome-console-services/ — полный список сервисов для терминала
URL: https://github.com/chubin/cheat.sh
Обсуждается: http://www.opennet.me/tips/info/3070.shtml