Ноу-хау: Буфер и консоль

Почему-то немногие знают об одной очень полезной утилите, которая появилась в операционных системах Microsoft где-то между WinXP и WinServer2003 — во всяком случае, в WinXP её ещё нет, а в WinServer2003 она уже есть.

Речь идёт о clip.exe — консольной программе, которая перехватывает текст со стандартного ввода и помещает его в системный буфер обмена.

Никаких специальных параметров не требует, принцип использования вполне ясен из описания. Можно сделать одно из двух — либо замкнуть на неё конвейером выход какой-то программы:

        pandoc -f markdown -t html sometext.txt | clip

либо заткнуть ей вход каким-то файлом:

        clip <sometext.txt

В первом случае буфер будет содержать весь результат выполнения pandoc, во втором случае в буфер попадёт содержимое указанного файла. Дальше можно идти в какое-то приложение и пользоваться там содержимым буфера.

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

Есть только одна засада: кодировка текста. Буфер обмена Windows достаточно умён, и когда в него помещается текст, нужно вместе с ним поместить и информацию о том, в какой кодировке он написан. Поскольку clip является консольной утилитой, он и укажет кодовую страницу консоли — а это наверняка допотопная DOS-овская 866.

Что будет результатом, если ваша программа отдаёт текст в другой кодировке (например, в юникоде)? Правильно, кракозябры в буфере. Чтобы их не было, нужно воспользоваться командой сhcp, которая меняет кодовую страницу консоли.

В приведённом выше примере нужно создать cmd-файл следующего содержания:

        chcp 65001
        pandoc -f markdown -t html %1 | clip

и запустить его, указав в качестве параметра имя преобразуемого файла. Здесь «65001» — это кодовая страница, соответствующая юникодовскому utf8. Кроме 866 и 65001, полезно помнить ещё 1251 — это родная для Windows кодировка кириллицы.