Время на прочтение18 мин
Количество просмотров447K
Часто путают терминал и шелл. В тех же *nix есть шеллы (bash, csh, zsh, …) и терминалы (konsole/guake/yaquake/tilda и т.д. и т.п.) Для мира Windows общеизвестный терминал только один – стандартное консольное окошко, которое часто ошибочно называют «cmd.exe». И мало кто знает о существовании множества других эмуляторов терминала. Известных шеллов больше, их целых два: cmd.exe и powershell.exe. И хотя есть как минимум три порта bash (MinGW, CygWin, GIT) многие юниксоиды предпочитают ругать cmd.exe.
Меня не устраивал ни один из найденных альтернативных терминалов (как в 2009-м, когда я начал работу над ConEmu, так и сейчас). Казалось бы требований немного, вот основные:
- работа с консольными приложениями, использующими консольное API: например Far просто не запустится в mintty или PowerShell ISE;
- визуальные улучшения вроде табов (вкладок) и split-screen;
- быстрая и удобная работа с пометкой/копированием/вставкой текста;
- должен быть похож на терминал, а не на рождественскую игрушку с кучей графических свистелок и сопелок которые даже отключить нельзя;
- не должен зависеть от сторонних библиотек типа .Net, Qt, VC/GCC redist и прочих устанавливаемых пакетов, занимать по возможности мало места и не требовать инсталляции на новую машину;
- наконец, мне, как приверженцу Far Manager, хотелось интеграции с этим файловым менеджером — редакторы и вьюверы в табах, drag&drop файлов между Far и другими приложениями и т.п.
Отвечает ли этим требованиям ConEmu? Терминал (Free & OpenSource) пишется программистом «для себя» с учетом пожеланий других пользователей программы. В минимально-необходимой комплектации занимает около 2 мегабайт, что конечно больше нескольких килобайт, но все-таки пренебрежимо мало. Установки не требует, может быть портабельным если рядом с ConEmu.exe создать файлик ConEmu.xml. От сторонних библиотек не зависит.
Обзор возможностей
Рассказать «про все» в рамках одной статьи невозможно, поэтому здесь описаны только некоторые функции, на мой взгляд наиболее интересные большинству пользователей.
Наглядность. В табах могут отображается не только заголовки консолей, но и дополнительная информация вроде активного процесса, прогресса архивации, chkdsk, powershell, копирования в Far Manager. Например, не нужно переключаться в таб чтобы узнать закончилась ли компиляция проекта, запущенная в этом табе. В статусной строке можно настроить список отображаемых «колонок» вроде координат видимой области и курсора, PID активного процесса в консоли, статусов CAPS/NUM/SCRL, коэффициента прозрачности и др. Многие колонки кликабельны, например можно щелкнуть по «колонке» с прозрачностью для быстрого ее изменения.
Минималистичность. Интерфейс (самого терминала, а не окна настроек) содержит всего два дополнительных графических элемента — табы и статусная строка. Но и их можно отключить, если вы предпочитаете «чистую» консоль.
Портабельность. Настройки можно хранить в файле ConEmu.xml созданном в папке программы.
Работа с текстом. Поддерживаются два стиля пометки текста — обычный для текстовых редакторов и «прямоугольный» как в обычной консоли. Пометка и вставка текста удобна как с клавиатурой так и с мышкой.
Quake/Tilda. Поддержка режима игровых консолей. Терминал умеет «выезжать» при нажатии выбранной комбинации клавиш (по умолчанию Ctrl+~) и прятаться при потере фокуса или нажатии Esc.
Запуск любых приложений. Пользователь может настроить любое количество предопределенных задач (Task) для быстрого запуска в ConEmu или из списка переходов (jump list) панели задач Windows 7. Задача может запускать один или несколько процессов или шеллов (powershell, SDK, компиляция проектов и т.д.) Можно даже запускать простые GUI приложения вроде PuTTY, TaskManager, GVim.
Работа с цветом. Несколько предопределенных палитр (например Solarized, PowerShell, xterm, и др.), возможность настройки своих цветов консоли, поддержка управляющих кодов ANSI X3.64, 24-битный цвет при работе в Far Manager.
Интеграция. Умеет добавлять себя (и выбранные команды-шеллы) в контекстное меню Windows Explorer. Умеет перехватывать создание стандартного терминала Windows.
Гибкая настройка и управление. В диалоге Settings можно найти настройки на любой вкус и цвет. Практически любому действию можно назначить комбинацию клавиш, а простейший макро-язык позволяет выполнять нестандартные действия.
Немного истории
В начале был Zoin и его анонс Эмулятор консоли на форуме Far Manager. Не знаю, планировал ли автор развитие эмулятора, но в 2009-м году появилось несколько форков предлагающих разные улучшения: вертикальную прокрутку, табы для редакторов и вьюверов Far, отображение контекстного меню для файлов по правой кнопке и перетаскивание файлов между консольным Far и другими приложениями. Идея мне понравилась и, объединив все «патчи», я стал развивать эмулятор добавляя новые возможности и исправляя баги. На тот момент было несколько альтернатив (самые известные – Console2 из бесплатных и TakeCommand из платных), но ни одна у меня не прижилась. «Пользуюсь фаром 15 лет» поэтому в первую очередь нужна была оболочка для него.
Установка
ConEmu можно скачать с оф.сайта в двух вариантах: инсталлятор и 7z архив. Разницы между ними в общем-то никакой, просто инсталлятор умеет создавать ярлыки и позволяет отключить не нужные части продукта. Рекомендую пробовать последние Alpha-версии, т.к. с момента выхода последнего Stable прошло много времени, исправлено много багов, появилось много новых возможностей.
Для адептов bash на зеркале проекта есть специально подготовленные пакеты для MinGW. Их достаточно развернуть в папку MinGW чтобы в ConEmu сразу запускался «sh.exe –login –i».
Пользователям Far Manager: для полноценной работы в Far должны быть загружены плагины ConEmu. Убедитесь, что при использовании инсталлятора плагины устанавливаются в подпапку Plugins вашего каталога с Far.exe. Обратите внимание, что инсталлятор позволяет выбрать папку установки как для самого ConEmu так и для плагинов к Far.
Пользователям антивирусов: инсталлятор как и сам ConEmu троянов не содержит, как говорится, «исходники открыты».
При первом запуске программа спросит где вы предпочитаете хранить настройки — в файле ConEmu.xml или в реестре.
Теперь можно запускать ConEmu.exe или ConEmu64.exe (разница между 32-битной и 64-битной версией отсутствует).
По умолчанию ConEmu при старте запускает один таб с «предпочитаемым» шеллом:
- Far.exe (если найден рядом с ConEmu.exe);
- cmd.exe или tcc.exe (если установлен TakeCommand или TCC/LE);
- sh.exe (если ConEmu установлен в режиме «MinGW»).
Первый запуск
При первом запуске отображается диалог «Fast configuration», он содержит несколько основных опций влияющих на работу программы.
Install keyboard hooks. ConEmu умеет отбирать у системы определенные комбинации клавиш (когда в фокусе окно программы). Например Win+цифра можно переключаться на таб с определенным номером. Практически все комбинации клавиш с ConEmu настраиваются или отключаются (Win+Alt+K), но если вам вообще не нужен перехват комбинаций с модификатором Win – можете отключить флажок.
Inject ConEmuHk.dll. Для многих возможностей ConEmu требуется перехват определенных функций WinAPI. Библиотека ConEmuHk.dll (или ее 64-битная версия ConEmuHk64.dll) внедряется в запускаемые во вкладках ConEmu процессы и перехватывает функции через разделы импорта. К сожалению, перехватываемых функций становится все больше и соответственно увеличивается время перехвата. И хотя в цифрах это лишь миллисекунды, некоторые пользователи жалуются на замедление выполнения команд в ConEmu. Если вы из них – отключите этот флажок. В планах попробовать перейти на перехват в стиле detours, возможно это ускорит процесс.
Enable automatic updates. Думаю, в переводе не нуждается. Обновление выполняется тем же способом, что и при установке. То есть если вы установили ConEmu распаковкой 7z–архива, то для обновления потребуется архиватор (7–zip или WinRar).
Настройка
В принципе, ConEmu работает сразу и настройки не требует, но у любого пользователя/админа/программиста есть свои предпочтения и специфика работы.
Полный диалог настроек открывается либо с клавиатуры комбинацией Win+Alt+P либо вызовом из системного меню ConEmu пункта «Settings».
Можно заблудиться в куче вкладок и настроек, но все настройки сгруппированы по смыслу, а для неочевидных опций отображаются всплывающие подсказки при наведении курсора мышки. Наверное не стоит рассказывать в этой статье про каждую опцию, поэтому пробежимся только по основным и наиболее интересным.
Выбор шелла
Итак, скорее всего вам нужно будет настроить свой список шеллов, как запускаемых при старте, так и быстро доступных.
Идем на вкладку «Startup». Если нужно запускать только один шелл — все просто: выбираем «Command line» и вводим требуемое, например:
C:\MinGW\msys\1.0\bin\sh.exe --login -i
В принципе, в качестве шелла можно запускать любое консольное приложение или командный файл для cmd, python, и т.п. Можно даже запускать некоторые GUI приложения вроде PuTTY, notepad, gvim и т.п.
Если при старте нужно запустить сразу несколько шеллов — идем на вкладку «Tasks» (задачи) и начинается магия. Диалог настроек и так перегружен, поэтому задачи создаются «в текстовом виде».
>C:\MinGW\msys\1.0\bin\sh.exe --login -i
cmd /k set ConEmuHooks=OFF & "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" -new_console:sV -new_console:t:SDK & set ConEmuHooks=
cmd -new_console:s1TH
*powershell -new_console:s2TH -new_console:t:PowerShell
Называем его «Shells», возвращаемся на вкладку «Startup» и выбираем «Specified named task».
В итоге при старте ConEmu получаем 4 консоли в сетке 2×2 причем активной будет вкладка sh.exe, а powershell.exe запускается в режиме админа (после подтверждения UAC) и его вкладка получает фиксированное название «PowerShell».
Параметр «-new_console» специальный параметр, обрабатывающийся в ConEmu и вырезающийся из командной строки при запуске программы. О нем можно писать много и долго, а пока отошлю на сайт проекта.
Запуск новых консолей
Если отображается панель кнопок (toolbar) то кнопка [+] открывает диалог запуска новой консоли. Здесь можно указать любую программу с параметрами, выбрать строку запуска из истории или выбрать заранее созданную задачу. Здесь можно создать «split», запустив новую консоль на одном экране с текущей. «Run as administrator» запускает новую консоль в режиме администратора. Флажок «New window» запустит новый процесс ConEmu.exe с выбранной командой.
На панели кнопок у кнопки [+] есть «стрелка» для открытия меню. Это же меню можно открыть комбинацией Win+N. Здесь отображаются команды из истории и заранее созданные задачи. Правый щелчок мышкой по пункту с задачей открывает меню второго уровня со списком команд этой задачи – так можно посмотреть ее содержимое или запустить только одну из команд задачи.
Можно создать ярлык и запускать новую консоль в уже запущенной копии ConEmu. Например, создайте на рабочем столе ярлык для запуска Far Manager (считаем что Far и ConEmu установлены в папку C:\Far)
"C:\Far\ConEmu.exe" /single /cmd "C:\Far\Far.exe"
Запуск из списка переходов (Jump List) панели задач Windows 7. Отсюда удобно запускать наиболее употребительные задачи, например запуск компиляции ваших проектов.
Быстрый запуск по комбинации клавиш. Если ярлыков (хоткей можно задать в свойствах ярлыка) и задач (Win+N и цифра номера задачи) не хватает – можно создать макрос запуска любой команды. Откройте вкладку «Keys & Macro» диалога настройки (Win+Alt+K), выберите один из «Macro NN» и введите в поле «GUI Macro» что-то вроде:
shell("",@"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe")
Поддерживаются два синтаксиса строк: C-string где используются \r\n\t\a\e\"\\, и Verbatim-string вроде @"app.exe ""C:\My Documents\File.txt""".
Из командной строки шелла, запущенного во вкладке ConEmu можно запустить новую вкладку с помощью специального параметра -new_console. Его опции позволяют запускать вкладки в режиме администратора, под другим пользователем, включать и отключать подтверждение закрытия после завершения команды, запускать вкладки «в фоне», разбить активную консоль вертикально или горизонтально (split-screen).
cmd /c dir /s c:\ -new_console:bc
или использовать cmd-файл, включенный в поставку ConEmu
csudo dism.exe /online /enable-feature /featurename:NetFX3 /All /Source:D:\sources\sxs /LimitAccess
В контекстном меню таба (правый клик на табе или Shift+правый клик в консоли) есть пункт «Duplicate root». Он создает копию шелла в новой вкладке. Например в текущей вкладке cmd вы запустили компиляцию проекта, при вызове «Duplicate root» будет создана новая вкладка с тем же текущим путем, что был до запуска компиляции, и с теми же переменными окружения.
Аналогично действуют комбинации клавиш Ctrl+Shift+O и Ctrl+Shift+E, но они создают копию шелла, разбивая активную консоль вертикально или горизонтально (split-screen).
Пометка, копирование и вставка текста
Настроек на вкладках «Mark & Paste» и «Controls» много. Расскажу об умолчаниях.
Поддерживается два типа пометки текста:
- Text selection — стандарт для текстовых редакторов;
- Block selection — прямоугольные блоки, как в обычной консоли.
Варианты для начала пометки в стиле «Text selection»: Shift+СтрелкаВлево, Shift+СтрелкаВправо или удерживая ЛевыйShift начните пометку мышкой (drag с зажатой левой кнопкой мышки).
Варианты для начала пометки в стиле «Block selection»: Shift+СтрелкаВверх, Shift+СтрелкаВниз или удерживая ЛевыйAlt начните пометку мышкой (drag с зажатой левой кнопкой мышки).
Примечание: при работе в Far Manager Shift+Стрелка обрабатываются в Far а не в ConEmu.
Копирование в буфер обмена помеченного блока с клавиатуры: Ctrl+C или Enter. Нажатие Esc отменяет пометку.
При пометке текста мышкой копирование выполняется сразу при отпускании левой кнопки мышки.
Вставка текста из буфера обмена
Ctrl+V вставляет только первую строку из буфера обмена. Почему только первую? Чаще всего в терминале запущен шелл и было бы обидно, если команда начнет выполняться до того как вы проведете ревизию того, что вставилось в консоль.
Shift+Ins и щелчок правой кнопки мышки вставляет все строки из буфера обмена.
Выбор и вставка путей к файлам и папкам
Комбинации Ctrl+Shift+D и Ctrl+Shift+F открывают стандартные Windows-диалоги выбора пути к папке или файлу и вставляют выбранный путь в консоль.
Бонус в командной строке
При щелчке левой кнопкой мышки в командной строке ConEmu пытается переместить курсор в позицию щелчка. А Ctrl+BackSpace удаляет слово слева от курсора.
Гиперссылки и ошибки компиляции
ConEmu умеет открывать гиперссылки в браузере по умолчанию (ShellExecute) а ссылки на ошибки компиляции в редакторе. Удерживая ЛевыйCtrl щелкните левой кнопкой мышки по гиперссылке www... или по файлу с ошибкой test.c(50): error: ....
Шрифт
Вкладка «Main». Шрифт можно выбрать любой: моноширный или пропорциональный, растровый или векторный, с включенным сглаживанием или отключенным (Clear Type, Standard, None). Пропорциональный шрифт в консоли смотрится несколько странно, но если хочется – то можно отключить флажок «Monospace».
Хочется отметить также то, что ConEmu умеет использовать не только шрифты установленный в системе. Просто скопируйте желаемые файлы шрифтов (поддерживаются fon, ttf, otf, и моноширные bdf) в папку ConEmu и перезапустите программу. Новые шрифты появятся в списке доступных на вкладке настройки шрифтов «Main». Не стоит копировать слишком много шрифтов – их обработка может занять значительное время при старте программы. Регистрацию «локальных» шрифтов можно отключить на вкладке «Features» флажком «Auto register fonts».
Для отображения псевдографики (рамки в Far Manager и т.п.) можно настроить отдельный шрифт. В некоторых шрифтах используемых в качестве основного рамки получаются несимпатичными.
Иногда нужно быстро поменять размер шрифта. Это можно сделать не открывая окно настроек — удерживая клавишу Ctrl крутите колесико мышки.
Quake/Tilda
Вызов ConEmu в стиле игровых консолей доступен «из коробки». Открываем вкладку «Main» и включаем флажок «Quake style slide down». При желании там же включаем «Auto–hide on focus lose». Если рамка вообще не нужна – в поле «Frame width» поставьте «0» вместо «-1» («-1» — показывать рамку полностью). Здесь же можно настроить отступы поля консоли от краев окна ConEmu – включите «Center console in ConEmu workspace» и выберите количество пикселей в «Pad size».
Режим «поверх всех окон» можно включит на вкладке «Appearance» флажком «Always on top».
Показывать ли окно ConEmu на панели задач? Открываем вкладку «Task bar» и выбираем желаемые опции. По умолчанию в Quake режиме при минимизации (скрытии) окно скрывается в TSA (taskbar status area – область рядом с часиками), это опция «Auto minimize to TSA». А чтобы вообще не показывать иконку в панели задач – щелкните радиокнопку «Don’t show ConEmu window on Taskbar» и включите «Always show TSA icon» чтобы не потерять ConEmu.
Клавиша активации. Их может быть две (так все запущено на некоторых раскладках клавиатуры). Открываем вкладку «Keys & Macro» и в самом начале списка видим «Minimize/Restore» и «Minimize/Restore (alternative)». Можно выбрать любую комбинацию клавиш (по умолчанию это Ctrl+~), но имейте в виду, что эта комбинация регистрируется как глобальный хоткей в системе со всеми вытекающими. Например, некоторые комбинации могут быть уже зарезервированы системой или другими приложениями.
Клавиша скрытия. Та же что и клавиша активации, но дополнительно окно ConEmu можно скрывать просто клавишей Esc. Откройте вкладку «Task bar» и в группе «Minimize ConEmu by Esc» выберите опцию «Always». Там же есть флажок «Map Shift+Esc to Esc» чтобы можно было все-таки послать в консоль клавишу «Esc» если это необходимо.
Размер (высоту) окна можно менять. Наведите мышку на рамку (или на то место, где она должна быть), подождите пару секунд, и у окна появится обычная resizable рамка которую можно тянуть мышкой.
Панель задач Windows 7
Поддержка списка переходов (Jump List). После создания вашего списка задач на вкладке «Tasks» включите флажок «Add ConEmu tasks to taskbar» и нажмите кнопку «Update Now».
Отображение прогресса на панели задач.
Фоновая картинка
Если вам не нравится унылое черное окошко – фон можно заменить на картинку или сплошной цвет. Замена фона выполняется для выбранных индексов цветов – поле «Replace color indexes». По умолчанию в поле стоит «*» – автовыбор, но если, например, нужно заменять фон для темно-зеленого цвета (палитру можно посмотреть на вкладке «Colors») введите «#2» вместо «*». Фоновая картинка указывается в поле «Path» (bmp, jpg, png файлы), но в этом же поле можно указать и сплошной цвет, например «48 10 36» чтобы получить цвет фона терминала в Ubuntu. Если картинка слишком яркая – ее можно притушить слайдером «Darkening».
Еще одна возможность для пользователей Far Manager – установка цвета фона из плагинов Far. На Хабре уже была статья «Визуализация разных дисков в файловом менеджере или Не совсем консольный FAR». Описываемый там плагин устарел и не работает в текущих версиях ConEmu, но аналогичный функционал реализован плагином «ConEmu Background». Чтобы включить раскраску панелей откройте в Far Manager список «Plugins configuration» (Alt+Shift+F9 в панелях), выберите плагин «ConEmu Background» и включите флажок «Enable plugin».
Автообновление
ConEmu умеет обновляться автоматически, если он был установлен инсталлятором или развернут из 7z–архива. Для обновления 7z–архивом требуется установленный архиватор 7zip или WinRar. На владке «Update» можно выбрать параметры обновления: проверять при запуске или ежечасно; показывать диалог с сообщением о новой версии или только нотификацию в TSA; обновляться на последнюю или только на стабильную версию; настройка proxy–сервера; путь для хранения скачанных версий и т.д.
Цветовые палитры
На вкладке «Colors» можно выбрать одну из предопределенных цветовых схем (Solarized, Standard VGA, PowerShell, xterm, и др.) или настроить свою схему цветов. Настроенную схему можно сохранить: введите имя в поле «Schemes» и нажмите кнопку «Save».
Стандартной палитры в 16 цветов не всегда хватает, но в ConEmu есть две возможности расширения цветового пространства.
Extend foreground colors
За счет потери одного индекса цвета фона в ConEmu можно настроить дополнительно 16 цветов для текста. Например, для приглашения командной строки можно указать ярко-красный цвет фона, выбрать в выпадающем списке его индекс (#12) и настроить палитру цветов с индексами 16..31. После этого текст будет отображен цветами палитры 16..31, а цвет фона (ярко-красный) заменен на окружающий (скорее всего это будет черный).
Подробнее можно почитать здесь.
TrueColor
Унылая 16-цветная консольная палитра надоела разработчику плагина Colorer для редактора Far Manager и появился Colorer TrueMod. В результате консольный редактор засиял новыми красками, а информация о цветах стала храниться в SharedMemory в дополнение к собственно консоли. Кроме цветов появилась возможность использовать Bold/Italic/Underline шрифты для участков текста.
В Far 3.0 поддержка TrueColor стала нативной и настройку расширенных атрибутов (24бита на цвет и Bold/Italic/Underline) можно выполнить для любого элемента интерфейса. Кто говорил, что в фаре недостаточно цветов для подсветки групп файлов?
Опция может быть отключена на вкладке «Colors» флажком «TrueMod (24bit color) support». Ее отключение экономит некоторое количество мегабайт памяти.
ANSI X3.64
В *nix терминалах можно использовать Escape-последовательности и даже в DOS они были доступны со стандартным драйвером ANSI.SYS. В терминале Windows про них решили забыть, правда есть несколько программ позволяющих использовать ANSI в Windows, например ANSICON.
В ConEmu поддержка ANSI X3.64 встроена. Для этого должны быть включены флажки «Inject ConEmuHk» и «ANSI X3.64» на вкладке «Features». Полный список поддерживаемых в ConEmu ANSI кодов.
С помощью ANSI можно не только выводить цветной текст. Например в заголовке таба можно отображать текущую директорию в cmd.
Прозрачность окна ConEmu
При желании на вкладке «Transparency» можно настроить прозрачность окна ConEmu. Можно выбрать различные значения прозрачности для активного и неактивного окна. Например ConEmu может полностью «исчезнуть» с экрана при потере фокуса если слайдер прозрачности для неактивного окна передвинуть в крайнее левое положение.
Если вы не отключили статусную строку, то в ней может отображаться текущее значение прозрачности в процентах (список отображаемых «колонок» статусной строки тоже настраивается). При щелчке мышкой по колонке с прозрачностью всплывает меню в котором можно быстро изменить коэффициент прозрачности или отключить его.
Табы
При работе с несколькими консолями одновременно или при работе с редакторами и просмотрщиками в Far Manager (в Far должен быть загружен плагин ConEmu) табы сильно облегчают жизнь. Кроме того, в заголовке таба показывается прогресс операции в процентах (копирование, распаковка архивов, chkdsk, прогресс в PowerShell, и др.)
В табе отображается значок «Щит» если эта консоль запущена в режиме администратора.
Отображаемый текст можно настроить по шаблону, например можно в табе показывать имя и PID активного процесса, порядковый номер консоли, заголовок окна консоли, имя редактируемого или просматриваемого в Far Manager файла, признак наличия изменений в редакторе.
Если cmd.exe запущен в режиме администратора – в заголовке окна консоли он отображает префикс «Администратор:». ConEmu умеет отбрасывать эту избыточную информацию.
Если табы не нужны – их можно полностью отключить или включить автопоказ при появлении более одного таба.
Переключение между табами также настраивается по желанию. Стандартные комбинации Ctrl+Tab и Ctrl+Shift+Tab. Режим «Recent mode» включенный по умолчанию позволяет перебирать табы в порядке их активации. При включенном «Lazy tab switch» фактическое переключение таба произойдет при отпускании клавиши Ctrl. А до отпускания клавиши Ctrl табы можно переключать и стрелками Влево/Вправо.
Табы можно активировать по номеру консоли, который можно показывать в заголовке таба. По умолчанию предлагается комбинация Win+цифра (должны быть включены флажки «Install keyboard hooks» и «Win+Number – activate console» на вкладке «Controls»). То есть Win+1 активирует первую консоль, Win+2 – вторую и т.д. Если консолей открыто более 9 то нужно нажимать последовательно две цифры удерживая клавишу Win, например «Win+2,4» активирует 24-ю консоль (и кому их столько понадобится?). Если открыты редакторы/вьюверы в Far Manager то Win+цифра будет последовательно перебирать их (флажок «Host-Key+Number iterates Far windows»).
Вместо клавиши «Win» можно выбрать любую другую комбинацию клавиш-модификаторов, например Ctrl+Shift или Apps. Перейдите на вкладку «Keys & Macro» и прокрутите список клавиш до пункта «Activate console by number». Вы можете выбрать любые три клавиши-модификатора.
Статусная строка
По желанию отключается и настраивается. Доступно большое количество колонок вроде имени и PID активного процесса, координаты видимой области и курсора, ИД текущей раскладки клавиатуры, статусы CAPS/NUM/SCROLL, номер активной консоли, коэффициент прозрачности и т.д. По многим колонкам можно щелкать мышкой для их изменения.
ConEmu Here
На вкладке «Integration» можно настроить контекстное меню для Windows Explorer и установить ConEmu как терминал по умолчанию для запуска консольных приложений.
«ConEmu Here» и «ConEmu Inside». Вы можете создать неограниченное количество пунктов меню для запуска разных шеллов (cmd, powershell, bash, SDK и т.п.) Введите команду в поле «Command» дайте пункту меню соответствующее название в поле «Menu item», опционально укажите путь к иконке отображаемой в меню (не работает в WinXP) и нажмите кнопку «Register». Список ранее зарегистрированных пунктов отображается в выпадающем списке «Menu item».
Отличие «ConEmu Inside» от «ConEmu Here» в том, что терминал будет запущен как часть окна Windows Explorer (Inside).
ConEmu может использоваться как плагин и в других программах. Для этого укажите дескриптор окна в котором должен разместиться ConEmu и команду, которую он должен выполнить. Например:
ConEmu.exe /insidewnd 0x13A40 /cmd powershell.exe
Default terminal
ConEmu может подменять собой стандартный терминал Windows, запуск с ярлыка «Windows SDK Command Prompt», запуск «ipconfig /all» из диалога Win+R, запуск консольных приложений из TotalCmd, отладка консольных программ в Visual Studio – все может быть перехвачено и запущено в ConEmu.
Как это работает: на вкладке «Integration» нужно указать список процессов, в которые будет загружена библиотека ConEmuHk.dll (например «explorer.exe|devenv.exe|totalcmd.exe») и включить флажок «Force ConEmu as default terminal» а также, при желании, «Register on OS startup». В указанных процессах будут перехвачены функции CreateProcessA, CreateProcessW, WinExec для запуска консольного приложения в ConEmu.
IDE style
Выше уже было сказано про запуск любых команд из списка переходов. Например, для сборки ConEmu я сделал cmd-файл настраивающий окружение SDK и запускающий nmake или devenv.com.
Ключ «/single» в поле «Task parameters» указывает использовать один экземпляр ConEmu (запуск в новом табе). Ключ «-new_console:c» в тексте команды является аналогом «pause» в cmd, чтобы консоль не закрылась после завершения компиляции.
В случае ошибок компиляции (вывод компилятора сохраняется в файл Error.log) вызывается скрипт TypeBuildErrors.cmd "%~dp0Errors.log" подсвечивающий строки с информацией об ошибках красным шрифтом, а предупреждения — синим. Исправив ошибки в редакторе Far Manager можно перезапустить компиляцию — Win+~ (хоткей по умолчанию для перезапуска таба).
App distinct
Здесь можно изменить некоторые опции в зависимости от процесса в консоли.
Например для PowerShell запущенном в режиме админа задать свою палитру.
Здесь же будет возможность задать свою фоновую картинку (просят давно, но пока не готово).
Keys & Macro
Здесь можно увидеть список всех комбинаций клавиш используемых в программе. Быстрый способ открыть эту вкладку – Win+Alt+K.
Также есть возможность задавать некоторое количество пользовательских действий через GuiMacro. Например назначить на Ctrl+D выход из текущего шелла: print("exit\n").
Far Manager
Интеграция с Far это тема для отдельной статьи. Важно, чтобы в Far был загружен плагин ConEmu (то есть в списке F11 из панелей был виден пункт «ConEmu»).
Краткий список возможностей.
- Drag&Drop файлов из панелей в другие приложения;
- щелчок правой кнопкой мышки помечает файлы, а длинный щелчок (удерживайте правую кнопку мышки >1 секунды) открывает графическое EMenu;
- панели можно двигать мышкой
- в плагине Unicode CharMap символы отображаются соответствующим шрифтом;
- файлы в панелях можно отображать в режиме Tile и Thumbnail;
- поддержка тачскринов, например прокрутка двумя пальцами, жест zoom, длинный тап по кейбару открывает меню (Alt/Shift/Ctrl/Fn).
Вкладка Debug
В основном вкладка для отлова багов. Но может быть интересна и пользователям.
Например, при выборе радиокнопки «Shell» ConEmu показывает запускаемые в консоли процессы и загружаемые dll-ки. Почти то же самое можно подсмотреть в ProcessMonitor, но здесь есть бонус — при компиляции проектов VC cl.exe и link.exe запускаются не с ключами а с параметром пакетным-файлом. ConEmu покажет содержимое этого файла.
Разное
Win+A или кнопка на тулбаре — заморозить консоль (поставить на паузу).
Щелчок правой кнопкой мышки по крестику в заголовке окна скрывает ConEmu в область уведомлений (Taskbar status area).
Полоса прокрутки по умолчанию скрыта и появляется при наведении мышки в правый край консоли. При работе в Far Manager колесо мышки обычно обрабатывается самим Far (прокрутка панелей, меню, и пр.), но при наведении курсора на полосу прокрутки — колесо прокручивает консоль.
Поиск текста — Apps+F или из меню «Edit» пункт «Find text». Искать умеем по всей консоли, но для этого консоль должна быть заморожена (Freeze console).
Можно показать «настоящую» консоль комбинацией Ctrl+Win+Alt+Space.
Заключение
Казалось бы от терминала нужно не много, но работа над ConEmu далека от завершения и в планах реализация многих возможностей. Например «бесконечный» буфер (сейчас ограничен 9999 строками «реальной» консоли), полноценная поддержка xterm 256 colors, горизонтальная прокрутка, сниппеты, оптимизация и т.д.
И, конечно, документация. Банально не хватает времени чтобы поддерживать актуальность wiki, некоторые страницы ожидают перевода, а многие возможности описаны только в WhatsNew.
Обновлено
Официальный сайт переехал по адресу http://conemu.github.io.
A curated list of command line apps.
Inspired by the awesome list thing.
Table of Contents
- Entertainment
- Music
- Social Media
- Video
- Movies
- Games
- Books
- Development
- Text Editors
- Frontend Development
- Mobile Development
- Database
- Devops
- Docker
- Release
- Npm
- Boilerplate
- HTTP Server
- HTTP Client
- Productivity
- Time Tracking
- Note Taking and Lists
- Finance
- Presentations
- Calendars
- Utilities
- macOS
- Terminal Sharing Utilities
- Network Utilities
- Theming and Customization
- Shell Utilities
- System Interaction Utilities
- Markdown
- Security
- Math
- Weather
- Browser Replacement
- Internet Speedtest
- Command Line Learning
- Data Manipulation
- Processors
- JSON
- YAML
- Columns
- Text
- Files and Directories
- File Managers
- Deleting, Copying, and Renaming
- Files
- File Sync/Sharing
- Directory Listing
- Directory Navigation
- Search
- Version Control
- Git
- GitHub
- Emoji
- Images
- Gif Creation
- Image Conversion
- Screensavers
- Graphics
- Just for Fun
- Emoji
- Other Awesome Lists
- License
Entertainment
- newsboat — An extendable RSS feed reader for text terminals.
Music
- cmus — Small, fast and powerful console music player.
- Instant-Music-Downloader — Instant music downloader.
- itunes-remote — Control iTunes via CLI.
- pianobar — Pandora client.
- somafm-cli — Listen to SomaFM in your terminal.
- mpd — Music Player Daemon.
- ncmpcpp — mpd client.
- moc — Console audio player for Linux/UNIX.
- musikcube — Cross-platform, terminal-based music player, audio engine, metadata indexer, and server.
- beets — Music library manager and tagger.
- spotify-tui — Spotify client.
- swaglyrics-for-spotify — Spotify lyrics.
- dzr — deezer.com player.
- radio-active — Internet radio player with 40k+ stations.
- mpvc — Music player interfacing mpv.
Video
- youtube-dl — Download videos from YouTube.com and many other video sites.
- streamlink — Extract streams from various websites to a video player of your choosing.
- mps-youtube — Youtube player.
- mpv — Superior video player.
- editly — Declarative video editing.
- yt-dlp — A
youtube-dlfork with additional features and fixes.
Movies
- moviemon — Everything about your movies.
- movie — Get movie info or compare movies.
Games
- Dwarf Fortress — Roguelike construction and management simulation.
- Cataclysm-DDA — Turn-based survival game set in a post-apocalyptic world.
- Pokete — Pokemon-like.
Books
- epr — epub reader.
- Bible.Js CLI — Bible.
- SpeedRead — Spritz-alike speedreader.
- medium-cli — Read medium.com stories.
Chat
- WeeChat — Fast, light and extensible chat client.
- irssi — IRC chat client.
- kirc — Tiny IRC client.
Development
- legit — Generate Open Source licences as files or file headers.
- mklicense — Create a custom LICENSE file painlessly with customized info.
- rebound — Fetch Stack Overflow results on compiler error.
- foy — Lightweight general purpose task runner/build tool.
- just — Modern
make-like command runner. - bcal — Byte CALculator for storage conversions and calculations.
- bitwise — Base conversion and bit manipulation.
- cgasm — x86 assembly documentation.
- grex — Generate regular expressions from user-provided test cases.
- gdb-dashboard — Modular visual interface for GDB.
- iola — Socket client with REST API.
- add-gitignore — Interactively generate a .gitignore for your project based on your needs.
- is-up-cli — Check if a domain is up.
- reachable — Check if a domain is up.
- loadtest — Run load tests.
- diff2html-cli — Create pretty HTML from diffs.
Text Editors
- emacs — An extensible, customizable, free/libre text editor — and more.
- vim — Vim — the ubiquitous text editor.
- neovim — Modern vim.
- kakoune — Modal editor inspired by vim.
- micro — A simple and intuitive editor.
- o — Configuration-free text editor and IDE.
- helix — Modal editor inspired by kakoune.
Frontend Development
- caniuse-cmd — Search caniuse.com about browser support of features.
- strip-css-comments-cli — Strip comments from CSS.
- viewport-list-cli — Return a list of devices and their viewports.
- surge — Publish static websites for free.
Mobile Development
- mobicon-cli — Mobile app icon generator.
- mobisplash-cli — Mobile app splash screen generator.
- deviceframe — Put device frames around your mobile/web/progressive app screenshots.
Database
- mycli — MySQL client with autocompletion and syntax highlighting.
- pgcli — Postgres client with autocompletion and syntax highlighting.
- sqlline — Shell for issuing SQL via JDBC.
- iredis — Redis client with autocompletion and syntax highlighting.
- usql — Universal SQL client with autocompletion and syntax highlighting.
Devops
- htconvert — Convert .htaccess redirects to nginx.conf redirects.
- SAWS — Supercharged AWS CLI.
- s3cmd — Fully-Featured S3 client.
- pm2 — Production Process Manager for Node.js.
- ops — Unikernel compilation and orchestration tool.
- flog — A fake log generator for log formats such as apache-common, apache error and RFC3164 syslog.
- k9s — Manage Kubernetes Clusters.
- PingMe — Send messages/alerts to multiple messaging platforms & email.
- ipfs-deploy — Deploy static websites to IPFS.
- Discharge — Deploy static websites to Amazon S3.
- updatecli — A declarative dependency management tool.
Docker
- lstags — Synchronize images across registries.
- dockly — Interactively manage containers.
- lazydocker — Simple docker/docker-compose interface.
- docker-pushrm — Push a readme to container registries.
Release
- release-it — Automate releases for Git repositories and/or npm packages. Changelog generation, GitHub/GitLab releases, etc.
- clog — A conventional changelog for the rest of us.
- np — A better
npm publish. - release — Generate changelogs with a single command.
- semantic-release — Fully automated version management and package publishing.
Npm
- npm-name-cli — Check whether a package name is available on npm.
- npm-user-cli — Get user info of a npm user.
- npm-home — Open the npm page of the package in the current directory.
- pkg-dir-cli — Find the root directory of a npm package.
- npm-check-updates — Find newer versions of package dependencies than what your package.json allows.
- updates — Flexible npm dependency update tool.
- wipe-modules — Remove
node_modulesof inactive projects.
Boilerplate
- yo — Scaffolding tool for running Yeoman generators.
- boilr — Create projects from boilerplate templates.
- cookiecutter — Create projects from templates.
- mevn-cli — Light speed setup for MEVN (Mongo Express Vue Node) Apps.
- scaffold-static — Scaffolding utility for vanilla JS.
HTTP Server
- serve — Serve static files (https, CORS, GZIP compression, etc).
- simplehttp — Easily serve a local directory over HTTP.
- shell2http — Shell script based HTTP server.
HTTP Client
- HTTPie — A user-friendly HTTP client.
- HTTP Prompt — Interactive HTTP client featuring autocomplete and syntax highlighting.
- ain — HTTP client with a simple format to organize API endpoints.
- curlie — A curl frontend with the ease of use of HTTPie.
Productivity
- doing — Keep track of what you’re doing and track what you’ve done.
- ffscreencast — A ffmpeg screencast with video overlay and multi monitor support.
- meetup-cli — Meetup.com client.
- NeoMutt — Email client.
- terjira — Jira client.
- ipt — Pivotal Tracker client.
- uber-cli — Uber client.
- Buku — Browser-independent bookmark manager.
- papis — Extensible document and bibliography manager.
- pubs — Scientific bibliography manager.
- fjira — Fuzzy finder and TUI application for Jira.
Time Tracking
- Timetrap — Simple timetracker.
- moro — Simple tool for tracking work hours.
- Timewarrior — Utility with simple stopwatch, calendar-based backfill and flexible reporting.
- Watson — Generate reports for clients and manage your time.
- utt — Simple time tracking tool.
- Bartib — Easy to use time tracking tool.
- arttime — Featureful timer with native desktop notifications and curated ASCII art.
Note Taking and Lists
- idea — A lightweight tool for keeping ideas in a safe place quick and easy.
- geeknote — Evernote client.
- Taskwarrior — Manage your TODO list.
- Terminal velocity — A fast note-taking app.
- eureka — Input and store your ideas.
- sncli — Simplenote client.
- td-cli — A TODO manager to organize and manage your TODO’s across multiple projects.
- taskbook — Tasks, boards & notes for the command-line habitat.
- dnote — A interactive, multi-device notebook.
- nb — A note‑taking, bookmarking, archiving, and knowledge base application.
- obs — Interact with your Obsidian vault.
Finance
See plaintextaccounting.org for a great overview of relevant tools.
- ledger — Powerful, double-entry accounting system.
- hledger — Robust, fast, intuitive plain text accounting tool with CLI, TUI and web interfaces.
- moeda — Foreign exchange rates and currency conversion.
- cash-cli — Convert Currency Rates.
- cointop — Track cryptocurrencies.
- ticker — Stock ticker.
Presentations
- WOPR — A simple markup language for creating rich terminal reports, presentations and infographics.
- decktape — PDF exporter for HTML presentations.
- mdp — A markdown presentation tool.
- sent — Simple plaintext presentation tool.
- slides — A markdown presentation tool.
Calendars
- calcurse — Calendar and scheduling.
- gcalcli — Google calendar client.
- khal — CalDAV ready CLI and TUI calendar.
- vdirsyncer — CalDAV sync.
- remind — A sophisticated calendar and alarm program.
- birthday — Know when a friend’s birthday is coming.
Utilities
- aria2 — HTTP, FTP, SFTP, BitTorrent and Metalink download utility.
- bitly-client — Bitly client.
- deadlink — Find dead links in files.
- crawley — Unix-way web crawler.
- kill-tabs — Kill all Chrome tabs.
- alex — Catch insensitive, inconsiderate writing.
- clevercli — Collection of ChatGPT powered utilities.
macOS
- open-pip-cli — Watch videos in picture-in-picture player.
- osx-wifi-cli — Manage wifi connections.
- active-win-cli — Get the title/id/etc of the active window.
- stronghold — Configure security settings from the terminal.
- dark-mode — Toggle dark mode.
Terminal Sharing Utilities
- gotty — Share your terminal as a web application.
- localtunnel — Expose your localhost to the world for easy testing and sharing.
- mosh — Remote SSH client that allows roaming with intermittent connectivity.
- ngrok — Secure introspectable tunnels to localhost.
- tmate — Instant terminal (tmux) sharing.
- warp — Secure and simple terminal sharing.
- OverTime — Time-overlap tables for remote teams.
Network Utilities
- get-port-cli — Get an available port.
- is-reachable-cli — Check if hostnames are reachable or not.
- acmetool — Automatic certificate acquisition for ACME (Let’s Encrypt).
- certificate-ripper — Extract server certificates.
- neoss — User-friendly and detailed socket statistics.
Theming and Customization
- splash-cli — Beautiful wallpapers from Unsplash.
- wallpaper-cli — Get or set the desktop wallpaper.
- themer — Generate personalized themes for your editor, terminal, wallpaper, Slack, and more.
- JackPaper — Set images from Unsplash as wallpaper.
- QuickWall — Directly set wallpapers from Unsplash.
- oh-my-posh — Prompt theme engine.
Shell Utilities
- has — Checks for the presence of various commands and their versions on the path.
- Ultimate Plumber — Write Linux pipes with live previews.
- fkill-cli — Simple cross-platform process killer.
- task-spooler — Queue jobs for linear execution.
- undollar — Strip the ‘$’ preceding copy-pasted terminal commands.
- pipe_exec — Run executables from stdin, pipes and ttys without creating a temporary file.
System Interaction Utilities
- fastfetch — System information tool.
- battery-level-cli — Get current battery level.
- brightness-cli — Change screen brightness (windows).
- yank — Yank terminal output to clipboard.
- screensaver — Start the screensaver.
- google-font-installer — Download and install Google Web Fonts on your local machine.
- glances — System monitoring tool.
- tiptop — System monitor.
- gzip-size-cli — Get the gzipped size of a file.
Markdown
- DocToc — Generates table of contents for markdown files.
- grip — Preview markdown files as GitHub would render them.
- mdv — Styled terminal markdown viewer.
- glow — Styled markdown rendering.
- gtree — Use markdown to generate directory trees and the directories itself.
Security
- pass — Password manager.
- gopass — Fully-featured password manager.
- xiringuito — SSH-based VPN.
- hasha-cli — Get the hash of text or stdin.
- ots — Share secrets with others via a one-time URL.
Math
- mdlt — Do quick math right from the command line.
- Qalculate — Calculate non-trivial math expressions. Unit conversions, symbolic calculations and more.
Weather
- wttr.in
- wego
- weather-cli
Browser Replacement
- s — Open a web search in your terminal.
- hget — Render websites in plain text from your terminal.
- mapscii — Terminal Map Viewer.
- nasa-cli — Download NASA Picture of the Day.
- getnews.tech — Fetch news headlines from various news outlets.
- trino — Translation of words and phrases.
- translate-shell — Google Translate interface.
Internet Speedtest
- speedtest-net — Test internet connection speed and ping using speedtest.net.
- speed-test —
speedtest-netwrapper with different UI. - speedtest-cli — Test internet bandwidth using speedtest.net.
- bandwhich — Track bandwidth utilization by process.
Command Line Learning
- cmdchallenge — Presents small shell challenge with user submitted solutions.
- explainshell — Type a snippet to see the help text for each argument.
- howdoi — Instant coding answers.
- how2 — Node.js implementation of howdoi.
- The Fuck — Magnificent app which corrects your previous console command.
- tldr — Simplified and community-driven man pages.
- Wat — Instant, central, community-built docs.
- teachcode — Guide for the earliest lessons of coding.
- navi — Interactive cheatsheet tool.
- yai — AI powered terminal assistant.
Data Manipulation
- visidata — Spreadsheet multitool for data discovery and arrangement.
Processors
- jq — JSON processor.
- yq — YAML processor.
- dasel — JSON/YAML/TOML/XML processor (like jq/yq).
- yaml-cli — Query/update YAML.
- ramda-cli — Process data with functional pipelines.
- xq — XML and HTML beautifier and content extractor.
JSON
- jp — JSON parser.
- fx — Command-line JSON viewer.
- vj — Makes JSON human readable.
- underscore-cli — Utility-belt for hacking JSON and Javascript.
- strip-json-comments-cli — Strip comments from JSON.
- GROQ – JSON processor with queries and projections.
- gron — Make JSON greppable.
YAML
- dyff — YAML diff tool.
Columns
- parse-columns-cli — Parse text columns to JSON.
- q — Execution of SQL-like queries on CSV/TSV/tabular text file.
Text
- figlet — Creates large text out of ASCII characters.
- stegcloak — Hide secrets with invisible characters in plain text securely.
Files and Directories
File Managers
- ranger — A console file manager with VI key bindings.
- midnight-commander — A feature rich visual file manager.
- Vifm — VI influenced file manager.
- nnn — File browser and disk usage analyzer with excellent desktop integration.
- lf — Fast, extensively customizable file manager.
- clifm — The command line file manager.
- far2l — Orthodox file manager.
- yazi — Blazing fast file manager.
Deleting, Copying, and Renaming
- trash-cli — Move files and directories to the trash.
- empty-trash-cli — Empty the trash.
- del-cli — Delete files and folders.
- cpy-cli — Copies files.
- rename-cli — Rename files quickly.
- renameutils — Mass renaming in your editor.
- diskonaut — Disk space navigator.
Files
- chokidar-cli — CLI to watch file system changes.
- file-type-cli — Detect the file type of a file or stdin.
- bat — A cat clone with syntax highlighting.
- NCDu — A disk usage analyzer with an ncurses interface.
- unix-permissions — Swiss Army knife for Unix permissions.
- transmission-cli — Torrent client for your command line.
- webtorrent-cli – Streaming torrent client.
- entr — Run an arbitrary command when files change.
- organize-cli — Organize your files automatically.
- organize-rt — organize-cli in Rust with more customization.
- RecoverPy — Recover overwritten or deleted files.
File Sync/Sharing
- rclone — Sync files with various cloud providers.
- ffsend — Quick file share.
- share-cli — Share files with your local network.
- google-drive-upload — Upload/sync with Google Drive.
- gdrive-downloader — Download files/folders from Google Drive.
- portal — Send files between computers.
- shbin — Turn a Github repo into a pastebin.
- sharing — Send and receive files on your mobile device.
- ncp — Transfer files and folders, to and from NFS servers.
Directory Listing
- alder — Minimal
treewith colors. - eza — Improved version of
ls. - tre —
treewith git awareness, editor aliasing, and more. - ll —
lswith git status. - lsd —
lswith many extra features.
Directory Navigation
- autojump — A cd command that learns — easily navigate directories from the command line.
- pm — The easy way to switch to your projects on the shell.
- z — z is the new j, yo.
- PathPicker — After parsing the output from a command, PathPicker presents you with a nice UI to select which files you’re interested in.
- fz — Seamless fuzzy tab completion for z.
- goto — Directory aliases for the shell with autocomplete.
- z.lua —
cdcommand that learns your habits. - zoxide — Fast directory jumper in Rust.
- tere — A faster alternative to using cd and ls.
Search
- happyfinder — (another) Fuzzy file finder for the command line.
- find-up-cli — Find a file by walking up parent directories.
- ripgrep — A line-oriented search tool that recursively searches your current directory for a regex pattern.
- fzf — A general purpose command-line fuzzy finder, can be used with any list: files/directories, command history, processes, hostnames, bookmarks, git commits, etc.
- fselect — Find files with SQL-like queries.
- fd — A simple, fast and user-friendly alternative to
find. - broot — Fuzzy finder similar to fzf, but with space usage visualization.
- rare — Real-time regex aggregation and analysis.
- skim — A general fuzzy finder written in rust, similar to fzf.
- ast-grep — A tool for code structural search, linting and rewriting.
Version Control
- SnowFS — A fast, scalable version control system for binaries.
Git
- git commander — Interactive git tool.
- git-stats — A local GitHub-like contributions calendar.
- dev-time — Get the current local time of a GitHub user.
- tig — Text-mode interface for git.
- grv — Text-mode interface for git with customisable vi bindings.
- git-standup — Recall what you did on the last working day.
- git-secret — Store your private data inside a git repository.
- gitlab-cli — Create GitLab merge requests.
- git-extras — Git utilities.
- gita — Manage multiple git repos side by side.
- readme-md-generator — Interactively generate README.md files.
- semantic-git-commit-cli — Ensure semantic commits messages.
- import-github-labels-cli — Sync labels between Github repos.
- git-all-branches — Improved
git branch -a. - czg — Interactively generate standardized commit messages.
- shallow-backup — Git integrated backup tool.
- Lazygit — Simple TUI for git commands.
GitHub
- CLI GitHub — Fancy GitHub client.
- hub — Make git easier to use with GitHub.
- git-labelmaker — Edit GitHub labels.
Emoji
- gitmoji-cli — Use emoji in commit messages.
- gitmoji-changelog — Generate gitmoji changelogs.
Images
- SVGO — Optimize SVG files.
- carbon-now-cli — Generate beautiful images of your code.
- imgur-uploader-cli — Upload images to imgur.
- pageres-cli — Capture website screenshots.
Gif Creation
- gifgen — Simple high quality GIF encoding.
- gifsicle — Create, manipulate, and optimize GIF images and animations.
- ttygif — Convert terminal recordings to animated gifs.
- ttygif — ttyrec to gif.
- ttystudio — A terminal-to-gif recorder minus the headaches.
- asciinema — Terminal session recorder and companion app for asciinema.org.
- givegif — GIFs on the command line.
Image Conversion
- imagemagick — Gold standard for anything images.
- imgp — Blazing fast batch image resizer and rotator.
- korkut — Quick and simple image processing.
Screensavers
- cmatrix — Scrolling ‘Matrix’-like screen.
- pipes.sh — Random pipes that grow across the screen.
- YuleLog — Christmas Yule Log fireplace.
- cli-fireplace — Digital fireplace.
Graphics
- cli-mandelbrot — Traverse the Mandelbrot fractal.
- sparkly-cli — Generate sparklines ▁▂▃▅▂▇..
- pastel — Generate, analyze, convert and manipulate colors.
- lowcharts — Draw low-resolution graphs.
Just for Fun
- quote-cli — Get a random quote or the quote of the day in your CLI.
- fortune — Shows a random fortune.
- ponysay — Pony rewrite of cowsay.
- yosay — Like cowsay, but for yeoman.
- lolcat — Outputs text in rainbow colors.
- text-meme — Generate text memes.
- dankcli — Add text to meme image templates.
- ricksay — Quotes from Rick and Morty.
Emoji
- emoj — Find relevant emoji from text on the command-line.
- emoji-finder — Quickly find and copy emoji to the clipboard via the command-line.
- oji — Interactive text emoji maker.
Other Awesome Lists
- awesome-git-addons — Addons that extend git cli.
- awesome-shell – Command-line utilities and frameworks.
- terminals-are-sexy – Terminal frameworks, plugins & resources.
- awesome-zsh-plugins – ZSH frameworks, plugins, tutorials & themes.
- awesome-nodejs clis – Node.js modules and resources.
License
To the extent possible under law, Adam Garrett-Harris has waived all copyright and related or neighboring rights to this work.
Аннотация: На этой лекции мы научимся создавать консольные приложения, вводить и выводить данные в консольных программах, устанавливать правильную кодировку и использовать параметры программы.
Цель лекции
Освоить работу с консольными приложениями и с параметрами программы.
Консольные приложения
На сегодняшний день о программировании на Lazarus существует очень мало книг на русском языке, и все они описывают работу в основном, с консольными приложениями, хотя особой надобности в консолях сейчас нет. Но и совсем обойти эту тему нельзя. Что же такое консольное приложение?
Консольным приложением называется программа, которая не имеет графического интерфейса — окон, и которая работает в текстовом режиме в черно-белой консоли. Команды в такой программе приходиться вводить с клавиатуры, результаты работы консольные приложения также выводят на экран в текстовом режиме.
Если вы пользуетесь операционной системой Windows, то нажмите на «Пуск» и выберите команду «Выполнить«. В открывшемся окне наберите
и нажмите <Enter>. Откроется командная консоль, в которой команды нужно вводить в текстовом режиме:
Рис.
21.1.
Консоль cmd.exe
Собственно, вы видите окно предка Windows — операционной системы MS-DOS. Именно так выглядел экран с загруженной ОС MS-DOS, и управлять ею приходилось, вручную набивая всевозможные команды. Это уже позже корпорация Microsoft навесила на ядро MS-DOS всевозможные драйверы и утилиты, снабдила его графическим оконным интерфейсом, и появилась сначала полуграфическая ОС Windows 3.10 (русский вариант был 3.11 версии), а затем и целиком графическая Windows 95. Но к консольному ядру системы можно обращаться и в современных ОС, в Windows для этого используется программа cmd.exe, а в ОС Linux — терминал.
Все языки высокого уровня позволяют делать и консольные приложения, другое дело — зачем? Подавляющее большинство современных программ имеет графический интерфейс, который мы с вами создавали с самой первой лекции. А консольные приложения делаются в основном, системными программистами. Несмотря на то, что Object Pascal обладает для этого всеми необходимыми инструментами, системщики обычно пользуются такими языками, как Ассемблер, C, реже — C++. Но все же знать, как создаются консольные приложения нужно, поэтому данную лекцию мы посвящаем им.
Создание консольного приложения
Создать консольное приложение можно разными способами, но проще всего так. Откройте Lazarus. Командой «Проект -> Закрыть проект» закройте текущий проект, автоматически появится окно Мастера создания проекта. В нем нажмем кнопку «Новый проект«. Появится окно создания проекта, в котором можно выбрать «Программа» или «Консольное приложение«. Если мы выберем «Программа«, то будет создан модуль с минимальным кодом. Если же мы выберем «Консольное приложение«, то кода будет больше, так как при этом создается программа с новым классом, производным от TCustomApplication. TCustomApplication обеспечивает хорошую основу и делает программирование утилит командной строки довольно простым. Например, проверку опций командной строки, написание справки, проверку переменных окружения и обработку исключений.
Все программы LCL автоматически это используют.
Но нам не нужно использовать возможности класса TCustomApplication, мы делаем простую консольную программу, поэтому в окне создания проекта мы выбираем «Программа«. Сформируется проект, а в Редакторе исходного кода будет минимум текста:
program Project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
begin
end.
Обратите внимание, если нам нужно подключить к программе какие то модули, то делать это нужно до комментария
{ you can add units after this };
В этом случае мы ставим запятую после указанного модуля Classes и добавляем свои модули. Завершающая точка с запятой стоит после комментария, нам её ставить не нужно.
Свой код мы будем писать между скобками
А если нам потребуется указать глобальные константы, переменные или сделать объявления процедур и функций, то все это делается до begin.
Для примера мы создадим простое приложение, а по ходу дела, познакомимся с инструментами ввода-вывода информации в консольных приложениях.
WRITE и WRITELN
Процедура Write предназначена для вывода информации на экран. Она имеет следующий синтаксис:
procedure Write(var F:Text; Args:Arguments);
Действует процедура следующим образом. В скобках мы можем указать какой-то текст, вывести содержимое переменных. Например:
write('Всем привет!!!');
write('Переменная a = ', a, '; переменная b = ', b);
После вывода информации на экран курсор остается на той же строчке, в позиции, где он оказался после вывода последнего символа.
Процедура Writeln действует точно также, но после вывода последнего символа курсор переходит на начало следующей строки.
Для ознакомления с процедурами создайте новый проект «Программа«. Модуль можно не переименовывать, просто сохраните его в папку 21-01. Полный текст модуля следующий:
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
var a, b: Integer;
begin
a:= 5;
b:= 10;
writeln('Всем привет!!!');
writeln('Переменная a = ', a, '; переменная b = ', b);
readln();
end.
Обратите внимание: раздел переменных var мы указали до служебного слова begin, то есть, переменные a и b в пределах модуля являются глобальными. Далее мы присвоили переменным значения, затем вывели на экран приветствие, а потом содержимое переменных. На процедуру readln() пока не обращайте внимания, она нужна только, чтобы программа не закрылась сразу же после вывода текста, а была на экране, пока мы не нажмем <Enter>. Сохраните проект и запустите его на выполнение. И сразу же мы видим недостаток: вместо русских букв выходит нечто, что в Интернете называют «кракозябры»:
Рис.
21.2.
Неправильный вывод кириллицы в консольной программе
В
«Символы и строки»
мы упоминали, что в консольных приложениях Windows принято использовать кодировку CP866, тогда как в графических приложениях используется CP1251 и Юникод. Отсюда и «кракозябры». В Linux и Unix таких проблем нет. Однако решить эту проблему совсем несложно. Нажмите <Enter>, чтобы закрыть консоль, и вернитесь в Редактор кода. Щелкните по окну с кодом правой кнопкой мыши, и в открывшемся контекстном меню выберите команду «Параметры файла -> Кодировка -> CP866«. Откроется окно смены кодировки, нам надо нажать кнопку «Изменить файл«. Снова запустите программу на выполнение — теперь с кодировкой полный порядок:
Рис.
21.3.
Правильный вывод кириллицы в консольной программе
Каждый второй опытный
пользователь, услышав от новичка
фразу «А что такое консольная
программа?», начинает скрежетать
зубами. Поэтому если вы — новичок, то
лучше прочитать эту статью, чтобы
не напороться на этого второго из
двух опытных, а если вы уже опытный
пользователь, то имеет смысл
подсунуть заметку новичку, чтобы
тот нашёл ответ на свой вопрос.
Итак, что же скрывается за этим
страшным словосочетанием —
консольное приложение? Приложение,
как вы знаете, это в мире Windows не то,
что к чему-то прикладывается, а
компьютерная программа. Word, Excel,
пасьянс «Косынка» и Internet Explorer —
это всё приложения. Приложения
бывают разными. Не только в том
смысле, что Word отличается от
«Блокнота», но и по принципу
организации своего
пользовательского интерфейса.
Интерфейс — это внешний вид
программы, и в Windows он бывает двух
типов. Первый — это графический,
второй — текстовый. Графический
интерфейс система подсовывает вам
под нос ежедневно. Все программы,
имеющие красивые разноцветные
окна, имеют и графический
интерфейс. Даже Word и «Блокнот»,
хоть и работают с текстом, но
интерфейс имеют графический. Где же
тогда в наши дни можно увидеть
программу, работающую в режиме
текстового интерфейса?
Для того, чтобы увидеть текстовый
пользовательский интерфейс (его
ещё называют интерфейсом командной
строки — прочитав этот абзац до
конца, вы узнаете, почему), не нужно
делать каких-то особенно сложных
действий. Нажмите кнопку
«Пуск», выберите пункт
«Выполнить», наберите в строке
появившегося окна текст «command»
и нажмите кнопку «Выполнить».
Вы увидите перед собой окно с серым
текстом на чёрном фоне — примерно
такое же, как изображено на
иллюстрации к статье. Это —
командная строка, одна из самых
старых вещей в современном
персональном компьютере.
Дело в том, что ещё не так давно,
около двадцати лет назад, мощности
компьютеров, стоящих у
пользователей дома и на работе, не
хватало на отображение даже такой
несложной графики, как окна (что и
говорить о трёхмерных видеоиграх!).
Поэтому компьютеру и пользователям
приходилось общаться с помощью
текста. Пользователь вводил
специальные команды — например,
команда dir в первой из систем
производства Microsoft, DOS, позволяла
просмотреть список файлов и папок в
определённой директории, а команда
ver показывала версию операционной
системы, с которой работал
пользователь. Программы, которые
запускал пользователь, тоже,
естественно, работали в текстовом
режиме.
Командная строка, как вы видите,
сохранилась в Windows до сих пор.
Команды, которые можно выполнить из
неё, подробно описаны в справке
Windows. А приложения, которые
выполняются в текстовом режиме,
теперь называются консольными.
Почему же командная строка
продолжает жить, несмотря на свой
почтенный возраст? Во-первых, есть
множество программ, которым не
нужен графический интерфейс —
например, программы по взлому
паролей, которые просто подбирают
комбинации символов, пока то, что
закрыто паролем, не откроется.
Кроме того, командная строка
приходит на помощь тем
пользователям, которые выучили
назубок её команды и быстро
набирают с клавиатуры, — для них она
гораздо более быстрый способ
работать с компьютером, чем
графический интерфейс.
Консольных программ масса, и они
используются часто для того, чтобы
упростить рутинные действия
пользователя. Дело в том, что с ними
можно обращаться точно так же, как и
с обычными командами. А те, в свою
очередь, можно записать в
специальный текстовый файл с
расширением BAT или CMD (такой файл
называется командным), и их можно
потом выполнить все залпом как
обычную программу — достаточно в
«Проводнике» дважды кликнуть
по этому файлу мышью.
Так что когда вам в следующий раз
посоветуют воспользоваться
консольной программой, просто
наберите её название в строке
«Пуск» -> «Выполнить», не
забыв, конечно, и полный путь к ней
(например, c:\Downloads\Rar.exe). Если вам
предложат указать для неё
аргументы, то тоже не надо пугаться.
Например, если для программы a нужно
передать аргумент b, то в командной
строке надо записать «a b», то
есть аргументы пишутся через
пробел.
Думаю, для начала знакомства с
консольными приложениями этой
информации вам вполне хватит. А
если нет, пишите мне по адресу [email protected],
будет продолжение.
Вадим СТАНКЕВИЧ
2007 г. Win32 в машинных кодахРустэм Галеев aka Roustem Назад Содержание Вперёд 5. Консольное приложениеСуществует разновидность приложений Windows, которые называются консольными. По своим «внешним» проявлениям они напоминают приложения DOS, запущенные в Windows. Тем не менее, это настоящие Win32-приложения, которые под DOS работать не будут; для них также доступен Win32 API, а кроме того, они могут использовать консоль — окно, предоставляемое системой, которое работает в текстовом режиме и в которое можно вводить данные с клавиатуры. Особенность консольных приложений в том, что они работают не в графическом, а в текстовом режиме. Для этого используются унаследованые от DOS так называемые стандартный ввод и стандартный вывод. Все, что пользователь вводит с клавиатуры (когда консольное окно имеет фокус), попадает в буфер стандартного ввода, откуда данные можно читать, как из файла. Выходные же данные можно записать, как в файл, в буфер стандартного вывода, и они будут отображены в консольном окне. Еще одной особенностью стандартных ввода и вывода является возможность их перенаправления в файл. Этим мы уже пользовались при создании наших приложений, используя в командной строке знаки ‘<‘ для перенаправления ввода и ‘>’ для перенаправления вывода. Debug, будучи приложением DOS, использует для приема команд стандартный ввод, а для отображения данных — стандартный вывод. Когда мы писали: ‘debug < code.txt’, содержащиеся в файле code.txt данные поступали в debug так, как будто их набирают на клавиатуре. При команде же ‘debug > result.lst’ вся информация, которая выводилась бы на экран, попадала в файл ‘result.lst’. Из приложений, подобных debug, т.е. использующих для ввода данных стандартный ввод, а для вывода — соответственно стандартный вывод, можно строить даже своеобразные «конвейеры». Для этого данные из стандартного вывода одного приложения подают на стандартный ввод другого посредством специального знака командной строки ‘|’ (вертикальной черты). В команде приложение1 | приложение 2 | приложение3 данные проходят последовательную обработку этими тремя приложениями. Например, приложение1 могло бы составлять список из данных источника, приложение2 — сортировать его, а приложение3 — форматировать нужным образом. Таким образом, у консольных приложений есть свои преимущества; их удобно использовать в качестве «строительных блоков» для автоматизации многих рутинных задач, не требующих интерактивного взаимодействия с пользователем. Работа со стандартными вводом и выводом «изнутри» подобна работе с файлами. Стандартный ввод выглядит как файл с разрешением «только для чтения», а стандартный вывод — как файл с разрешением «только для записи». Для работы с ними используют соответствующие функции API — ReadFile и WriteFile из модуля Kernel32.dll. Рассмотрим их подробнее. При вызове функции ReadFile в стек помещаются 5 параметров в следующем порядке:
Внимания заслуживает последний аргумент. Для работы с файлом используется так называемый описатель (handle) — это некий идентификатор, который система присваивает файлу после его открытия. На самом деле, при открытии файла создается внутренняя системная структура, в которой хранятся различные вспомогательные данные, такие как текущая позиция, с которой нужно читать или записывать данные, и т.п. Все обращения к файлам возможны только после их открытия и только по их описателям. Функция WriteFile также принимает 5 схожих параметров:
Но как получить нужные описатели? В случае файлов существуют специальные функции API (наподобие CreateFile) для их открытия. Для стандартного ввода-вывода тоже существует своя функция — GetStdHandle, тоже из модуля Kernel32.dll. Она принимает лишь один аргумент — число, указывающее на тип нужного описателя (для стандартного ввода или вывода). На самом деле, существует еще и третий тип — стандартная ошибка, он, как и стандартный вывод, служит для отображения сообщений на экране. Его можно использовать в тех случаях, когда нужно как-то разделить обычные сообщения и сообщения об ошибках (например, можно использовать перенаправление только для стандартной ошибки — тогда эти сообщения будут записаны в файл и не попадут на экран). В качестве параметра функции GetStdHandle используются 0FFFFFFF6h для стандартного ввода, 0FFFFFFF5h для стандартного вывода и 0FFFFFFF4h для стандартной ошибки. Настало время обсудить один важный вопрос. Функции не только принимают параметры, часто они еще возвращают значения. Результат работы функции по ее возвращении (т.е. перед выполнением следующей после вызова функции инструкции) оказывается в регистре EAX. Это общее соглашение: когда мы начнем создавать свои функции, мы тоже будем должны записывать в регистр EAX значение, которое должно быть возвращено как результат функции. В случае функции GetStdHandle таким результатом как раз и является нужный нам описатель. Его можно либо сохранить где-то в памяти (переписав туда значение из регистра), либо использовать прямо в регистре, если вызов нужной функции непосредственно следует после получения описателя. Здесь нужно отметить еще один момент. Мы уже знаем, что из 8 общих регистров один (ESP) используется в качестве указателя стека, и его трогать нельзя. На самом деле, при работе со стеком используется еще и второй регистр — EBP, поэтому число доступных для манипуляций регистров сокращается до 6. Теперь задумайтесь над вопросом: а что случается с данными, которые находились в регистрах, после вызова функции? Особенно, если это «чужие» функции, являющиеся для нас «черными ящиками» (как в случае с функциями API). Значения в регистрах могут быть перезаписаны (ведь надо с чем-то работать!), а могут остаться без изменения. Чтобы внести ясность в этот вопрос, для работы с функциями Win32 API было принято следующее соглашение: при вызовах любых функций значения регистров EBX, ESI и EDI остаются без изменений — какие были перед вызовом функции, такие будут и после; значения же регистров EAX, ECX и EDX могут быть изменены произвольным образом. В регистре EAX, как мы уже знаем, будет находиться результат работы функции (если функция возвращает результат). Если функция не имеет возвращаемого результата, значение в EAX не определено. Практический же вывод такой. Если нам нужно, чтобы значение в «изменяемых» регистрах (EAX, ECX или EDX) сохранилось после вызова функции, перед ее вызовом необходимо поместить значение соответствующего регистра в стек, а после вызова функции — извлечь его оттуда (в тот же регистр). И наоборот: если мы создаем свою функцию, которую может вызвать система (например, забегая вперед, это относится к главной функции окна), и если в работе этой функции нам приходится использовать регистры, которые не должны изменяться (EBX, ESI или EDI), мы должны в самом начале функции сохранить значение этого используемого регистра в стеке, а перед возвратом из функции — восстановить его. В случае «изменяемых» регистров этого делать не нужно. Что ж, необходимый теоретический минимум мы прошли; теперь можно применить его на практике. Попробуем создать простое консольное приложение, выводящее сообщение. «Макет» нашего приложения будет следующий: сначала идет PE-заголовок, затем секции кода (.code), данных (.data) и вспомогательных данных для импорта (.rdata). По сравнению с прошлым разом для разнообразия переставлены местами секции .data и .rdata. Как и раньше, секции располагаются в памяти по смещениям 1000h, 2000h и 3000h соответственно, а в файле — 200h, 400h и 600h. Начнем с секции данных. Их немного — в начале секции (по смещению 2000h, который после загрузки превратится в виртуальный адрес 402000h) разместим переменную в 4 байта для вывода количества записанных байтов. Сразу за ней (по адресу 402004h) будет выводимая текстовая строка. Набираем файл data.txt: n data.bin r cx 200 f 0 l 200 0 a 0 ; 4 байта для числа выведенных байтов db 0 0 0 0 ; выводимая строка db "Greetings from console window" 0a 0d 0 m 0 l 200 100 w q Числа 0Ah и 0Dh после строки являются ASCII-символами перехода на новую строку; сама строка должна завершаться нулем. Теперь надо заняться секцией импорта. Нам нужно импортировать три функции, и все из модуля Kernel32.dll: GetStdHandle, WriteFile и ExitProcess. В начале секции, как обычно, таблица импортируемых адресов (IAT); на этот раз она имеет, по числу функций, 3 поля и четвертое нулевое. Сразу вслед за IAT расположим таблицу поиска, тем более, что они при загрузке должны быть идентичны. Затем будет таблица импорта, содержащая одну запись для единственного импортируемого модуля и одну завершающую нулевую запись (общий размер 28h байт). Затем последуют строки с именами модуля и функций. Здесь удобно использовать два прохода в режиме ассемблирования — при «черновом» содержимое структур можно просто заполнять нулями (сохраняя лишь размер полей), а для второго «чистового» прохода подставить из полученного файла отчета нужные значения. Для этой же цели лучше выбрать для «сборки» образа в debug то же смещение, что и у загруженной в память секции (в данном случае — 3000h; файл rdata.txt): n rdata.bin r cx 200 f 3000 l 200 0 a 3000 ; Таблица импортируемых адресов: до загрузки ; идентична таблице поиска ; будущий адрес GetStdHandle db 55 30 0 0 ; будущий адрес WriteFile db 64 30 0 0 ; будущий адрес ExitProcess db 70 30 0 0 ; завершение таблицы нулями db 0 0 0 0 ; Таблица поиска ; смещение строки с именем GetStdHandle db 55 30 0 0 ; смещение строки с именем WriteFile db 64 30 0 0 ; смещение строки с именем ExitProcess db 70 30 0 0 ; завершающие нули db 0 0 0 0 ; Таблица импорта ; строка для импорта из Kernel32.dll: ; смещение таблицы поиска db 10 30 0 0 ; 2 пустых поля db 0 0 0 0 0 0 0 0 ; смещение имени модуля db 48 30 0 0 ; смещение таблицы импортируемых адресов db 0 30 0 0 ; завершение таблицы - пустая строка (20 нулевых байтов) db 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; Имя импортируемого модуля db "Kernel32.dll" 0 ; Имена импортируемых функций; вместо "подсказок" нули db 0 0 "GetStdHandle" 0 db 0 0 "WriteFile" 0 db 0 0 "ExitProcess" 0 m 3000 l 200 100 w q Переходим к секции кода. Освежим знания по инструкциям: «короткая» команда помещения в стек 6Ah + 1 байт, «длинная» — 68h + 4 байта; команда вызова функции — опкод 0FFh, байт ModR/M 15h, указывающий, что операнд находится в памяти по 4-байтному адресу, который включен в инструкцию. Обратите внимание, что для помещения в стек числа 0FFFFFFF5h мы можем использовать «короткий» вариант инструкции со знаковым расширением, т.к. это на самом деле отрицательное число, представимое в виде 1 байта (-11 = 0F5h. Функцию WriteFile мы вызываем непосредственно после функции GetStdHandle, значит, нужный нам описатель файла будет находиться в регистре EAX; поэтому в этот раз придется использовать также инструкцию помещения в стек значения регистра EAX (если помните, это 50h). Указатели на нужные нам функции будут находиться после загрузки в соответствующих полях IAT, по адресам 403000h, 403004h и 403008h. Итак, файл code.txt: n code.bin r cx 200 f 0 l 200 0 a 0 ; параметр для стандартного вывода db 6a f5 ; вызов GetStdHandle db ff 15 0 30 40 0 ; параметры для WriteFile: ; не используется - 0 db 6a 0 ; адрес переменной для числа выведенных символов db 68 0 20 40 0 ; длина строки = 30 (1Eh) db 6a 1e ; адрес выводимой строки db 68 4 20 40 0 ; содержимое регистра EAX db 50 ; вызов WriteFile db ff 15 4 30 40 0 ; параметр кода завершения (0) db 6a 0 ; вызов ExitProcess db ff 15 8 30 40 0 m 0 l 200 100 w q Осталось лишь добавить PE-заголовок. Сначала скопируем его шаблон (header.txt) в рабочий каталог, а затем слегка его подправим. Потребуются изменения всего в трех местах. Самое главное — нужно изменить подсистему: вместо графической (2) поставить консольную (3). Собственно, это единственное, чем консольные приложения отличаются от графических! Находим в шаблоне строки: a 9C ; Подсистема: 2 - графическая, 03 - консольная (2 байта) Сразу после нее должно быть: db 03 00 Теперь надо указать расположение таблицы импорта. Находим строку: ; Здесь начинается первый элемент каталога: За ней должен следовать текст: ; смещение таблицы экспорта (4 байта) db 0 0 0 0 ; размер таблицы экспорта (4 байта) db 0 0 0 0 ; Второй элемент каталога: ; смещение таблицы импорта (4 байта) db 20 30 0 0 ; размер таблицы импорта (4 байта) db 28 0 0 0 Наконец, мы поменяли местами секции .data и .rdata (хотя в принципе этого можно было и не делать). Находим начало второй секции: ; вторая секция И заменяем оставшийся текст на следующий: db '.data' 0 0 0 db 0 2 0 0 db 0 20 0 0 db 0 2 0 0 db 0 4 0 0 db 0 0 0 0 0 0 0 0 0 0 0 0 db 40 0 0 c0 ; ; третья секция db '.rdata' 0 0 db 0 2 0 0 db 0 30 0 0 db 0 2 0 0 db 0 6 0 0 db 0 0 0 0 0 0 0 0 0 0 0 0 db 40 0 0 40 m 0 l 200 100 w q Вот и все. В файле сборки (make.bat) секции также должны идти в соответствующем порядке: @echo off debug < header.txt > report.lst debug < code.txt >> report.lst debug < data.txt >> report.lst debug < rdata.txt >> report.lst copy /b header.bin+code.bin+data.bin+rdata.bin cnsl.exe Проверив файл отчета report.lst, можно запускать cnsl.exe. Если вы запускаете его не из консоли, создаваемое окно будет мелькать — закрываться сразу после завершения программы. Поэтому можно запустить сначала консоль командной строки DOS и уже из него — наше приложение, набрав его имя (и путь, если требуется). Еще одно примечание — в консольных приложениях используется кодировка DOS. Поэтому если вы набрали текст для вывода в Блокноте и на русском, то в консольном окне прочесть его не сможете — в Windows используется другая кодировка (ANSI). На самом деле, возможности текстового вывода шире, чем можно было бы подумать. Попробуйте в качестве примера использовать такой файл data.txt: n data1.bin r cx 200 f 0 l 200 0 a 0 db 0 0 0 0 db c9 cd cd cb cd cd bb 0a 0d db ba 20 20 ba 20 20 ba 0a 0d db c7 c4 c4 d7 c4 c4 b6 0a 0d db ba 20 20 ba 20 20 ba 0a 0d db c8 cd cd ca cd cd bc 0a 0d 0 m 0 l 200 100 w q Чтобы пример работал правильно, надо еще подправить кодовую секцию — там, где строка: ; длина строки = 30 (1Eh) надо заменить db 6a 1e на db 6a 2e Впрочем, это лишь подсказка — экспериментируйте сами! Назад Содержание Вперёд |
