## Многооконный текстовый редактор clip_we

- Аргументы
- Меню
- Работа с окнами
- Работа с блоками
- Вставка/удаление символов
- Поиск
- Форматирование
- Макроподстановки
- Рисование линий
- Настройка "горячих" клавиш

## Аргументы

Аргументы - одно или несколько имен файлов (через пробел)

    Например, clip_we *.prg
    	  clip_we a.prg b.prg ../include/i.ch

## Меню

Меню вызывается по клавише ESC - это по умолчанию, при желании можно поменять "горячие" клавиши. См. настройка

- Файл
  - Новый - открыть новый файл
  - Открыть - открыть уже существующий файл в новом окне - выбрать файл из списка или ручками ввести имя файла с путем. Если файл уже открыт в одном из окон редактора, то будет предложено открыть этот файл в режиме share. Это удобно, если файл большой, а редактировать надо начало и конец текста. При этом изменения будут отражены в обоих окнах.
  - Сохранить - сохранить изменения в текущем файле
  - Перечитать - перечитать файл
  - Только чтение - установить/снять атрибут "read only"
  - Печать - печать файла
  - Выход с сохранением - выйти из редактора с сохранением статуса, т.е. сохранится список открытых окон, настройки и т.п.
  - Выход без сохранения - выйти из программы без сохранения статуса.
- Окно
  - Список - отобразить список открытых окон. Текущее окно будет выделено цветом. Клавиши Up и Down - служат для перемещения по списку, Enter - активизирует выбраное из списка окно, Del - закрывает окно.
  - Следующее - активизировать следующее по списку окно. Если окно последнее в списке, то активизируется окно с номером 1.
  - Предыдущее - активизировать предыдущее по списку окно. Если текущее окно имеет номер 1, то активизируется последнее из списка.
  - Закрыть - закрыть текущее окно.
- Блок
  - Строчный блок - начать/закончить отметку строчного блока.
  - Прямоугольный блок - начать/закончить отметку прямоугольного блока.
  - Снять - снять отметку блока.
  - Копировать - копировать отмеченный блок.
  - Переместить - переместить отмеченный блок.
  - Удалить - удалить отмеченный блок.
  - Копировать в буфер - копировать выделенный блок в буфер.
  - Вставить из буфера - вставить блок из буфера.
  - Записать в файл - записать выделенный блок в файл.
  - Прочитать из файла - прочитать блок из файла.
- Сервис
  - Режим вставки - вкл/выкл режим вставки/замещения
  - Поиск строки - поиск строки по шаблону, по регулярному выражению - ищет в тексте, в блоке, во всех окнах.
  - Найти следующее/предыдущее - найти следующее/предыдущее вхождение подстроки в тексте.
  - Заменить - найти и заменить все вхождения подстроки на что-то новое.
  - Поиск символа вперед/назад - поиск идентичного символа вперед/назад по тексту. См. Поиск
  - Поиск структуры - поиск структур по правилам CLIPPER: См. Поиск
  - Откат - операция отката, в настройках редактора задается количество шагов отката.
  - Форматирование строки/абзаца - форматирование строки/абзаца по заданным настройкам (ширина строки, отступ, перенос в словах ...)
- Прочее
  - Шаблон - вставить строку по шаблону. Шаблоны и строки замены берутся из файла $HOME/.clip/.templ
  - Макроподстановка - выполнить макроподстановку. Шаблоны и строки замены берутся из файла $HOME/.clip/.macro
  - Графика одиночная/двойная - включить/выключить режим рисования одиночных/двойных линий.
  - Опции - настройки редактора

## Работа с блоками

Редактор различает два типа блоков - строчный и прямоугольный. Отметка блока очуществляется либо через меню, либо с помощью клавиатуры. "Горячие" клавиши отметки начала/конца строчного блока F7, а прямоугольного F8.
Отмеченные блоки выделяются цветом, снять отметку блока можно либо отметив новый блок, либо с помощью специальной команды через меню или нажав клавиши Ctrl+P.
Блоки можно копировать, переносить, удалять, копировать в буфер обмена и вставлять из буфера в другом окне, копировать блок из файла и записывать на диск. При копировании строчного блока он помещается между текущей строкой и предыдущей, а при копировании прямоугольного блока - начиная с текущей строки и колонки.
Перемещение отличается от копирования тем, что блок удаляется с прежнего места.
Удаление либо через меню, либо по "горячей" клавише Alt+Y. При этом
При копировании блока в буфер, прежнее содержимое буфера (если оно существовало) уничтожается, блок остается помеченным и сохраняется в буфере при удалении блока из текста вплоть до помещение в буфер нового блока или до завершения работы программы.

## Вставка/удаление символов

