| The Russian Electronic Developer Magazine | |
| Русский электронный журнал разработчика | |
О, сколько нам открытий чудных
Готовит просвещенья дух...
А.С.Пушкин
|
|
В статье рассматривается вопрос построения комфортной среды разработки программ.
Все нижеизложенные рекомендации основаны на личных предпочтениях автора
и не обязательны для применения. |
SET HELPNDX=DDE4.NDX+EPMKWHLP.NDX
|
|
Автор не располагает документацией с описанием структуры индексных файлов.
Поэтому все предположения относительно этой структуры основаны на догадках
(впрочем, весьма прозрачных), сделаных на основе анализа доступных
индексных файлов. |
ОПЕРАТОР: параметрыИзвестны (замечены в доступных индексных файлах :-)), по крайней мере, два оператора:
(шаблон поиска, шаблон командной строки)где
| Шаблон лексемы, по которой производится поиск (регистрозависимый).
Шаблон может содержать символ-заменитель, задаваемый оператором EXTENSIONS.
Символ-заменитель означает, что вместо него может быть подставлено
произвольное количество символов. | |
| Комадная строка, содержащая имя и параметры запуска приложения,
выполняющего роль программы просмотра помощи (обычно это команда view).
При запуске этого приложения вместо символа тильда (~) в командную строку
подставляется лексема, удовлетворящая шаблону поиска. |
EXTENSIONS: * DESCRIPTION: Custom Index for Toolkit (fopen, view clr ~) (Win*, view pmref ~) ...Первой индексной строке удовлетворяет лексема fopen, а второй - любая лексема, начинающаяся на Win: WinCreateWindow, WinQueryWindow и т.д. В качестве программы просмотра помощи используется программа view, которая в виде параметров получает имя файла помощи и лексему. Например, если пользователь вызвал подсказку для лексемы WinCreateWindow, то программа просмотра помощи будет запущена следующей командной строкой:
view pmref WinCreateWindowПосле старта view проверяет существует ли уже активное приложение view, просматривающее тот же файл помощи (в данном случае, pmref). Если оно обнаружено, то view просто переключает существующее приложение на просмотр нового раздела. В противном случае продолжает работу, показывая заказанный раздел файла помощи (в данном случае, WinCreateWindow, определенный в одном из тегов :h1.-:h6.).
(NW*, cmd.exe /c start /c /f /win winhelp.exe c:\nwsdk\winhelp\c_apiref.hlp)А для просмотра документов в формате HTML вполне подходит links:
(MENUITEM, cmd.exe /c start /c /f /win links.exe -no-connect file://C:/HTML/rc.html#~)Однако, немалым преимуществом view является то, что он позволяет переключить ранее запущенное приложение view на просмотр другого раздела помощи вместо запуска нового процесса. Кроме того, использование опции clear в тегах :h1.-:h6. файла помощи позволяет избежать излишнего размножения окон уже внутри самого приложения view.
/* Get help */
/* Copyleft VicTor Smirnoff, 2001 */
'extract /filename'
fname = filespec( "name", filename.1 )
d = lastpos( '.', fname )
if d > 0 then
do
fext = translate( substr( fname, d+1 ) )
select
when wordpos( fext, "RC DLG" ) > 0 then
xHelp = 'EPMKWRC.NDX'
when wordpos( fext, "CMD ERX" ) > 0 then
xHelp = 'EPMKWRX.NDX'
otherwise
xHelp = ''
end
rc = setlocal()
xOld = Value( 'HELPNDX', , 'OS2ENVIRONMENT' )
if xHelp \= '' then
do
xNew = xHelp||'+EPMKWHLP.NDX'
if xOld \= '' then xNew = xHelp||'+'||xOld
rc = Value( 'HELPNDX', xNew, 'OS2ENVIRONMENT' )
end
'dokey c+H'
rc = endlocal()
end
Макрос проверяет расширение редактируемого файла, в соответствии с ним выбирает имя индексного файла,
которое добавляет в начало последовательности просмотра, задаваемое переменной среды HELPNDX.
Затем вызывает систему помощи (команда dokey, к сожалению, недокументированная, но о ней позже)
и восстанавливает предыдущее значение переменной среды HELPNDX.
/* Hilite keywords */
/* Copyleft VicTor Smirnoff, 2001 */
'extract /filename'
fname = filespec( "name", filename.1 )
d = lastpos( '.', fname )
if d > 0 then
do
fext = translate( substr( fname, d+1 ) )
select
when wordpos( fext, "C H CPP HPP" ) > 0 then
fext = 'C'
when wordpos( fext, "RC DLG" ) > 0 then
fext = 'RC'
when wordpos( fext, "BAT CMD ERX VRX" ) > 0 then
fext = 'CMD'
when wordpos( fext, "HTM HTML" ) > 0 then
fext = 'HTM'
otherwise
nop
end
'extract /userstring'
parse upper var userstring.1 xA'HILITE='xHi';'xB
yHi = 1
if xHi = 1 then yHi = 0
call etksetfilefield 'userstring', xA||'HILITE='||yHi||';'||xB
'toggle_parse '||yHi||' epmkwds.'||fext
end
Макрос проверяет расширение редактируемого файла, в соответствии с ним и группами родственных файлов
выбирает расширение для файла схемы подсветки.
Затем проверяет состояние собственного флага HILITE, хранимого в поле userstring
(приходится делать так, потому что добраться до флага, отвечающего за подсветку текста в окне,
из REXX-а не удается),
в сответствии с ним переключает режим подсветки
(команда toggle_parse, тоже недокументированная и тоже о ней позже)
и сохраняет новое состояние флага HILITE.
/* Add all source files */
/* Copyleft VicTor Smirnoff, 2001 */
currentID = rxGetFileId()
'edit *.c,*.cpp,*.h,*.hpp,*.rc,*.dlg'
newID = rxGetFileId()
xID = 0
do while xID \= newID
call hilite.erx
call etkprocesseditkey "NEXT_FILE" /* dokey F12 */
xID = rxGetFileId()
end
xID = rxGetFileId()
do while xID \= currentID
call etkprocesseditkey "NEXT_FILE" /* dokey F12 */
xID = rxGetFileId()
end
exit
rxGetFileId: procedure
call etkprocesseditkey "UNMARK"
call etkprocesseditkey "MARK_LINE"
'extract /getmark'
call etkprocesseditkey "UNMARK"
return getmark.5
Макрос получает идентификатор текущего файла в кольце (это не хэндл; тут надо отметить,
что каждый файл в кольце имеет свой идентификатор, правда, путь к его получению весьма нетривиален)
и загружает в кольцо все существующие файлы исходных текстов из текущего каталога.
Затем макрос прокручивает файлы в кольце, включает подсветку ключевых слов для каждого
и, наконец, делает текущим первоначальный файл.
/* Save all modified files */
/* Copyleft VicTor Smirnoff, 2001 */
currentID = rxGetFileId()
xID = 0
do while xID \= currentID
'extract /modify'
if modify.1 \= 0 then 'save'
call etkprocesseditkey "NEXT_FILE" /* dokey F12 */
xID = rxGetFileId()
end
exit
rxGetFileId: procedure
call etkprocesseditkey "UNMARK"
call etkprocesseditkey "MARK_LINE"
'extract /getmark'
call etkprocesseditkey "UNMARK"
return getmark.5
Макрос получает идентификатор текущего файла, прокручивает файлы в кольце
и сохраняет каждый модифицированный файл
(за исключением новых, без имени).
/* Toggle mono/proportional fonts */
/* Copyleft VicTor Smirnoff, 2001 */
'extract /font'
if font.1 = 1 then
call etksetfilefield 'font', 2
else
call etksetfilefield 'font', 1
Не менее полезен макрос searchprocedure.erx (он слишком велик, чтобы приводить
в тексте статьи, см. архив myepm.zip),
выполняющий поиск исходного текста функции с файлах кольца
(пока только для C/C++).
/* Insert comment */
/* Copyleft VicTor Smirnoff, 2001 */
'extract /filename/last'
fname = filespec( "name", filename.1 )
d = lastpos( '.', fname )
if d > 0 then
do
fext = translate( substr( fname, d+1 ) )
select
when wordpos( fext, "C H CPP HPP RC DLG CMD ERX VRX" ) > 0 then
do
call etksetfilefield 'col', 1
call etkinserttext substr('/',1,75,'*')||'/'
call etkinserttext substr('/*',1,74,' ')||'*/'
call etkinserttext substr('/',1,75,'*')||'/'
end
otherwise
nop
end
end
Макрос insertfunction.erx оформляет заготовками блоков комментариев
исходный текст функции.
Для этого надо установить курсор на имя функции и выполнить макрос.
Например, исходный текст функции MyCoolFunction() будет снабжен следующими
заготовками комментариев:
/**************************************************************************/
/* MyCoolFunction() */
/*========================================================================*/
/* Описание: */
/* */
/* Синтаксис: */
/* rc = MyCoolFunction(idWho,cName,idWhere,cStreet); */
/* */
/* Параметры: */
/* idWho */
/* cName */
/* idWhere */
/* cStreet */
/* */
/* Возврат: */
/* rc */
/* */
/*------------------------------------------------------------------------*/
INT MyCoolFunction( INT idWho, CHAR *cName, INT idWhere, CHAR *cStreet )
{
. . .
}
/*------------------------------------------------------------------------*/
/* Конец функции MyCoolFunction() */
/**************************************************************************/
Аналогично, макрос insertheader.erx оформляет заготовками блоков комментариев
файл исходных текстов.
Например, файл MyCoolRoutine.c будет снабжен следующими заготовками комментариев:
/**************************************************************************/
/* MyCoolRoutine.c - исходные тексты программы */
/* */
/*========================================================================*/
/* (c) VicTor Smirnoff, 2001 sva@water.karelia.ru */
/*------------------------------------------------------------------------*/
#define INCL_PM
#include <os2.h>
. . .
/*------------------------------------------------------------------------*/
/* Конец файла MyCoolRoutine.c */
/**************************************************************************/
А макросы formattext.erx и formatselect.erx позволяют отформатировать
текстовые файлы, без которых не обходится ни одна разработка.
Например, полоса инструментов выглядит значительно лучше,
если содержит только небольшие рисунки (не больше, чем 16x16),
как на рисунке слева.
/* Profile REXX */ /* Copyleft VicTor Smirnoff, 2001 */ AF_CHAR = 1 /* константы стиля клавиш */ AF_VIRTUALKEY = 2 AF_SCANCODE = 4 AF_SHIFT = 8 AF_CONTROL = 16 AF_ALT = 32 AF_LONEKEY = 64 VK_F1 = 32 VK_ALT = 11 MIS_SEPARATOR = 4 /* Настройка опций */ /* При поиске, по умолчанию, не учитывается регистр */ 'universal default_search_options C' /* При загрузке файла преобразовать табуляции в пробелы */ 'universal default_edit_options /nt' /* Удалить пробелы на концах строк при сохранении файла */ 'universal default_save_options /s' /* Настройка горячих клавиш */ /* ASCII 104 = 'h' */ /* ASCII 122 = 'z' */ /* Ctrl-h получить справку */ /* Ctrl-z заключить бокс в рамку комментариев C */ /* Alt-z убрать рамку вокруг бокса */ 'buildaccel *' (AF_CHAR + AF_CONTROL) 104 9302 'rx gethelp' 'buildaccel *' (AF_CHAR + AF_CONTROL) 122 9301 'box c' 'buildaccel *' (AF_CHAR + AF_ALT) 122 9300 'box e' /* Запрещает использование клавиши Alt для перехода на полосу меню.*/ 'buildaccel *' (AF_VIRTUALKEY+AF_LONEKEY) VK_ALT 9399 'sayerror F10=полоса меню' 'activateaccel' /* Нет аргумента => используется текущее имя таблицы. */ /* Настройка меню */ 'buildsubmenu default 1990 Исходники 0 0' 'buildmenuitem default 1990 1991 Подсветка 0 0 rx hilite' 'buildmenuitem default 1990 1992 Добавить_Все 0 0 rx addall' 'buildmenuitem default 1990 1993 x' MIS_SEPARATOR '0' 'buildmenuitem default 1990 1994 Вставить_Заголовок_Файла 0 0 rx insertheader' 'buildmenuitem default 1990 1995 Вставить_Заголовок_Функции 0 0 rx insertfunction' 'buildmenuitem default 1990 1996 Вставить_Комментарий 0 0 rx insertcomment' 'showmenu default'
Примеры полосы инструментов, битмапы и тексты макросов REXX и находятся в архиве
myepm.zip.
Успехов,
VicTor Smirnoff
Интересные ссылки:
Комментариев к странице: 0 | Добавить комментарий
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов