Коллеги просили всоседней веткеразворачиватель для ABSTRACT-процедур.
модератор: "соседняя ветка" внесена сюда

Пользуюсь вот таким.
Автор - Павел Манюнин (мой бывший студент, ныне проходящий службу в в рядах военно-воздушных сил РФ).

## Код:
```
IMPORT TextControllers, TextModels, TextMappers;
   
   PROCEDURE MakeProcBody*;
      VAR c: TextControllers.Controller;
         beg, end: INTEGER;
         rd: TextModels.Reader;
         procname: ARRAY 64 OF CHAR;
         i, j: INTEGER;
         ch: CHAR;
         find: BOOLEAN;
         f: TextMappers.Formatter;
   BEGIN
      c := TextControllers.Focus();
      IF c.HasSelection() THEN
         c.GetSelection(beg, end);
         rd := c.text.NewReader(NIL);
         i := beg; j := 0;
         rd.SetPos(beg);
         WHILE i < end DO
            rd.ReadChar(procname[j]);
            INC(j);
            INC(i)
         END;
         procname[j] := 0X;
         find := FALSE;
         i := end;
         rd.ReadChar(ch);
         WHILE ~( rd.eot OR (ch = 0DX) ) & ~( (ch = "(") OR (ch = ",") ) DO 
            rd.ReadChar(ch)
         END;
         IF ch = "(" THEN
            rd.ReadChar(ch);
            WHILE (~(ch = 0DX) & ~(rd.eot)) & ~(ch = ")") DO
                rd.ReadChar(ch)
            END;
            IF ch # 0DX THEN
               rd.ReadChar(ch);
               WHILE (~(ch = 0DX) & ~(rd.eot)) & ~(ch = ",") DO 
                  rd.ReadChar(ch)
               END;
            END;
         END;
         IF ch = "," THEN
            beg := rd.Pos()-1;
            find := TRUE;
         END;
         IF find THEN
            rd.ReadChar(ch);
            WHILE ~rd.eot & ~(ch = 0DX) DO
               rd.ReadChar(ch);
            END;
            c.text.Delete(beg, rd.Pos());
            f.ConnectTo(c.text);
            f.rider.SetPos(beg);
            f.rider.WriteChar(';');
            f.rider.WriteChar(TextModels.line);
            f.rider.WriteChar(TextModels.tab);
            f.WriteString("BEGIN");
            f.rider.WriteChar(TextModels.line);
            (* IF  это функция THEN
            END; *)
            f.rider.WriteChar(TextModels.tab); 
            f.WriteString("END ");
            f.WriteString(procname); 
            f.rider.WriteChar(';');
            f.rider.WriteChar(TextModels.line);
         END;
      END;
   END MakeProcBody;
```


MakeProcBody вешается в меню.

Как применять:
скопировали себе в модуль реализации абстрактные декларации. Выделяем имя процедуры двойным кликом, даём команду, она разворачивается в реализацию. Надо бы избавиться от необходимости выделять, пусть просто курсор стоит на строке.