Редактор поддерживает режимы вставки и замещения символов. Перемещение курсора - клавиши <Up>, <Down>, <Left>, <Right>,
на страницу вверх/вниз - <PgUp>/<PgDown>,
в начало текста - <Ctrl+PgUp>,
в конец текста - <Ctrl+PgDown>,
на начало строки - <Home>,
в конец строки - <End>,
удаление символа: над курсором - <Del>,
слева от курсора - - <BackSpace>,
удаление символов от текущего символа до конца строки - <Ctrl+Q>,
удаление символов от текущего символа до начала строки - <Ctrl+BS>,
удаление строки - <Ctrl+Y>,
удаление отмеченного блока - <Alt+Y>,

## Поиск

Поиск (поиск с заменой) по шаблону, регулярному выражению с текущей позиции до конца/начала текста, блока, или во всех окнах. Через меню или по "горячей" клавише F6 вызывается объект "диалог", где и задается шаблон поиска, режимы (только слово, учитывать регистр и пр), направление поиска (вперед, назад) и где искать (текст, блок, во всех окнах). Продолжение поиска - Ctrl+L - поиск вперед.
Поиск идентичных символов вперед/назад по тексту. В случае поиска одного из парных символов { }, [ ], ( ), < > ищется пара для текущего. Если это открывающая скобка, то ищется парная ей закрывающая. И наоборот.
Поиск структур по правилам CLIPPER:

- DO WHILE - LOOP - EXIT - ENDDO
- DO CASE - CASE - OTHERWISE - EXIT - ENDCASE
- FOR - EXIT - LOOP - NEXT
- IF - ELSE - ELSEIF - ENDIF
- BEGIN SEQUENCE - BREAK - RECOVER - END SEQUENCE

## Форматирование

Форматирование строки/абзаца по заданным настройкам (ширина строки, отступ, перенос в словах ...)

## Макроподстановки

Для быстрой и красивой работы придуманы шаблоны. Шаблон представляет собой строку символов, которая по команде заменяется на более сложную конструкцию - одну или несколько строк. Шаблоны и строки замены можно конструировать по своему вкусу и желанию. Они хранятся в домашнем каталоге в директории .clipв файле с именем .templ. Примеры и формат файла $HOME/.clip/.templ.
Макроподстановка отличается от шаблона тем, что по команде - выполнить макроподстановку - выполняется команда clip'а и результат помещается в текст. Шаблоны макроподстановки и команды замены берутся из файла $HOME/.clip/.macro

## Рисование линий

С помощью редактора Вы можете рисовать простейшие таблицы символами псевдографики. Для этого через меню или при помощи клавиатуры необходимо переключиться в режим рисования (одиночные или двойные линии). Удерживая клавишу <Shift> используйте для рисования клавиши перемещения курсора <Up>, <Down>, <Left>, <Right>

## Настройка "горячих" клавиш

"Пользовательские кнопки" при старте загружаются из файла keymaps.po. Он хранится в домашнем каталоге в директории ./clip и компилируется из файла keymaps.prg Вы можете в соответствии со своими требованиями, желаниями и настроениями настроить "горячие" клавиши. Это легко. См. пример ниже.

Пример файла keymaps.prg

    /* User key_maps */
    #include "inkey.ch"

    function init_user_key(key_maps)
    local k

    	/* for debugger */
    	k:=key_maps:debug
    	/* Код клавиши 	  Команда */
    	k[ K_ESC ]	:=HASH_CallMenu
    	k[ K_F1 ] 	:=HASH_Help
    	     .........

    	/* for text editor */
    	k:=key_maps:edit

    	/* Код клавиши 	  Код                    Команда */
    	k[ K_ESC ]	:=HASH_CallMenu		// call Menu
    	k[ K_ALT_X ]	:=HASH_ExitSave		// exit from editor witch save
    	k[ K_ALT_B ]	:=HASH_ExitNoSave	// exit from editor witchout save
    	k[ K_F1 ]	:=HASH_HelpEdit		// help

    	/* file/window function */
    	k[ K_F2 ]	:=HASH_SaveFile		// save File
    	k[ K_F3 ]	:=HASH_OpenFile		// open file
    	k[ K_CTRL_F3 ]	:=HASH_CreateNewFile	// create new file
    	k[ K_ALT_N ]	:=HASH_NextWindow	// open next window
    	k[ K_ALT_P ]  	:=HASH_PrevWindow	// open previous window
    //	k[  ]	:=HASH_ReadOnly		// on/off read only options
    //	k[  ]	:=HASH_ListFiles	// listing opening files
    //	k[  ]	:=HASH_CloseWindow	// close current window
    //	k[  ]	:=HASH_Reload		// reload file

    	/* find function */
    	k[ K_F6 ]	:=HASH_FindString	// find string
    	k[ K_CTRL_F6 ]	:=HASH_FindReplace	// find and replace string
    	k[ K_CTRL_L ]	:=HASH_FindNext		// find string to forward
    //	k[  ]	:=HASH_FindPrev		// find string to backward
    	k[ K_CTRL_O ]	:=HASH_MatchSymbolForward // matching symbol to forward
    	k[ K_CTRL_T ]	:=HASH_MatchSymbolBackward // matching symbol to backward

    	/* move function */
    	k[ K_F4 ]	:=HASH_GoTo		// goto string
    	k[ K_CTRL_F4 ]	:=HASH_SavePos		// save current string
    	k[ K_CTRL_PGUP ]:=HASH_TopText		// go top text
    	k[ K_CTRL_PGDN ]:=HASH_BottomText	// go bottom text

    	/* edit function */
    	k[ K_F5 ]	:=HASH_Template		// insert template
    	k[ K_CTRL_F5 ]	:=HASH_Macro		// insert macro
    	k[ K_CTRL_Q ]	:=HASH_DeleteEnd	// delete string from current position to end
    	k[ K_CTRL_BS ]	:=HASH_DeleteBack	// delete string from current position to begin string
    	k[ K_CTRL_Y ]	:=HASH_DeleteLine	// delete line

    	/* block function */
    	k[ K_F7 ]	:=HASH_MarkBlockString	// mark/unmark strings block
    	k[ K_F8 ]	:=HASH_MarkBlockRect	// mark/unmark rectangle block
    	k[ K_F9 ]	:=HASH_CopyBlock	// copy marked block
    	k[ K_F10 ]	:=HASH_MoveBlock	// move marked block
    	k[ K_CTRL_P ]	:=HASH_CancelBlock	//unmark block
    	k[ K_ALT_Y ]	:=HASH_DeleteBlock	// delete marked block
    //	k[  ]	:=HASH_CopyClipboard	// copy marked block to clipboard
    //	k[  ]	:=HASH_PasteClipboard	// paste block from clipboard
    //	k[  ]	:=HASH_SaveBlock	// save marked block as ...
    //	k[  ]	:=HASH_LoadBlock	// load block from file

    	k[ K_CTRL_U ]	:=HASH_Undo		// undo operation

    	/* formatting function */
    //	k[  ]	:=HASH_FormatLine	// formatting line
    //	k[  ]	:=HASH_FormatPart	// formatting part
    //	k[  ]	:=HASH_MoveString	// move string to the center line

    	/* other */
    //	k[  ]	:=HASH_Options		// editors options
    //	k[  ]	:=HASH_SingleGraphic	// on/off single graphic mode
    //	k[  ]	:=HASH_DoubleGraphic	// on/off double graphic mode
    //	k[  ]	:=HASH_MatchStructForward // find clipper-structure to forward
    //	k[  ]	:=HASH_MatchStructBackward // find clipper-structure to backward
    return key_maps

Вам необходимо просто поменять код клавиши "по умолчанию", на тот, который Вам больше нравится. Например, Вы приыкли вызывать меню по Клавише <F10>, для этого Вы должны исправить строку:

    	k[ K_ESC ]	:=HASH_CallMenu		// call Menu

на:

    	k[ K_F10 ]	:=HASH_CallMenu		// call Menu

Но будьте внимательны, если ниже на эту же клавишу будет "повешана" другая команда, то эта последняя и будет исполнятся при нажатии клавиши. Т.е. действует принцип "кто последний, тот и папа".
После переназначения клавиш необходимо перекомпилировать файл keymaps.prg с ключом -p, чтобы получился файл keymaps.po:

    $(CLIPROOT)/bin/clip -e -p keymaps.prg

И получившийся .po скопировать в домашний каталог:

    cp keymaps.po ~/.clip

Формат файла .templ

Файл .templ хранится в домашнем каталоге пользователя в директории .clip

шаблон [Space|Tab] описание[/описание]
Символ [/] служит для деления на строки
Пример:

    headf	******************************/*Function:/*Notes:/ /*** End of          **********
    headp	******************************/*File:/*Author:/*Date:/*Version:/*Notes:/ /*** End of          **********
    f	For/Next
    c	CLEAR
    *	******************************
    IF	If/EndIF
    I	If/EndIF
    IE	If/Else/EndIF
    D	DO/EndDO
    DW	DO WHILE/EndDO
    DC	DO CASE/    CASE/    OTHERWISE/EndCASE
    .............

т.е. после подстановки, например, вместо шаблона DC должно получиться что-то вроде:

    DO CASE
        CASE
        OTHERWISE
    EndCASE

а вместо шаблона headp

    ******************************
    *File:
    *Author:
    *Date:
    *Version:
    *Notes:

    *** End of          **********

Формат файла .macro

Файл .macro хранится в домашнем каталоге пользователя в директории .clip

шаблон [Space|Tab] функция
Пример:

    d	DATE()
    dd	date_rus(date())
    .............

т.е. после подстановки, например, вместо шаблона d должно получиться что-то вроде:

    11/22/2000

а вместо шаблона dd

    22  Ноября 2000 г.