EXM: Różnice pomiędzy wersjami

Z MERA 400 wiki
Przejdź do nawigacji Przejdź do wyszukiwania
Nie podano opisu zmian
Nie podano opisu zmian
 
(Nie pokazano 3 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 23: Linia 23:
== Adresacja wierszy ==
== Adresacja wierszy ==


Po wczytaniu zbioru wskaźnik dostępu do bufora roboczego jest ustawiany na pierwszy wiersz (bieżący wiersz jest wyświetlany na końcówce). Najprostszym sposobem zmiany położenia wskaźnika dostępu (zmiany wiersza bieżącego) jest podanie numeru bezwzględnego wiersza w buforze. Numer wiersza jest to liczba całkowita bez znaku: pierwszy wiersz bufora roboczego ma numer 1, ostatni jest wskazywany znakiem <code>$</code>. Przykładowo zlecenie <code>126</code> ustawi wskaźnik do bufora roboczego na wiersz o numerze 126. Po wykonaniu tego zlecenia zawartość wiersza zostanie wyświetlona na monitorze. Podanie numeru wykraczającego poza liczbę wierszy w buforze jest sygnalizowane komunikatem:
Po wczytaniu zbioru wskaźnik dostępu do bufora roboczego jest ustawiany na pierwszy wiersz (bieżący wiersz jest wyświetlany na końcówce). Najprostszym sposobem zmiany położenia wskaźnika dostępu (zmiany wiersza bieżącego) jest podanie numeru bezwzględnego wiersza w buforze. Numer wiersza jest to liczba całkowita bez znaku. Pierwszy wiersz bufora roboczego ma numer 1, ostatni jest wskazywany znakiem <code>$</code>. Przykładowo zlecenie <code>126</code> ustawi wskaźnik do bufora roboczego na wiersz o numerze 126. Po wykonaniu tego zlecenia zawartość wiersza zostanie wyświetlona na monitorze. Podanie numeru wykraczającego poza liczbę wierszy w buforze jest sygnalizowane komunikatem:


  LINE OUT OF FILE
  LINE OUT OF FILE
Linia 29: Linia 29:
a wiersz bieżący nie ulega zmianie. Wprowadzenie znaku <code>+</code> (plus) lub samego znaku RETURN powoduje przesunięcie wskaźnika dostępu na następny wiersz. Cofanie o jeden wiersz jest realizowane po wprowadzeniu znaku <code>-</code> (minus). Znaki <code>+</code> i <code>-</code> mogą być użyte w jednym zleceniu wielokrotnie. Zapis: <code>++++</code> oznacza przesunięcie wskaźnika dostępu do bufora o 4 wiersze do przodu. Zamiast ciągu znaków <code>+</code> (plus) lub <code>-</code> (minus) można wprowadzić liczbę całkowitą ze znakiem. Zlecenie <code>+5</code> przesuwa wskaźnik dostępu o 5 wierszy do przodu a zlecenie <code>-2</code> o 2 do tyłu.
a wiersz bieżący nie ulega zmianie. Wprowadzenie znaku <code>+</code> (plus) lub samego znaku RETURN powoduje przesunięcie wskaźnika dostępu na następny wiersz. Cofanie o jeden wiersz jest realizowane po wprowadzeniu znaku <code>-</code> (minus). Znaki <code>+</code> i <code>-</code> mogą być użyte w jednym zleceniu wielokrotnie. Zapis: <code>++++</code> oznacza przesunięcie wskaźnika dostępu do bufora o 4 wiersze do przodu. Zamiast ciągu znaków <code>+</code> (plus) lub <code>-</code> (minus) można wprowadzić liczbę całkowitą ze znakiem. Zlecenie <code>+5</code> przesuwa wskaźnik dostępu o 5 wierszy do przodu a zlecenie <code>-2</code> o 2 do tyłu.


Kolejnym, chyba najczęściej stosowanym, sposobem wskazywania wierszy jest podanie wzorca zawartości wiersza. Wzorzec jest to ciąg znaków określających zawartość szukanego wiersza. Wzorzec musi być objęty nawiasami <code>/.../</code> lub <code>?...?</code>. Jeżeli będą to znaki '''/''' np: <code>/start/</code>, to zbiór będzie przeszukiwany od wiersza bieżącego do przodu. Objęcie wzorca znakami <code>?</code> oznacza poszukiwanie od wiersza bieżącego do tyłu. Jeżeli wiersz nie zostanie znaleziony do końca (lub początku) bufora roboczego, zostanie wyprowadzony komunikat:
Kolejnym, chyba najczęściej stosowanym, sposobem wskazywania wierszy jest podanie wzorca zawartości wiersza. Wzorzec jest to ciąg znaków określających zawartość szukanego wiersza. Wzorzec musi być objęty nawiasami <code>/.../</code> lub <code>?...?</code>. Jeżeli będą to znaki <code>/</code> np: <code>/start/</code>, to zbiór będzie przeszukiwany od wiersza bieżącego do przodu. Objęcie wzorca znakami <code>?</code> oznacza poszukiwanie od wiersza bieżącego do tyłu. Jeżeli wiersz nie zostanie znaleziony do końca (lub początku) bufora roboczego, zostanie wyprowadzony komunikat:


  PATTERN NOT FOUND : /<wzorzec>/
  PATTERN NOT FOUND : /<wzorzec>/
Linia 52: Linia 52:
Wiersz bieżący można usunąć zleceniem <code>D</code>. Po wykonaniu tego zlecenia wierszem bieżącym staje się wiersz następny. Wyjątkowo po usunięciu ostatniego wiersza w buforze, bieżącym staje się wiersz poprzedni.
Wiersz bieżący można usunąć zleceniem <code>D</code>. Po wykonaniu tego zlecenia wierszem bieżącym staje się wiersz następny. Wyjątkowo po usunięciu ostatniego wiersza w buforze, bieżącym staje się wiersz poprzedni.


Do wstawiania nowych wierszy najczęściej jest używana instrukcja <code>A</code>. Po wprowadzeniu tej instrukcji edytor zgłasza się na początku nowej linii i przyjmuje kolejne wiersze. Nowe wiersze są wprowadzane za wierszem bieżącym. Wprowadzanie kończy wpisanie wiersza zawierającego '''dc4''' (CRTL/T) - wiersz ten nie zostanie już wprowadzony do bufora. Po wykonaniu instrukcji bieżącym wierszem jest ostatni wprowadzony wiersz. Inne instrukcje służące do wprowadzania wierszy: <code>I</code> - wprowadzanie wierszy przed wierszem bieżącym, oraz <code>C</code> - wprowadzanie wierszy w miejsce wiersza bieżącego działają podobnie jak instrukcja <code>A</code>. Instrukcja <code>C</code> jest równoważna użyciu dwóch instrukcji: <code>D</code> <code>I</code> z tą jednak różnicą,że po wykonaniu instrukcji <code>I</code> wierszem bieżącym pozostanie wiersz dostępny przed wykonaniem zlecenia <code>I</code>, natomiast po wykonaniu instrukcji <code>C</code> wierszem bieżącym będzie ostatni wprowadzony wiersz. Jeżeli wstawiany ma być tylko jeden wiersz, można użyć instrukcji <code>A</code>, <code>I</code> lub <code>C</code> w uproszczonej postaci - po nazwie instrukcji należy wprowadzić znak '''lf''' (LINE FEED) i za nim treść wiersza zakończoną znakiem '''cr''' (RETURN). Na przykład:
Do wstawiania nowych wierszy najczęściej jest używana instrukcja <code>A</code>. Po wprowadzeniu tej instrukcji edytor zgłasza się na początku nowej linii i przyjmuje kolejne wiersze. Nowe wiersze są wprowadzane za wierszem bieżącym. Wprowadzanie kończy wpisanie wiersza zawierającego '''dc4''' (CRTL/T) - wiersz ten nie zostanie już wprowadzony do bufora. Po wykonaniu instrukcji bieżącym wierszem jest ostatni wprowadzony wiersz.
 
Inne instrukcje służące do wprowadzania wierszy: <code>I</code> - wprowadzanie wierszy przed wierszem bieżącym, oraz <code>C</code> - wprowadzanie wierszy w miejsce wiersza bieżącego działają podobnie jak instrukcja <code>A</code>. Instrukcja <code>C</code> jest równoważna użyciu dwóch instrukcji: <code>D</code> <code>I</code> z tą jednak różnicą,że po wykonaniu instrukcji <code>I</code> wierszem bieżącym pozostanie wiersz dostępny przed wykonaniem zlecenia <code>I</code>, natomiast po wykonaniu instrukcji <code>C</code> wierszem bieżącym będzie ostatni wprowadzony wiersz. Jeżeli wstawiany ma być tylko jeden wiersz, można użyć instrukcji <code>A</code>, <code>I</code> lub <code>C</code> w uproszczonej postaci - po nazwie instrukcji należy wprowadzić znak '''lf''' (LINE FEED) i za nim treść wiersza zakończoną znakiem '''cr''' (RETURN). Na przykład:


  A
  A
Linia 72: Linia 74:
== Adres wiersza w zleceniu ==
== Adres wiersza w zleceniu ==


Dotychczas były pokazane przykłady działania na wierszu bieżącym. Chcąc usunąć wiersz zawierający ciąg ''text1'' można wprowadzić dwa zlecenia: <code>/text1</code> <code>D</code>/ Taki sam efekt da wprowadzenie jednego zlecenia: <code>/text1/D</code>. Podobnie inne instrukcje edytora mogą być poprzedzone w zleceniach adresem wiersza. Zlecenie: <code>$A</code> będzie dołączało nowe wiersze na końcu bufora roboczego.
Dotychczas były pokazane przykłady działania na wierszu bieżącym. Chcąc usunąć wiersz zawierający ciąg ''text1'' można wprowadzić dwa zlecenia: <code>/text1</code> <code>D</code>. Taki sam efekt da wprowadzenie jednego zlecenia: <code>/text1/D</code>. Podobnie inne instrukcje edytora mogą być poprzedzone w zleceniach adresem wiersza. Zlecenie: <code>$A</code> będzie dołączało nowe wiersze na końcu bufora roboczego.


== Cofanie wykonanych poprawek ==
== Cofanie wykonanych poprawek ==
Linia 80: Linia 82:
== Opis obszaru ==
== Opis obszaru ==


Wiele instrukcji EXM może działać na więcej niż jednym wierszu. Aby na przykład zamienić kilka wierszy na nowe wprowadzone z klawiatury, należy poprzedzić instrukcję <code>C</code> opisem usuwanego obszaru. Pierwszym sposobem opisania obszaru jest podanie adresu początkowego wiersza obszaru i liczby wierszy. Opis <code>10:2</code> obejmuje obszar rozpoczynający się od wiersza 10 i długości 2 wierszy. Pominięty adres pierwszego wiersza oznacza, że obszar rozpoczyna się od wiersza bieżącego. Zlecenie <code>:3C</code> zamieni wiersz bieżący i dwa następne na wiersze wprowadzane z końcówki. Drugim sposobem opisania obszaru jest wskazanie pierwszego i ostatniego wiersza obszaru. <code>1,$</code> oznacza obszar od pierwszego do ostatniego wiersza (czyli cały bufor roboczy). I tu pominięcie opisu któregoś z wierszy oznacza wiersz bieżący. Opis <code>1,</code> oznacza obszar od początku bufora roboczego do wiersza bieżącego. Jeżeli adresy wierszy opisujących obszar nie są numerami bezwzględnymi wierszy w buforze, obliczanie ich wartości rozpoczyna się od wiersza dostępnego w momencie wprowadzania zlecenia. Na przykład, jeżeli dostępny jest wiersz o numerze 50, definicja <code>40,+5</code> wskazuje obszar od wiersza 40 do wiersza 55 włącznie. Inaczej będzie, gdy separatorem między adresami wierszy będzie nie przecinek ale średnik. W tym przypadku podstawą do wyliczenia drugiego parametru będzie już znany adres pierwszego wiersza obszaru. Opis <code>40;+5</code> obejmie wiersze 40 do 45 włącznie. Należy tu zauważyć, że definicja <code>40:5</code> obejmie wiersze 40 do 44.
Wiele instrukcji EXM może działać na więcej niż jednym wierszu. Aby na przykład zamienić kilka wierszy na nowe wprowadzone z klawiatury, należy poprzedzić instrukcję <code>C</code> opisem usuwanego obszaru.
 
Pierwszym sposobem opisania obszaru jest podanie adresu początkowego wiersza obszaru i liczby wierszy. Opis <code>10:2</code> obejmuje obszar rozpoczynający się od wiersza 10 i długości 2 wierszy. Pominięty adres pierwszego wiersza oznacza, że obszar rozpoczyna się od wiersza bieżącego. Zlecenie <code>:3C</code> zamieni wiersz bieżący i dwa następne na wiersze wprowadzane z końcówki. Drugim sposobem opisania obszaru jest wskazanie pierwszego i ostatniego wiersza obszaru. <code>1,$</code> oznacza obszar od pierwszego do ostatniego wiersza (czyli cały bufor roboczy). I tu pominięcie opisu któregoś z wierszy oznacza wiersz bieżący. Opis <code>1,</code> oznacza obszar od początku bufora roboczego do wiersza bieżącego. Jeżeli adresy wierszy opisujących obszar nie są numerami bezwzględnymi wierszy w buforze, obliczanie ich wartości rozpoczyna się od wiersza dostępnego w momencie wprowadzania zlecenia. Na przykład, jeżeli dostępny jest wiersz o numerze 50, definicja <code>40,+5</code> wskazuje obszar od wiersza 40 do wiersza 55 włącznie. Inaczej będzie, gdy separatorem między adresami wierszy będzie nie przecinek ale średnik. W tym przypadku podstawą do wyliczenia drugiego parametru będzie już znany adres pierwszego wiersza obszaru. Opis <code>40;+5</code> obejmie wiersze 40 do 45 włącznie. Należy tu zauważyć, że definicja <code>40:5</code> obejmie wiersze 40 do 44.


== Znaczniki wierszy ==
== Znaczniki wierszy ==
Linia 104: Linia 108:
== Zmiana zawartości wiersza ==
== Zmiana zawartości wiersza ==


Jedną z najużyteczniejszych instrukcji jest instrukcja podstawienia zmieniająca zawartość wiersza. W najprostszej postaci zamienia ona wskazany łańcuch znaków na inny:
Jedną z najużyteczniejszych instrukcji jest instrukcja podstawienia zmieniająca zawartość wiersza. W najprostszej postaci zamienia ona wskazany łańcuch znaków na inny. Wiersz:
 
a=x1+2


a=x1+2 - wiersz bieżący
po wykonaniu instrukcji podstawiania <code>S/x1/y</code> będzie wyglądał:
S/x1/y - instrukcja podstawienia
a=y+2 - wiersz po zmianie


Łańcuch zawarty między znakami <code>/</code> może zawierać znaki specjalne <code>^</code> i <code>$</code> tworząc wzorzec o takiej samej budowie jak opisany wcześniej wzorzec zawartości wiersza. Łańcuch zgodny ze wzorcem jest zamieniany na podany łańcuch. I tak zlecenie <code>S/a$/bb</code> zamieni znak ''a'' kończący wiersz na znaki ''bb''. Zlecenie <code>S/^/<łańcuch></code> dołączy podany łańcuch na początku wiersza, a zlecenie <code>S/$/<łańcuch></code> - na końcu. Znak '''lf''' we wstawianym łańcuchu powoduje podzielenie wiersza na dwa:
a=y+2
 
Łańcuch zawarty między znakami <code>/</code> może zawierać znaki specjalne <code>^</code> i <code>$</code> tworząc wzorzec o takiej samej budowie jak opisany wcześniej wzorzec zawartości wiersza. Łańcuch zgodny ze wzorcem jest zamieniany na podany łańcuch. I tak zlecenie <code>S/a$/bb</code> zamieni znak ''a'' kończący wiersz na znaki ''bb''. Zlecenie <code>S/^/<łańcuch></code> dołączy podany łańcuch na początku wiersza, a zlecenie <code>S/$/<łańcuch></code> - na końcu. Znak '''lf''' we wstawianym łańcuchu powoduje podzielenie wiersza na dwa. Na przykład wiersz:


  LWT,R1,0. RW,A(BUF3)
  LWT,R1,0. RW,A(BUF3)
S/./.lf
 
po wykonaniu instrukcji <code>S/./.lf</code> zostanie podzielony na dwa:
 
  LWT,R1,0.
  LWT,R1,0.
  RW,A(BUF3)
  RW,A(BUF3)
Linia 124: Linia 132:


  a=x1+a
  a=x1+a
S/a/b/G
 
po wykonaniu polecenia <code>S/a/b/G</code>:
 
  b=x1+b
  b=x1+b


Linia 130: Linia 140:


  a3=x1+a2-a+ab
  a3=x1+a2-a+ab
S/a/b/--+
 
po wykonaniu polecenia <code>S/a/b/--+</code>:
 
  a3=x1+a2-b+ab
  a3=x1+a2-b+ab


Znak <code>-</code> podany po znaku <code>/</code> ograniczającym łańcuch wstawiany oznacza, że kolejny łańcuch ma pozostać bez zmian, znak +</code> oznacza wykonanie podstawienia. Zamiast ciągu znaków <code>+</code> lub <code>-</code> można podawać liczby odpowiednio dodatnie lub ujemne. Zlecenie z ostatniego przykładu można zapisać także: <code>S/a/b/-2+1</code> lub <code>S/a/b/-2 1</code> Podanie po ciągu znaków <code>+</code> , <code>-</code> znaku <code>G</code> oznacza wykonanie podstawienia dla wszystkich pozostałych łańcuchów zgodnych ze wzorcem:
Znak <code>-</code> podany po znaku <code>/</code> ograniczającym łańcuch wstawiany oznacza, że kolejny łańcuch ma pozostać bez zmian, znak <code>+</code> oznacza wykonanie podstawienia. Zamiast ciągu znaków <code>+</code> lub <code>-</code> można podawać liczby odpowiednio dodatnie lub ujemne. Zlecenie z ostatniego przykładu można zapisać także: <code>S/a/b/-2+1</code> lub <code>S/a/b/-2 1</code> Podanie po ciągu znaków <code>+</code>, <code>-</code> znaku <code>G</code> oznacza wykonanie podstawienia dla wszystkich pozostałych łańcuchów zgodnych ze wzorcem:


  a3=x1+a2+a+a
  a3=x1+a2+a+a
S/a/b/--G
 
po wykonaniu polecenia <code>S/a/b/--G</code>:
 
  a3=x1+a2+b+b
  a3=x1+a2+b+b


Linia 174: Linia 188:
== Łączenie wierszy ==
== Łączenie wierszy ==


Do łączenia wierszy służy instrukcja <code>J</code>. Zlecenie <code>JJ</code> połączy bieżący wiersz z następnym. Jeżeli w zleceniu opisany jest obszar obejmujący więcej niż jeden wiersz, to połączone zostaną wszystkie wskazane wiersze. Należy zwrócić tu uwagę, że zlecenia w postaci <code>J</code>, <code>:1J</code>, <code>:2J</code> <code>+1J</code> są równoważne sobie i powodują połączenie bieżącego wiersza z następnym (zlecenia inne działające na wielu wierszach np <code>D:</code>, <code>1D</code>, <code>:2D</code> <code>+1D</code> nie są sobie równoważne, gdyż dwa pierwsze dotyczą wiersza bieżącego, a pozostałe wiersza bieżącego i następnego).
Do łączenia wierszy służy instrukcja <code>J</code>. Zlecenie <code>JJ</code> połączy bieżący wiersz z następnym. Jeżeli w zleceniu opisany jest obszar obejmujący więcej niż jeden wiersz, to połączone zostaną wszystkie wskazane wiersze. Należy zwrócić tu uwagę, że zlecenia w postaci <code>J</code>, <code>:1J</code>, <code>:2J,+1J</code> są równoważne sobie i powodują połączenie bieżącego wiersza z następnym (zlecenia inne działające na wielu wierszach np <code>D:</code>, <code>1D</code>, <code>:2D,+1D</code> nie są sobie równoważne, gdyż dwa pierwsze dotyczą wiersza bieżącego, a pozostałe wiersza bieżącego i następnego).


Wierszem bieżącym po wykonaniu instrukcji jest nowo utworzony wiersz. Zlecenie <code>J</code> może być uzupełnione dodatkowymi parametrami oznaczającymi, że z wierszy dołączanych będą usuwane wszystkie spacje i znaki tabulacji rozpoczynające te wiersze: <code>J^</code> oraz, że przed każdym dołączonym wierszem zostanie wstawiony wskazany łańcuch: <code>J/<łańcuch></code>. Oba parametry można użyć razem: <code>J^/*</code>. Powyższy przykład oznacza usunięcie z dołączanego wiersza prowadzących spacji i znaków tabulacji oraz wstawienie między połączone wiersze znaku '''*'''.
Wierszem bieżącym po wykonaniu instrukcji jest nowo utworzony wiersz. Zlecenie <code>J</code> może być uzupełnione dodatkowymi parametrami oznaczającymi, że z wierszy dołączanych będą usuwane wszystkie spacje i znaki tabulacji rozpoczynające te wiersze: <code>J^</code> oraz, że przed każdym dołączonym wierszem zostanie wstawiony wskazany łańcuch: <code>J/<łańcuch></code>. Oba parametry można użyć razem: <code>J^/*</code>. Powyższy przykład oznacza usunięcie z dołączanego wiersza prowadzących spacji i znaków tabulacji oraz wstawienie między połączone wiersze znaku '''*'''.
Linia 196: Linia 210:
* <code>CI</code> - skopiowanie obszaru przed wskazany wiersz
* <code>CI</code> - skopiowanie obszaru przed wskazany wiersz


Po wykonaniu zlecenia wierszem bieżącym staje się ostatni przeniesiony lub skopiowany wiersz (instrukcje <code>MA</code>, <code>CA</code>) lub wiersz wskazany po prawej stronie zlecenia (przy instrukcjach <code>CI</code>, <code>MI</code>). Obszar bufora roboczego może być kopiowany lub przenoszony także między buforem roboczym a buforami pomocniczymi znajdującymi się poza poprawianym buforem. Jest 26 buforów nazwanych pojedynczymi literami A..Z oraz jeden specjalny bufor pomocniczy bez nazwy. Przenoszenie wierszy do buforów pomocniczych jest wykonywane zleceniem <code>D</code>. Zlecenie to wykonane w postaci podanej wcześniej w opisie usunie wskazane wiersze z bufora roboczego i przeniesie je do specjalnego bufora pomocniczego. Podanie zlecenia <code>D</code> z parametrem np: <code>D</code> <code>B</code> przeniesie wskazane wiersze (tu tylko wiersz bieżący) do wskazanego bufora. Kopiowanie wierszy do buforów pomocniczych jest wykonywane zleceniem <code>Y</code>. I tu można podać nazwę bufora, do którego mają być skopiowane wskazane wiersze. Gdy nazwa bufora nie zostanie podana, buforem tym będzie specjalny bufor pomocniczy. Kopiowanie zawartości buforów pomocniczych do bufora roboczego jest wykonywane zleceniami <code>PA</code> i <code>PI</code>. Kopiują one zawartość wskazanego bufora odpowiednio za (<code>PA</code>) lub przed (<code>PI</code>) wierszem bieżącym. Jeżeli nazwa bufora nie zostanie podana, kopiowany będzie specjalny bufor pomocniczy. Zlecenia: <code>20:5 Y A</code> <code>30 PA A</code> są równoważne zleceniu <code>20:5 CA 30</code> z tą jednak różnicą, że w buforze <code>A</code> są zachowane wiersze 20-24 i można je skopiować jeszcze raz (lub dowolnie wiele razy) w inne miejsce bufora roboczego. Bezparametrowe zlecenie " wyświetla na monitorze informacje o zawartości buforów w postaci:
Po wykonaniu zlecenia wierszem bieżącym staje się ostatni przeniesiony lub skopiowany wiersz (instrukcje <code>MA</code>, <code>CA</code>) lub wiersz wskazany po prawej stronie zlecenia (przy instrukcjach <code>CI</code>, <code>MI</code>). Obszar bufora roboczego może być kopiowany lub przenoszony także między buforem roboczym a buforami pomocniczymi znajdującymi się poza poprawianym buforem. Jest 26 buforów nazwanych pojedynczymi literami A..Z oraz jeden specjalny bufor pomocniczy bez nazwy. Przenoszenie wierszy do buforów pomocniczych jest wykonywane zleceniem <code>D</code>. Zlecenie to wykonane w postaci podanej wcześniej w opisie usunie wskazane wiersze z bufora roboczego i przeniesie je do specjalnego bufora pomocniczego. Podanie zlecenia <code>D</code> z parametrem np: <code>D</code> <code>B</code> przeniesie wskazane wiersze (tu tylko wiersz bieżący) do wskazanego bufora. Kopiowanie wierszy do buforów pomocniczych jest wykonywane zleceniem <code>Y</code>. I tu można podać nazwę bufora, do którego mają być skopiowane wskazane wiersze. Gdy nazwa bufora nie zostanie podana, buforem tym będzie specjalny bufor pomocniczy. Kopiowanie zawartości buforów pomocniczych do bufora roboczego jest wykonywane zleceniami <code>PA</code> i <code>PI</code>. Kopiują one zawartość wskazanego bufora odpowiednio za (<code>PA</code>) lub przed (<code>PI</code>) wierszem bieżącym. Jeżeli nazwa bufora nie zostanie podana, kopiowany będzie specjalny bufor pomocniczy. Zlecenia: <code>20:5 Y A</code> <code>30 PA A</code> są równoważne zleceniu <code>20:5 CA 30</code> z tą jednak różnicą, że w buforze <code>A</code> są zachowane wiersze 20-24 i można je skopiować jeszcze raz (lub dowolnie wiele razy) w inne miejsce bufora roboczego. Bezparametrowe zlecenie <code>"</code> wyświetla na monitorze informacje o zawartości buforów w postaci:


  <nazwa_bufora> <liczba_wierszy_w_buforze>
  <nazwa_bufora> <liczba_wierszy_w_buforze>
Linia 204: Linia 218:
== Wyprowadzanie bufora roboczego do zbioru ==
== Wyprowadzanie bufora roboczego do zbioru ==


Do wyprowadzania aktualnie poprawianego bufora służy opisane już wcześniej zlecenie <code>W <tytuł_zbioru></code>. Zlecenie w powyższej postaci wyprowadza do wskazanego zbioru cały bufor roboczy. W poprzedzone opisem obszaru wyprowadza do zbioru tylko wskazane wiersze. Zlecenie <code>10,20 W ROB</code> wyprowadzi do zbioru '''ROB''' tylko wiersze od 10 do 20 włącznie. Wyprowadzane wiersze będą dołączane do istniejącego zbioru, jeżeli tytuł zbioru zostanie poprzedzona znakiem '''>''': <code>W >ROB</code>. Brak opisu obszaru w zleceniu W nie oznacza, jak dla innych zleceń wiersza bieżącego ale cały zbiór. Wiersz bieżący (i tylko ten jeden wiersz) można wskazać znakiem kropki. Zlecenie <code>.W >ROB</code> dołączy do zbioru ROB tylko wiersz bieżący. Nie podanie nazwy zbioru w zleceniu W oznacza wyprowadzenie wskazanych wierszy do tego samego zbioru, który został uprzednio wczytany do bufora roboczego (tytuł zbioru wczytanego do bufora jest parametrem domyślnym zlecenia W). Wyprowadzenie wierszy do innego zbioru można uzyskać podając nazwę zbioru w zleceniu W (tak jak pokazano wcześniej) lub zmieniając parametr domyślny tego zlecenia instrukcją <code>F <tytuł_zbioru></code>. Zlecenie <code>F</code> bez podanej nazwy zbioru wyprowadza informacje o poprawianym buforze roboczym w postaci:
Do wyprowadzania aktualnie poprawianego bufora służy opisane już wcześniej zlecenie <code>W <tytuł_zbioru></code>. Zlecenie w powyższej postaci wyprowadza do wskazanego zbioru cały bufor roboczy. W poprzedzone opisem obszaru wyprowadza do zbioru tylko wskazane wiersze. Zlecenie <code>10,20 W ROB</code> wyprowadzi do zbioru '''ROB''' tylko wiersze od 10 do 20 włącznie. Wyprowadzane wiersze będą dołączane do istniejącego zbioru, jeżeli tytuł zbioru zostanie poprzedzona znakiem <code>></code>: <code>W >ROB</code>. Brak opisu obszaru w zleceniu W nie oznacza, jak dla innych zleceń wiersza bieżącego ale cały zbiór. Wiersz bieżący (i tylko ten jeden wiersz) można wskazać znakiem kropki. Zlecenie <code>.W >ROB</code> dołączy do zbioru ROB tylko wiersz bieżący. Nie podanie nazwy zbioru w zleceniu W oznacza wyprowadzenie wskazanych wierszy do tego samego zbioru, który został uprzednio wczytany do bufora roboczego (tytuł zbioru wczytanego do bufora jest parametrem domyślnym zlecenia W). Wyprowadzenie wierszy do innego zbioru można uzyskać podając nazwę zbioru w zleceniu W (tak jak pokazano wcześniej) lub zmieniając parametr domyślny tego zlecenia instrukcją <code>F <tytuł_zbioru></code>. Zlecenie <code>F</code> bez podanej nazwy zbioru wyprowadza informacje o poprawianym buforze roboczym w postaci:


  E: <numer_bufora> <tytuł_zbioru> <liczba_wierszy>
  E: <numer_bufora> <tytuł_zbioru> <liczba_wierszy>
Linia 249: Linia 263:
Pierwsza z opcji pokazanych w przykładzie - 'wrapscan' (ustawiana WS/gaszona NWS) jest istotna przy wykonywaniu operacji szukania wiersza według wzorca: gdy wskazany wzorzec nie zostanie znaleziony do końca (lub początku - przy szukaniu do tyłu) bufora roboczego, przeszukany będzie jeszcze obszar od początku (lub końca) bufora roboczego do wiersza bieżącego. Gdy opcja 'wrapscan' jest zgaszona, nie znalezienie wzorca do końca (lub początku - przy przeszukiwaniu do tyłu) bufora roboczego kończy szukanie.
Pierwsza z opcji pokazanych w przykładzie - 'wrapscan' (ustawiana WS/gaszona NWS) jest istotna przy wykonywaniu operacji szukania wiersza według wzorca: gdy wskazany wzorzec nie zostanie znaleziony do końca (lub początku - przy szukaniu do tyłu) bufora roboczego, przeszukany będzie jeszcze obszar od początku (lub końca) bufora roboczego do wiersza bieżącego. Gdy opcja 'wrapscan' jest zgaszona, nie znalezienie wzorca do końca (lub początku - przy przeszukiwaniu do tyłu) bufora roboczego kończy szukanie.


Dużą grupę opcji stanowią opcje listowania. Opcja 'autoprint' (AP/NAP) oznacza wyświetlanie bieżącego wiersza po wykonaniu każdego zlecenia. Gdy opcja 'autoprint' jest zgaszona, wiersze są wyświetlane tylko zleceniami zawierającymi instrukcje <code>P</code>, <code>L</code> lub <code>#</code>. Instrukcje <code>P</code> i <code>L</code> różnią się sposobem wyprowadzania znaków kontrolnych (o kodach 1 do 26) . Instrukcja <code>P</code> zamienia je na spacje, <code>L</code> - wyprowadza za pomocą dwóch znaków: ''^<litera>''. Przy ustawionej opcji 'autoprint' sposób wyświetlania znaków kontrolnych ustala opcja 'listcontrol' (LC/NLC). Gdy jest zapalona, znaki kontrolne są wyprowadzane tak jak instrukcją <code>L</code>, w przeciwnym razie - tak jak instrukcją <code>P</code>. Ostatnia opcja listowania: 'number' (NU/NNU) oznacza listowanie wierszy z numeracją w buforze. Każdy wyprowadzany wiersz jest poprzedzany numerem zajmującym pole 5 znaków (lewostronnie uzupełnionym spacjami) i jedną spacją separującą numer od zawartości wiersza. Gdy opcja jest zgaszona (NNU), wiersze są wyprowadzane bez numeracji.
Dużą grupę opcji stanowią opcje listowania. Opcja 'autoprint' (AP/NAP) oznacza wyświetlanie bieżącego wiersza po wykonaniu każdego zlecenia. Gdy opcja 'autoprint' jest zgaszona, wiersze są wyświetlane tylko zleceniami zawierającymi instrukcje <code>P</code>, <code>L</code> lub <code>#</code>. Instrukcje <code>P</code> i <code>L</code> różnią się sposobem wyprowadzania znaków kontrolnych (o kodach 1 do 26). Instrukcja <code>P</code> zamienia je na spacje, <code>L</code> - wyprowadza za pomocą dwóch znaków: ''^<litera>''. Przy ustawionej opcji 'autoprint' sposób wyświetlania znaków kontrolnych ustala opcja 'listcontrol' (LC/NLC). Gdy jest zapalona, znaki kontrolne są wyprowadzane tak jak instrukcją <code>L</code>, w przeciwnym razie - tak jak instrukcją <code>P</code>. Ostatnia opcja listowania: 'number' (NU/NNU) oznacza listowanie wierszy z numeracją w buforze. Każdy wyprowadzany wiersz jest poprzedzany numerem zajmującym pole 5 znaków (lewostronnie uzupełnionym spacjami) i jedną spacją separującą numer od zawartości wiersza. Gdy opcja jest zgaszona (NNU), wiersze są wyprowadzane bez numeracji.


Kolejna opcja: 'clear' (CL/NCL) dotyczy wierszy wprowadzanych do obszaru roboczego (zleceniami <code>RA</code>, <code>RI</code>, <code>I</code>, <code>A</code>, <code>C</code>, <code>S</code>). Gdy jest ustawiona, ze wszystkich wprowadzanych wierszy są usuwane wszystkie znaki kontrolne oprócz lf(012) ht (011) i ff (014). Znaki kontrolne z wiersza bieżącego (lub ze wskazanych wierszy) można usunąć instrukcją <code>CL</code> działającą niezależnie od opcji 'clear'. Drugą opcją dotyczącą wierszy wprowadzanych (działa na te same wiersze co opcja 'clear') jest opcja 'lowtoupper' (LU/NLU). Gdy jest ustawiona, wszystkie małe litery są zamieniane na duże. Litery małe na duże można zamienić w wierszu bieżącym lub we wskazanych wierszach zleceniem <code>LU</code> działającym niezależnie od opcji 'lowtoupper'.
Kolejna opcja: 'clear' (CL/NCL) dotyczy wierszy wprowadzanych do obszaru roboczego (zleceniami <code>RA</code>, <code>RI</code>, <code>I</code>, <code>A</code>, <code>C</code>, <code>S</code>). Gdy jest ustawiona, ze wszystkich wprowadzanych wierszy są usuwane wszystkie znaki kontrolne oprócz lf(012) ht (011) i ff (014). Znaki kontrolne z wiersza bieżącego (lub ze wskazanych wierszy) można usunąć instrukcją <code>CL</code> działającą niezależnie od opcji 'clear'. Drugą opcją dotyczącą wierszy wprowadzanych (działa na te same wiersze co opcja 'clear') jest opcja 'lowtoupper' (LU/NLU). Gdy jest ustawiona, wszystkie małe litery są zamieniane na duże. Litery małe na duże można zamienić w wierszu bieżącym lub we wskazanych wierszach zleceniem <code>LU</code> działającym niezależnie od opcji 'lowtoupper'.


Dwie dalsze opcje: 'lenghtline'(LEN/NLE) i 'linenumber' (LIN/NLI) formatują listowane obszary bufora na ekranie monitora. Zapalona opcja 'lenghtline' oznacza,że wyprowadzane wiersze mają być dzielone na linie o co najwyżej ustalonej długości. Opcja 'linenumber' steruje wydrukiem większych obszarów. Jeżeli jest zapalona, to po zapełnieniu ekranu wydruk jest zatrzymywany. Wznowienie wydruku następuje po wprowadzeniu cr. Wprowadzenie '''dc4''' kończy wydruk - wierszem bieżącym jest ostatni wyprowadzony wiersz. Opcje 'linenumber' i 'lenghtline' działają także przy wykonywaniu zlecenia <code>S</code>, gdy zmieniane wiersze są wyświetlane na ekranie. Po zapełnieniu ekranu wykonywanie zlecenia jest zatrzymywane. wprowadzenie '''cr''' wznawia wykonanie, zaś '''dc4''' kończy wykonanie zlecenia( pozostałe wiersze nie są analizowane). Obu opcjom można nadawać dowolne wartości. Ustawienie: <code>SET LEN=40 LIN=18</code> oznacza skrócenie wyprowadzanych linii do 40 znaków (dłuższe wiersze są dzielone na linie o tej długości) i zatrzymywanie listingu po wyprowadzeniu 18 wierszy. Jeżeli opcje te zostaną zgaszone: <code>SET NLE NLI</code>, to ponowne ich ustawienie: <code>SET LEN LIN</code> przywróci opcjom wartości jakie miały przed zgaszeniem. Po wywołaniu edytora stan powyższych opcji jest taki jak po wykonaniu zlecenia: <code>SET NWS AP NU LC NCL NLU LIN=22 LEN=80</code>
Dwie dalsze opcje: 'lenghtline'(LEN/NLE) i 'linenumber' (LIN/NLI) formatują listowane obszary bufora na ekranie monitora. Zapalona opcja 'lenghtline' oznacza,że wyprowadzane wiersze mają być dzielone na linie o co najwyżej ustalonej długości. Opcja 'linenumber' steruje wydrukiem większych obszarów. Jeżeli jest zapalona, to po zapełnieniu ekranu wydruk jest zatrzymywany. Wznowienie wydruku następuje po wprowadzeniu '''cr'''. Wprowadzenie '''dc4''' kończy wydruk - wierszem bieżącym jest ostatni wyprowadzony wiersz. Opcje 'linenumber' i 'lenghtline' działają także przy wykonywaniu zlecenia <code>S</code>, gdy zmieniane wiersze są wyświetlane na ekranie. Po zapełnieniu ekranu wykonywanie zlecenia jest zatrzymywane. wprowadzenie '''cr''' wznawia wykonanie, zaś '''dc4''' kończy wykonanie zlecenia( pozostałe wiersze nie są analizowane). Obu opcjom można nadawać dowolne wartości. Ustawienie: <code>SET LEN=40 LIN=18</code> oznacza skrócenie wyprowadzanych linii do 40 znaków (dłuższe wiersze są dzielone na linie o tej długości) i zatrzymywanie listingu po wyprowadzeniu 18 wierszy. Jeżeli opcje te zostaną zgaszone: <code>SET NLE NLI</code>, to ponowne ich ustawienie: <code>SET LEN LIN</code> przywróci opcjom wartości jakie miały przed zgaszeniem. Po wywołaniu edytora stan powyższych opcji jest taki jak po wykonaniu zlecenia: <code>SET NWS AP NU LC NCL NLU LIN=22 LEN=80</code>


= Opis ścisły =
= Opis ścisły =
Linia 261: Linia 275:
Druga część zawiera ścisły opis edytora. Zapis w tej części jest częściowo sformalizowany. Używane są następujące elementy:
Druga część zawiera ścisły opis edytora. Zapis w tej części jest częściowo sformalizowany. Używane są następujące elementy:


* '''<...>''' metasymbole
* '''<...>''' - metasymbole
* '''::=''' definicja
* '''::=''' - definicja
* '''[...]''' opcja
* '''[...]''' - opcja
* '''{...}''' iteracja (może być pusta)
* '''{...}''' - iteracja (może być pusta)
* '''..._...''' alternatywa
* '''..._...''' - alternatywa


Znaki wytłuszczone oznaczają siebie. Bez definicji są podane metasymbole:
Znaki wytłuszczone oznaczają siebie. Bez definicji są podane metasymbole:


* '''<litera>''' znaki A..Z lub a..z
* '''<litera>''' - znaki A..Z lub a..z
* '''<liczba>''' liczba całkowita dziesiętna bez znaku
* '''<liczba>''' - liczba całkowita dziesiętna bez znaku
* '''<tytuł_zbioru>''' nazwa o składni takiej samej jak tytuł zbioru w OSL-u.
* '''<tytuł_zbioru>''' - nazwa o składni takiej samej jak tytuł zbioru w OSL-u.
* '''<łańcuch>''' ciąg dowolnych znaków oprócz '''cr''' i '''dc4''' (może być pusty)
* '''<łańcuch>''' - ciąg dowolnych znaków oprócz '''cr''' i '''dc4''' (może być pusty)


Są używane także symbole oznaczające niektóre znaki kontrolne:
Są używane także symbole oznaczające niektóre znaki kontrolne:
Linia 287: Linia 301:
Składnia: <code>EXM [ <tytuł_zbioru> [ , <tytuł_zbioru_zleceń> ]]</code>
Składnia: <code>EXM [ <tytuł_zbioru> [ , <tytuł_zbioru_zleceń> ]]</code>


'''<tytuł_zbioru>''' - tytuł poprawianego zbioru.
<code><tytuł_zbioru></code> - tytuł poprawianego zbioru.


Jeżeli wskazany zbiór istnieje, jest wczytywany do bufora roboczego. Bufor otrzymuje numer 0 i nazwę zgodną z tytułem wczytanego zbioru. Na monitor jest wyprowadzany komunikat:
Jeżeli wskazany zbiór istnieje, jest wczytywany do bufora roboczego. Bufor otrzymuje numer 0 i nazwę zgodną z tytułem wczytanego zbioru. Na monitor jest wyprowadzany komunikat:
Linia 299: Linia 313:
  *** NEW FILE ***
  *** NEW FILE ***


i edytor przechodzi do wczytywania wierszy z końcówki - wykonywane jest niejawne zlecenie A (II.5.2). Po wpisaniu wiersza zawierającego dc4 edytor kończy wprowadzanie i rozpoczyna edycję bufora. Wprowadzenie pustego zbioru (dc4 w pierwszym wierszu) powoduje usunięcie edytora z komunikatem:
i edytor przechodzi do wczytywania wierszy z końcówki - wykonywane jest niejawne zlecenie <code>A</code>. Po wpisaniu wiersza zawierającego '''dc4''' edytor kończy wprowadzanie i rozpoczyna edycję bufora. Wprowadzenie pustego zbioru ('''dc4''' w pierwszym wierszu) powoduje usunięcie edytora z komunikatem:


  EMPTY FILE
  EMPTY FILE
Linia 309: Linia 323:
Jeżeli nie jest podany tytuł zbioru, a istnieją zbiory EXMLIN i EXMOPI zawierające bufory robocze poprawiane w poprzedniej sesji edytora, EXM odtwarza ostatni zapamiętany stan edycji i wznawia poprawianie. Poprawiany bufor roboczy, wskaźnik dostępu, znaczniki wierszy, definicje zmiennych generacyjnych i opcje edycji są takie same jakie zostały zapamiętane w ostatniej edycji.
Jeżeli nie jest podany tytuł zbioru, a istnieją zbiory EXMLIN i EXMOPI zawierające bufory robocze poprawiane w poprzedniej sesji edytora, EXM odtwarza ostatni zapamiętany stan edycji i wznawia poprawianie. Poprawiany bufor roboczy, wskaźnik dostępu, znaczniki wierszy, definicje zmiennych generacyjnych i opcje edycji są takie same jakie zostały zapamiętane w ostatniej edycji.


'''<tytuł_zbioru_zleceń>'''
<code><tytuł_zbioru_zleceń></code>


Jeżeli tytuł zbioru zleceń jest podany, to po wczytaniu poprawianego zbioru do bufora roboczego będą wykonane zlecenia zapisane we wskazanym zbiorze. Po wykonaniu wszystkich zleceń ze zbioru zleceń lub po wykryciu błędnego zlecenia edytor przechodzi do pracy w trybie konwersacyjnym. Jeżeli wykonywanie zleceń zostało przerwane po wykryciu błędnego zlecenia, wykonanie pozostałych zleceń ze zbioru można wznowić zleceniem INT.
Jeżeli tytuł zbioru zleceń jest podany, to po wczytaniu poprawianego zbioru do bufora roboczego będą wykonane zlecenia zapisane we wskazanym zbiorze. Po wykonaniu wszystkich zleceń ze zbioru zleceń lub po wykryciu błędnego zlecenia edytor przechodzi do pracy w trybie konwersacyjnym. Jeżeli wykonywanie zleceń zostało przerwane po wykryciu błędnego zlecenia, wykonanie pozostałych zleceń ze zbioru można wznowić zleceniem INT.
Linia 321: Linia 335:
  NO WRITE AFTER LAST CHANGE : <zlecenie> ( ! OR CR) ?
  NO WRITE AFTER LAST CHANGE : <zlecenie> ( ! OR CR) ?


Po znaku zapytania należy wprowadzić znak ! - zlecenie zostanie wykonane, lub '''cr''' (return) - zlecenie nie będzie wykonane. Przed usunięciem stan edycji jest zapamiętywany w zbiorach roboczych EXMLIN i EXMOPI. Zachowywane są następujące elementy:
Po znaku zapytania należy wprowadzić znak '''!''' - zlecenie zostanie wykonane, lub '''cr''' (return) - zlecenie nie będzie wykonane. Przed usunięciem stan edycji jest zapamiętywany w zbiorach roboczych EXMLIN i EXMOPI. Zachowywane są następujące elementy:


* bufory robocze
* bufory robocze
Linia 347: Linia 361:
Składnia: <code>=<litera><łańcuch></code>
Składnia: <code>=<litera><łańcuch></code>


Działanie: zmiennej generacyjnej nazwanej pojedyncza literą (są 52 zmienne o nazwach A..Z i a..z) jest nadawana wartość: podany łańcuch. Pusty łańcuch usuwa dotychczasową definicję. Zmienne generacyjne mogą być użyte w dowolnym miejscu tekstu wprowadzanego z klawiatury. Znaki: ''\<litera>'' występujące w tekście i oznaczające zmienną generacyjną są zamieniane na łańcuch zdefiniowany zleceniem <code>=</code> (wstawiany tekst nie podlega makrorozwinięciu). Jeżeli wskazana zmienna generacyjna nie jest zdefiniowana, jej oznaczenie pozostaje w tekście bez zmian. Wartości zmiennych generacyjnych są listowane zleceniem <code>\</code>. Poza wymienionymi wyżej zmiennymi mogą być używane zmienne <code>-</code> i <code>=</code> określające znaczniki końca strony. Wiersz zawierający wyłącznie łańcuch zdefiniowany przez jedną z tych zmiennych kończy stronę. Z tym, że jeżeli łańcuch ten jest zdefiniowany zmienną <code>=</code> i kończona strona ma numer nieparzysty, to następna strona ma numer będący kolejną liczbą nieparzystą. Po wywołaniu edytora zmienna <code>-</code> ma wartość: '''ff''' (znacznik końca strony przyjmowany przez programy listujące DLIST i LIST), natomiast zmienna <code>=</code> jest niezdefiniowana. Zmienne <code>-</code> i <code>=</code> mogą być przedefiniowane tak jak inne zmienne, ale definicje te muszą być zawarte w zbiorze EXMINI. W tekstach wprowadzanych z klawiatury znaki \- i \= są rozwijane tak jak inne zmienne generacyjne, ale tylko wtedy, gdy opcja 'number' ma wartość PNU.
Działanie: zmiennej generacyjnej nazwanej pojedyncza literą (są 52 zmienne o nazwach A..Z i a..z) jest nadawana wartość: podany łańcuch. Pusty łańcuch usuwa dotychczasową definicję. Zmienne generacyjne mogą być użyte w dowolnym miejscu tekstu wprowadzanego z klawiatury. Znaki: '''\<litera>''' występujące w tekście i oznaczające zmienną generacyjną są zamieniane na łańcuch zdefiniowany zleceniem <code>=</code> (wstawiany tekst nie podlega makrorozwinięciu). Jeżeli wskazana zmienna generacyjna nie jest zdefiniowana, jej oznaczenie pozostaje w tekście bez zmian. Wartości zmiennych generacyjnych są listowane zleceniem <code>\</code>. Poza wymienionymi wyżej zmiennymi mogą być używane zmienne <code>-</code> i <code>=</code> określające znaczniki końca strony. Wiersz zawierający wyłącznie łańcuch zdefiniowany przez jedną z tych zmiennych kończy stronę. Z tym, że jeżeli łańcuch ten jest zdefiniowany zmienną <code>=</code> i kończona strona ma numer nieparzysty, to następna strona ma numer będący kolejną liczbą nieparzystą. Po wywołaniu edytora zmienna <code>-</code> ma wartość: '''ff''' (znacznik końca strony przyjmowany przez programy listujące DLIST i LIST), natomiast zmienna <code>=</code> jest niezdefiniowana. Zmienne <code>-</code> i <code>=</code> mogą być przedefiniowane tak jak inne zmienne, ale definicje te muszą być zawarte w zbiorze EXMINI. W tekstach wprowadzanych z klawiatury znaki '''-''' i '''=''' są rozwijane tak jak inne zmienne generacyjne, ale tylko wtedy, gdy opcja 'number' ma wartość PNU.


=== Opcje edycji ===
=== Opcje edycji ===
Linia 382: Linia 396:
Treść tekstów (zleceń, wierszy) wprowadzanych z klawiatury jest modyfikowana w sposób zależny od ustawienia opcji 'octalcod', 'clear' i 'lowtoupper'. Ustawienie opcji 'octalcod' umożliwia wprowadzenie do zlecenia lub wiersza znaku o dowolnym kodzie 0-0177:
Treść tekstów (zleceń, wierszy) wprowadzanych z klawiatury jest modyfikowana w sposób zależny od ustawienia opcji 'octalcod', 'clear' i 'lowtoupper'. Ustawienie opcji 'octalcod' umożliwia wprowadzenie do zlecenia lub wiersza znaku o dowolnym kodzie 0-0177:


* OC - ciąg znaków: ''\0<liczba>'' występujący w tekście wprowadzanym z klawiatury jest zamieniany na bajt o kodzie oktalnym wskazanym przez liczbę.
* OC - ciąg znaków: '''\0<liczba>''' występujący w tekście wprowadzanym z klawiatury jest zamieniany na bajt o kodzie oktalnym wskazanym przez liczbę.
* NOC - kody oktalne nie są przyjmowane - oznaczają ciąg znaków.
* NOC - kody oktalne nie są przyjmowane - oznaczają ciąg znaków.


Linia 424: Linia 438:
Wprowadzenie zlecenia pustego - tylko znaku '''cr''' (RETURN) przesuwa wskaźnik dostępu na następny wiersz w buforze. Wiersz ten jest wyprowadzany w zależności od ustawienia opcji 'step':
Wprowadzenie zlecenia pustego - tylko znaku '''cr''' (RETURN) przesuwa wskaźnik dostępu na następny wiersz w buforze. Wiersz ten jest wyprowadzany w zależności od ustawienia opcji 'step':


ST - w następnej linii monitora (zalecane dla monitorów, w których znak '''cr''' nie powoduje przesunięcia kursora na początek linii ekranu)
* ST - w następnej linii monitora (zalecane dla monitorów, w których znak '''cr''' nie powoduje przesunięcia kursora na początek linii ekranu)
NST - w tej samej linii, w której zostało wprowadzone zlecenie (zalecane dla monitorów, w których '''cr''' przesuwa kursor na początek linii ekranu)
* NST - w tej samej linii, w której zostało wprowadzone zlecenie (zalecane dla monitorów, w których '''cr''' przesuwa kursor na początek linii ekranu)


Po wywołaniu edytora opcja 'step' jest zgaszona (NST).
Po wywołaniu edytora opcja 'step' jest zgaszona (NST).
Linia 465: Linia 479:
  <fragment> ::= { <ciąg> _ <ogranicznik> _ <symbol_łańcucha> }
  <fragment> ::= { <ciąg> _ <ogranicznik> _ <symbol_łańcucha> }
  <ciąg> ::= <element> [<krotność>]
  <ciąg> ::= <element> [<krotność>]
<element> - wskazuje znak w szukanym łańcuchu :
* <element> - wskazuje znak w szukanym łańcuchu:
<znak> - wskazany znak
** <znak> - wskazany znak:
 
** <code>.</code> - dowolny znak
* <code>.</code> - dowolny znak
** <code>[<zbiór_znaków>]</code> - znak należący do podanego zbioru znaków
* <code>[<zbiór_znaków>]</code> - znak należący do podanego zbioru znaków
** <code>[^<zbiór_znaków>]</code> - znak nie należący do podanego zbioru znaków
* <code>[^<zbiór_znaków>]</code> - znak nie należący do podanego zbioru znaków


  <zbiór_znaków> ::= {<znak>-<znak> _ <znak> }
  <zbiór_znaków> ::= {<znak>-<znak> _ <znak> }
Linia 481: Linia 494:
Przykładowo opis: <code>[^-a-d-Z-]]</code> oznacza dopełnienie (<code>^</code> na pierwszej pozycji) zbioru składającego się z podzbiorów: -, a-d, -, Z-] (pierwszy i trzeci znak '''-''' nie separujące pary znaków - analiza przebiega od lewej strony - oznaczają siebie; podobnie pierwszy znak ''']''' będący drugim znakiem w parze znaków, nie oznacza końca opisu zbioru). Przy zgaszonej opcji 'magic' znak '''\''' musi poprzedzać tylko nawias otwierający opis zbioru: <code>\[^-a-d-Z-]]</code>
Przykładowo opis: <code>[^-a-d-Z-]]</code> oznacza dopełnienie (<code>^</code> na pierwszej pozycji) zbioru składającego się z podzbiorów: -, a-d, -, Z-] (pierwszy i trzeci znak '''-''' nie separujące pary znaków - analiza przebiega od lewej strony - oznaczają siebie; podobnie pierwszy znak ''']''' będący drugim znakiem w parze znaków, nie oznacza końca opisu zbioru). Przy zgaszonej opcji 'magic' znak '''\''' musi poprzedzać tylko nawias otwierający opis zbioru: <code>\[^-a-d-Z-]]</code>


<krotność> : - określa liczbę elementów ciągu
* <krotność> : - określa liczbę elementów ciągu
{<liczba>} - wskazana liczba
* {<liczba>} - wskazana liczba


<code>{[<liczba>],[<liczba>]}</code> - liczba zawarta w podanym zakresie. Pominięcie pierwszego parametru oznacza 0 - ciąg pusty; pominięcie drugiego - ciąg dowolnie długi: do 255 znaków. Jeżeli pierwszy parametr ma mniejszą wartość niż drugi, to znajdowany jest najkrótszy łańcuch zgodny z tym wzorcem. Gdy drugi parametr jest mniejszy od pierwszego, szukany jest najdłuższy łańcuch  zgodny z tym wzorcem.
<code>{[<liczba>],[<liczba>]}</code> - liczba zawarta w podanym zakresie. Pominięcie pierwszego parametru oznacza 0 - ciąg pusty; pominięcie drugiego - ciąg dowolnie długi: do 255 znaków. Jeżeli pierwszy parametr ma mniejszą wartość niż drugi, to znajdowany jest najkrótszy łańcuch zgodny z tym wzorcem. Gdy drugi parametr jest mniejszy od pierwszego, szukany jest najdłuższy łańcuch  zgodny z tym wzorcem.
Linia 496: Linia 509:
<ogranicznik> - opisuje znaki leżące obok:
<ogranicznik> - opisuje znaki leżące obok:


* \( - znak następny ma rozpoczynać nazwę
* ( - znak następny ma rozpoczynać nazwę
* \) - znak poprzedni ma kończyć nazwę
* ) - znak poprzedni ma kończyć nazwę
* < - znak następny ma rozpoczynać słowo
* < - znak następny ma rozpoczynać słowo
* > - znak poprzedni ma kończyć słowo
* > - znak poprzedni ma kończyć słowo
Linia 534: Linia 547:
* $ - ostatni wiersz bieżącej strony (nie licząc wiersza zawierającego znacznik końca strony). Znak $ ma podane tu znaczenie tylko wtedy, gdy nie jest pierwszym elementem wyrażenia adresowego.
* $ - ostatni wiersz bieżącej strony (nie licząc wiersza zawierającego znacznik końca strony). Znak $ ma podane tu znaczenie tylko wtedy, gdy nie jest pierwszym elementem wyrażenia adresowego.
* > - pierwszy wiersz następnej strony
* > - pierwszy wiersz następnej strony
* ><liczba> - wykonanie operacji > wskazaną liczbę razy
* ><liczba> - wykonanie operacji <code>></code> wskazaną liczbę razy
* < - pierwszy wiersz poprzedniej strony
* < - pierwszy wiersz poprzedniej strony
* <<liczba> - wykonanie operacji < wskazaną liczbę razy
* <<liczba> - wykonanie operacji <code><</code> wskazaną liczbę razy


<opis_zawartości_wiersza>:
<opis_zawartości_wiersza>:
Linia 561: Linia 574:
<wyrażenie_adresowe> M <litera>
<wyrażenie_adresowe> M <litera>


Działanie: do wiersza wskazanego wyrażeniem adresowym jest przywiązywany znacznik o podanej nazwie. Znacznik traci swoje przywiązanie po przedefiniowaniu lub usunięciu wiersza z bufora roboczego (przeniesieniu do bufora pomocniczego). Definicje znaczników są wyprowadzane zleceniem ' w postaci:
Działanie: do wiersza wskazanego wyrażeniem adresowym jest przywiązywany znacznik o podanej nazwie. Znacznik traci swoje przywiązanie po przedefiniowaniu lub usunięciu wiersza z bufora roboczego (przeniesieniu do bufora pomocniczego). Definicje znaczników są wyprowadzane zleceniem <code>'</code> w postaci:


<nazwa_znacznika> <numer_wiersza> <zawartość_wiersza>
<nazwa_znacznika> <numer_wiersza> <zawartość_wiersza>
Linia 579: Linia 592:


* AP - wyświetlanie automatyczne
* AP - wyświetlanie automatyczne
* NAP - wyświetlanie tylko po wykonaniu zleceń zawierających instrukcje listowania (4.2)
* NAP - wyświetlanie tylko po wykonaniu zleceń zawierających instrukcje listowania


Jeżeli zlecenie nie zawiera instrukcji listującej określającej sposób wyprowadzania, postać wyprowadzanych wierszy jest zależna od opcji 'listcontrol':
Jeżeli zlecenie nie zawiera instrukcji listującej określającej sposób wyprowadzania, postać wyprowadzanych wierszy jest zależna od opcji 'listcontrol':
Linia 610: Linia 623:
Składnia zlecenia: <code><opis_obszaru><instrukcje_listujące></code>
Składnia zlecenia: <code><opis_obszaru><instrukcje_listujące></code>


działanie: wskazany obszar jest wyprowadzany na monitor w postaci określonej przez instrukcje listujące lub opcje listowania
Działanie: wskazany obszar jest wyprowadzany na monitor w postaci określonej przez instrukcje listujące lub opcje listowania


<instrukcje_listujące> ::= [L_P][#]
<instrukcje_listujące> ::= [L_P][#]


* P - wszystkie znaki nie wyświetlane (o kodach 0-037 i powyżej 0177) są zamieniane na spacje
* <code>P</code> - wszystkie znaki nie wyświetlane (o kodach 0-037 i powyżej 0177) są zamieniane na spacje
* L - znaki kontrolne (o kodach 1 - 26) są wyprowadzane za pomocą dwóch znaków: ^<litera> (dla monitorów 7910 i 7950 zamiast znaku ^ jest użyty znak funta). Inne znaki nie wyświetlane są wyprowadzane w postaci: \<liczba>, gdzie <liczba> jest 3 znakową liczbą oktalną równą wartości znaku.
* <code>L</code> - znaki kontrolne (o kodach 1 - 26) są wyprowadzane za pomocą dwóch znaków: ^<litera> (dla monitorów 7910 i 7950 zamiast znaku ^ jest użyty znak funta). Inne znaki nie wyświetlane są wyprowadzane w postaci: \<liczba>, gdzie <liczba> jest 3 znakową liczbą oktalną równą wartości znaku.
* # - wyprowadzane wiersze są poprzedzane numerami
* <code>#</code> - wyprowadzane wiersze są poprzedzane numerami


Gdy instrukcje listujące nie są podane, sposób wyprowadzania jest określony przez opcje listowania : 'autoprint', 'listcontrol' i 'number'(4.1).
Gdy instrukcje listujące nie są podane, sposób wyprowadzania jest określony przez opcje listowania : 'autoprint', 'listcontrol' i 'number'.


Wyprowadzanie obszarów większych niż jeden wiersz jest sterowane opcją 'linecount':
Wyprowadzanie obszarów większych niż jeden wiersz jest sterowane opcją 'linecount':
Linia 624: Linia 637:
* NLI - obszar jest wyprowadzany bez zatrzymania wydruków  
* NLI - obszar jest wyprowadzany bez zatrzymania wydruków  
* LIN - wydruk jest zatrzymywany po zapełnieniu całego ekranu. Wykonywanie zlecenia po wprowadzeniu:
* LIN - wydruk jest zatrzymywany po zapełnieniu całego ekranu. Wykonywanie zlecenia po wprowadzeniu:
** cr - jest wznawiane
** '''cr''' - jest wznawiane
**dc4 - jest kończone
** '''dc4''' - jest kończone
* LIN=<liczba> - ustawienie długości ekranu
* LIN=<liczba> - ustawienie długości ekranu


Linia 638: Linia 651:
=== Wyprowadzanie obszaru zleceniem Z ===
=== Wyprowadzanie obszaru zleceniem Z ===


Składnia zlecenia: <wyrażenie_adresowe><instrukcja_Z> [<liczba>] [#]
Składnia zlecenia: <code><wyrażenie_adresowe><instrukcja_Z> [<liczba>] [#]</code>


działanie: na monitor jest wyprowadzany obszar określony przez wyrażenie adresowe i instrukcję Z. Długość tego obszaru jest określona przez podaną liczbę lub, gdy nie jest ona podana, przez wartość opcji 'Zwindow' (standardowo - 7):
Działanie: na monitor jest wyprowadzany obszar określony przez wyrażenie adresowe i instrukcję Z. Długość tego obszaru jest określona przez podaną liczbę lub, gdy nie jest ona podana, przez wartość opcji 'Zwindow' (standardowo 7):


ZW=<liczba>
ZW=<liczba>


<instrukcja_Z>:
<instrukcja_Z>:
Linia 655: Linia 668:
<code>#</code> - listowanie z numeracją wierszy
<code>#</code> - listowanie z numeracją wierszy


Przy wykonaniu zlecenia Z działają opcje 'listcontrol', 'number', 'lenghtline'(4.1) i 'linecount'(4.2). Wierszem bieżącym po wykonaniu zlecenia jest wiersz wskazany przez wyrażenie adresowe.
Przy wykonaniu zlecenia Z działają opcje 'listcontrol', 'number', 'lenghtline' i 'linecount'. Wierszem bieżącym po wykonaniu zlecenia jest wiersz wskazany przez wyrażenie adresowe.


=== Wyprowadzanie wierszy instrukcją globalną ===
=== Wyprowadzanie wierszy instrukcją globalną ===
Linia 661: Linia 674:
Składnia zlecenia: <code>[<opis_obszaru>] G[^]/<wzorzec></code>
Składnia zlecenia: <code>[<opis_obszaru>] G[^]/<wzorzec></code>


Znaczenie: wszystkie wiersze wskazanego obszaru zgodne z podanym wzorcem (lub niezgodne - jeżeli jest podany parametr ^) będą wyprowadzone na monitor. Pusty wzorzec oznacza przyjęcie wzorca użytego w ostatnim zleceniu przeszukiwania bufora. Wskazany obszar musi zawierać więcej niż jeden wiersz. Jeżeli opis obszaru nie zostanie podany, przeszukany zostanie cały bufor. Przy wyprowadzaniu działają opcje 'listcontrol', 'number', 'lenghtline' i 'linecount'(4.2). Wierszem bieżącym po wykonaniu zlecenia jest ostatni wyprowadzony wiersz.
Znaczenie: wszystkie wiersze wskazanego obszaru zgodne z podanym wzorcem (lub niezgodne - jeżeli jest podany parametr ^) będą wyprowadzone na monitor. Pusty wzorzec oznacza przyjęcie wzorca użytego w ostatnim zleceniu przeszukiwania bufora. Wskazany obszar musi zawierać więcej niż jeden wiersz. Jeżeli opis obszaru nie zostanie podany, przeszukany zostanie cały bufor. Przy wyprowadzaniu działają opcje 'listcontrol', 'number', 'lenghtline' i 'linecount'. Wierszem bieżącym po wykonaniu zlecenia jest ostatni wyprowadzony wiersz.


== Usuwanie i wstawianie wierszy ==
== Usuwanie i wstawianie wierszy ==
Linia 669: Linia 682:
Składnia zlecenia: <code><opis_obszaru> D</code>
Składnia zlecenia: <code><opis_obszaru> D</code>


Działanie: wskazany obszar jest usuwany. Usunięte wiersze są przenoszone do specjalnego bufora pomocniczego (7.2). Niedozwolone jest usunięcie całego poprawianego bufora. Wierszem bieżącym po wykonaniu zlecenia jest pierwszy wiersz za usuniętymi; wyjątkowo po usunięciu ostatniego wiersza w buforze - wiersz poprzedzający wiersze usunięte. Zlecenie U wstawia usunięte wiersze z powrotem do bufora roboczego.
Działanie: wskazany obszar jest usuwany. Usunięte wiersze są przenoszone do specjalnego bufora pomocniczego. Niedozwolone jest usunięcie całego poprawianego bufora. Wierszem bieżącym po wykonaniu zlecenia jest pierwszy wiersz za usuniętymi; wyjątkowo po usunięciu ostatniego wiersza w buforze - wiersz poprzedzający wiersze usunięte. Zlecenie U wstawia usunięte wiersze z powrotem do bufora roboczego.


=== Wprowadzanie wierszy z klawiatury ===
=== Wprowadzanie wierszy z klawiatury ===
Linia 677: Linia 690:
Działanie: w miejsce wskazane wyrażeniem adresowym i instrukcją będą wprowadzane wiersze z klawiatury. Po wprowadzeniu zlecenia edytor zgłasza się w nowej linii (jeżeli opcja 'number' ma wartość NU lub PNU, wyświetlany jest numer wprowadzanego wiersza) i wczytuje kolejne wiersze. Jeżeli opcja 'autotab' ma wartość AT, każdy wprowadzany wiersz jest poprzedzany przez edytor ciągiem spacji o długości równej liczbie prowadzących spacji w wierszu wprowadzonym poprzednio (2.4). Podanie jako parametru znaku ! zmienia stan opcji 'autotab' na przeciwny (tylko na czas wykonania zlecenia). Wprowadzanie kończy wpisanie wiersza zawierającego tylko znacznik końca wprowadzania lub znacznik końca zbioru dc4. Znacznikiem końca wprowadzania jest znak podany za instrukcją. Może to być dowolny znak kodu ASCII poza !, cr, dc4, lf i spacją. Jeżeli znacznik końca wprowadzania nie jest podany, wprowadzanie kończy tylko dc4.
Działanie: w miejsce wskazane wyrażeniem adresowym i instrukcją będą wprowadzane wiersze z klawiatury. Po wprowadzeniu zlecenia edytor zgłasza się w nowej linii (jeżeli opcja 'number' ma wartość NU lub PNU, wyświetlany jest numer wprowadzanego wiersza) i wczytuje kolejne wiersze. Jeżeli opcja 'autotab' ma wartość AT, każdy wprowadzany wiersz jest poprzedzany przez edytor ciągiem spacji o długości równej liczbie prowadzących spacji w wierszu wprowadzonym poprzednio (2.4). Podanie jako parametru znaku ! zmienia stan opcji 'autotab' na przeciwny (tylko na czas wykonania zlecenia). Wprowadzanie kończy wpisanie wiersza zawierającego tylko znacznik końca wprowadzania lub znacznik końca zbioru dc4. Znacznikiem końca wprowadzania jest znak podany za instrukcją. Może to być dowolny znak kodu ASCII poza !, cr, dc4, lf i spacją. Jeżeli znacznik końca wprowadzania nie jest podany, wprowadzanie kończy tylko dc4.


Wprowadzane wiersze mogą mieć długość do 255 znaków. Zawartość wprowadzonych wierszy podlega makrorozwinięciu (2.2) i jest modyfikowana zgodnie z ustawieniem opcji 'octalcod', 'clear' i 'lowtoupper' (2.4).
Wprowadzane wiersze mogą mieć długość do 255 znaków. Zawartość wprowadzonych wierszy podlega makrorozwinięciu i jest modyfikowana zgodnie z ustawieniem opcji 'octalcod', 'clear' i 'lowtoupper'.


<instrukcja_A_I>:
<instrukcja_A_I>:
Linia 686: Linia 699:
Dołączenie jednego wiersza realizują instrukcje A I w postaci skróconej:
Dołączenie jednego wiersza realizują instrukcje A I w postaci skróconej:


[A]lf<łańcuch> - wiersz zawierający łańcuch jest dołączany za wierszem wskazanym (znak A nie ma żadnego znaczenia i może być pominięty) Ilf<łańcuch> - wiersz zawierający wskazany łańcuch jest wstawiany przed wierszem wskazanym
[A]lf<łańcuch> - wiersz zawierający łańcuch jest dołączany za wierszem wskazanym (znak A nie ma żadnego znaczenia i może być pominięty) Ilf<łańcuch> - wiersz zawierający wskazany łańcuch jest wstawiany przed wierszem wskazanym.


Po wstawieniu wiersza edytor zgłasza się po kolejne zlecenie. Zlecenie U usuwa wstawione wiersze z bufora roboczego i przenosi je do specjalnego bufora pomocniczego (7.2).
Po wstawieniu wiersza edytor zgłasza się po kolejne zlecenie. Zlecenie <code>U</code> usuwa wstawione wiersze z bufora roboczego i przenosi je do specjalnego bufora pomocniczego.


=== Zamiana wierszy na wprowadzane z końcówki ===
=== Zamiana wierszy na wprowadzane z końcówki ===
Linia 694: Linia 707:
Składnia zlecenia: <code><opis_obszaru> C [ lf<łańcuch> _ ! _ <znak> ]</code>
Składnia zlecenia: <code><opis_obszaru> C [ lf<łańcuch> _ ! _ <znak> ]</code>


Znaczenie: wskazany obszar jest usuwany (przenoszony do specjalnego bufora pomocniczego - 7.2) i na jego miejsce są wprowadzane z klawiatury nowe wiersze. Parametry zlecenia są takie same jak w zleceniach A I (5.2). Wprowadzanie jest wykonywane również tak samo jak instrukcjami A I . Wierszem bieżącym po wykonaniu zlecenia jest ostatni wprowadzony wiersz. Zlecenie U wstawia wiersze usunięte (przenosi je ze specjalnego bufora pomocniczego do bufora roboczego) i usuwa wiersze wstawione (przenosi je do specjalnego bufora pomocniczego).
Znaczenie: wskazany obszar jest usuwany (przenoszony do specjalnego bufora pomocniczego) i na jego miejsce są wprowadzane z klawiatury nowe wiersze. Parametry zlecenia są takie same jak w zleceniach <code>A</code>, <code>I</code>. Wprowadzanie jest wykonywane również tak samo jak instrukcjami <code>A</code> <code>I</code> . Wierszem bieżącym po wykonaniu zlecenia jest ostatni wprowadzony wiersz. Zlecenie <code>U</code> wstawia wiersze usunięte (przenosi je ze specjalnego bufora pomocniczego do bufora roboczego) i usuwa wiersze wstawione (przenosi je do specjalnego bufora pomocniczego).


=== Wczytywanie do bufora wierszy ze zbioru ===
=== Wczytywanie do bufora wierszy ze zbioru ===
Linia 700: Linia 713:
Składnia zlecenia: <code><wyrażenie_adresowe> <instrukcja_R> <tytuł_zbioru> [<opis_obszaru>]</code>
Składnia zlecenia: <code><wyrażenie_adresowe> <instrukcja_R> <tytuł_zbioru> [<opis_obszaru>]</code>


Działanie:w miejsce określone wyrażeniem adresowym i zleceniem R zostaną wprowadzone wiersze ze zbioru o podanej nazwie. Wiersze, które mają być wczytane są wskazane opisem obszaru podanym za nazwą zbioru. Opis obszaru ma składnię w zasadzie taką samą jak opisany w p 3.5. tzn. może składać się z adresu wiersza, adresów wierszy rozdzielonych znakami , lub ; (znaczenie obu separatorów jest w tym przypadku takie samo) albo adresu wiersza i liczby wierszy. Brak opisu obszaru oznacza wczytanie całego zbioru. Elementami wyrażeń adresowych nie mogą być elementy cofające wskaźnik dostępu (- < ^ ?<wzorzec>? ). Pozostałe elementy mają takie samo znaczenie, jak w wyrażeniach adresowych. Jedynym wyjątkiem jest znak $ oznaczający koniec bieżącej strony. I tu oznacza on ostatni wiersz strony, ale wiersz zawierający znacznik końca strony jest wliczany do strony. Wczytywany zbiór jest dzielony na strony tak samo jak poprawiany bufor. Długość czytanego zbioru jest określona parametrami PA1 i PA2. Jeżeli wartość tych parametrów wykracza poza dopuszczalny zakres (lub jest niezgodna z parametrem LEN) sygnalizowany jest zły typ zbioru wejściowego i zbiór nie jest wczytywany. Jeżeli parametry PA1 i PA2 zbioru mają wartość 0, długość czytanego zbioru jest wyliczana z parametru LEN. Wprowadzane wiersze muszą mieć długość do 255 znaków. Wiersze dłuższe są dzielone na wiersze o długości 255 znaków.
Działanie: w miejsce określone wyrażeniem adresowym i zleceniem R zostaną wprowadzone wiersze ze zbioru o podanej nazwie. Wiersze, które mają być wczytane są wskazane opisem obszaru podanym za nazwą zbioru. Opis obszaru ma składnię w zasadzie taką samą jak opisany w p 3.5. tzn. może składać się z adresu wiersza, adresów wierszy rozdzielonych znakami , lub ; (znaczenie obu separatorów jest w tym przypadku takie samo) albo adresu wiersza i liczby wierszy. Brak opisu obszaru oznacza wczytanie całego zbioru. Elementami wyrażeń adresowych nie mogą być elementy cofające wskaźnik dostępu (- < ^ ?<wzorzec>? ). Pozostałe elementy mają takie samo znaczenie, jak w wyrażeniach adresowych. Jedynym wyjątkiem jest znak $ oznaczający koniec bieżącej strony. I tu oznacza on ostatni wiersz strony, ale wiersz zawierający znacznik końca strony jest wliczany do strony. Wczytywany zbiór jest dzielony na strony tak samo jak poprawiany bufor. Długość czytanego zbioru jest określona parametrami PA1 i PA2. Jeżeli wartość tych parametrów wykracza poza dopuszczalny zakres (lub jest niezgodna z parametrem LEN) sygnalizowany jest zły typ zbioru wejściowego i zbiór nie jest wczytywany. Jeżeli parametry PA1 i PA2 zbioru mają wartość 0, długość czytanego zbioru jest wyliczana z parametru LEN. Wprowadzane wiersze muszą mieć długość do 255 znaków. Wiersze dłuższe są dzielone na wiersze o długości 255 znaków.


<instrukcja_R>:
<instrukcja_R>:
Linia 713: Linia 726:
=== Zlecenie podstawienia ===
=== Zlecenie podstawienia ===


Składnia zlecenia: <opis_obszaru>S/<wzorzec> [/<wzorzec_łańcucha> [/<schemat_podstawienia> <instrukcje_listujące>] ]
Składnia zlecenia: <code><opis_obszaru>S/<wzorzec> [/<wzorzec_łańcucha> [/<schemat_podstawienia> <instrukcje_listujące>] ]</code>


Działanie: we wskazanych wierszach łańcuchy zgodne ze wzorcem są zamieniane na łańcuchy wskazane przez <wzorzec_łańcucha>. Z łańcuchów zgodnych ze wzorcem są zamieniane tylko wskazane przez schemat podstawienia. Po wykonaniu zlecenia poprawione wiersze są wyprowadzane na monitor w postaci określonej przez instrukcje listujące. Uwaga. Znakiem ograniczającym wzorce może być zamiast znaku / dowolny inny znak poza spacją. Ze względu na specjalne znaczenie wielu znaków we wzorcach nie zaleca się stosowania innych znaków poza: ; : ' " i = .
Działanie: we wskazanych wierszach łańcuchy zgodne ze wzorcem są zamieniane na łańcuchy wskazane przez <wzorzec_łańcucha>. Z łańcuchów zgodnych ze wzorcem są zamieniane tylko wskazane przez schemat podstawienia. Po wykonaniu zlecenia poprawione wiersze są wyprowadzane na monitor w postaci określonej przez instrukcje listujące. Uwaga. Znakiem ograniczającym wzorce może być zamiast znaku / dowolny inny znak poza spacją. Ze względu na specjalne znaczenie wielu znaków we wzorcach nie zaleca się stosowania innych znaków poza: ; : ' " i = .
Linia 738: Linia 751:
Jeżeli wskaźnik konwersji poprzedza symbol oznaczający łańcuch, zamienione zostaną wszystkie litery wskazanego łańcucha.
Jeżeli wskaźnik konwersji poprzedza symbol oznaczający łańcuch, zamienione zostaną wszystkie litery wskazanego łańcucha.


<schemat_podstawienia> ::= {<opis_wystąpień>}[G] [?] _ & [?]
<schemat_podstawienia> ::= {<opis_wystąpień>}[G] [?] _ & [?]


pusty schemat podstawienia oznacza zamianę tylko pierwszego zgodnego ze wzorcem łańcucha w wierszu.
Pusty schemat podstawienia oznacza zamianę tylko pierwszego zgodnego ze wzorcem łańcucha w wierszu.


<opis_wystąpienia> : opisuje operację wykonywaną na kolejnych łańcuchach zgodnych ze wzorcem:
<opis_wystąpienia> : opisuje operację wykonywaną na kolejnych łańcuchach zgodnych ze wzorcem:


* - - kolejny łańcuch pozostaje bez zmian
* <code>-</code> - kolejny łańcuch pozostaje bez zmian
* + - kolejny łańcuch jest zamieniany
* <code>+</code> - kolejny łańcuch jest zamieniany
* -<liczba> - wskazana liczba kolejnych łańcuchów jest pozostawiana bez zmian
* <code>-<liczba></code> - wskazana liczba kolejnych łańcuchów jest pozostawiana bez zmian
* [+]<liczba> - wskazana liczba kolejnych łańcuchów jest zamieniana
* <code>[+]<liczba></code> - wskazana liczba kolejnych łańcuchów jest zamieniana
* G - wszystkie następne łańcuchy zgodne ze wzorcem znajdujące się w wierszu są zamieniane
* <code>G</code> - wszystkie następne łańcuchy zgodne ze wzorcem znajdujące się w wierszu są zamieniane
* & - schemat podstawienia jest taki sam jak w ostatnim zleceniu podstawienia (nie dotyczy ostatniego elementu - ?)
* <code>&</code> - schemat podstawienia jest taki sam jak w ostatnim zleceniu podstawienia (nie dotyczy ostatniego elementu - ?)
* ? - wszystkie podstawienia wskazane przez schemat podstawienia będą wykonane dopiero po akceptacji. łańcuch, który ma być zamieniony, jest podkreślany przez edytor ciągiem znaków ^..^. O podstawieniu decyduje wprowadzony znak akceptacji:
* <code>?</code> - wszystkie podstawienia wskazane przez schemat podstawienia będą wykonane dopiero po akceptacji. łańcuch, który ma być zamieniony, jest podkreślany przez edytor ciągiem znaków ^..^. O podstawieniu decyduje wprowadzony znak akceptacji:
** + - podstawienie wykonywane
** <code>+</code> - podstawienie wykonywane
** - - podstawienie nie wykonywane
** <code>-</code> - podstawienie nie wykonywane
** G - wszystkie pozostałe podstawienia wykonywane bez akceptacji
** <code>G</code> - wszystkie pozostałe podstawienia wykonywane bez akceptacji
** cr - podstawienie nie wykonywane i dalsza część wiersza pozostaje bez zmian
** '''cr''' - podstawienie nie wykonywane i dalsza część wiersza pozostaje bez zmian
** dc4 - podstawienie nie wykonywane, dalsza część wiersza pozostaje bez zmian i następne wiersze wskazanego obszaru nie są analizowane
** '''dc4''' - podstawienie nie wykonywane, dalsza część wiersza pozostaje bez zmian i następne wiersze wskazanego obszaru nie są analizowane


<instrukcje_listujące>- składnia i znaczenie takie same jak opisane w p 4.2.
<instrukcje_listujące>- składnia i znaczenie takie same jak opisane w p 4.2.
Linia 787: Linia 800:
Uwaga. Ciągi % i @ niezależnie od ustawienia opcji 'magic' nie są rozwijane - wszystkie znaki oznaczają siebie.
Uwaga. Ciągi % i @ niezależnie od ustawienia opcji 'magic' nie są rozwijane - wszystkie znaki oznaczają siebie.


Schemat podstawienia i instrukcje listujące są takie same jak dla pełnej instrukcji podstawienia (6.1)
Schemat podstawienia i instrukcje listujące są takie same jak dla pełnej instrukcji podstawienia.


Ostatnio użyte wzorce i łańcuchy wymienione wyżej oraz łańcuch wskazywany przez symbol @ są wyświetlane na monitorze bezparametrowym zleceniem S. W pierwszym wierszu są wyprowadzane ostatnio użyte wzorce w postaci: /a/ S /b/d/ (a, b i d oznaczają wzorce jw.). W następnych wierszach są wyprowadzane łańcuchy wskazywane symbolami _~, @ i % używanymi we wzorcach.
Ostatnio użyte wzorce i łańcuchy wymienione wyżej oraz łańcuch wskazywany przez symbol @ są wyświetlane na monitorze bezparametrowym zleceniem S. W pierwszym wierszu są wyprowadzane ostatnio użyte wzorce w postaci: /a/ S /b/d/ (a, b i d oznaczają wzorce jw.). W następnych wierszach są wyprowadzane łańcuchy wskazywane symbolami _~, @ i % używanymi we wzorcach.
Linia 797: Linia 810:
Składnia zlecenia: <code><opis_obszaru> O</code>
Składnia zlecenia: <code><opis_obszaru> O</code>


Działanie: na ekran monitora są wyprowadzane kolejne wiersze wskazanego obszaru. Cała zawartość wiersza jest umieszczana w polu niechronionym i kursor jest ustawiany za ostatnim znakiem wiersza. Zmiany zawartości wiersza można dokonać bezpośrednio wstawiając (INS MODE), usuwając (DEL) lub zamieniając znaki na ekranie. Po wciśnięciu klawisza SEND zmodyfikowana zawartość wiersza jest zapisywana do bufora roboczego i edytor wyprowadza na ekran kolejny wiersz obszaru wskazanego w zleceniu. Wprowadzenie dc4 (PF12) przerywa wykonanie zlecenia (ostatni wiersz wyświetlony na ekranie pozostaje w buforze bez zmian). Zawartość wierszy jest wyprowadzana na ekran w postaci określonej przez handler monitorów 7910/50 . Niezależnie od ustawienia opcji 'listcontrol' znaki o kodach 1..26 są listowane (jako małe litery poprzedzone znakiem funta) a inne znaki nie wyświetlane są zamieniane na spacje. I tak też zostaną wprowadzone do bufora po poprawieniu. Poprawione wiersze są po wczytaniu modyfikowane zgodnie z ustawieniem opcji 'lowtoupper' i 'clear'. Opcja 'octalcod' jest ignorowana, nie są też wykonywane makrorozwinięcia. Uwaga. Jeżeli pole niechronione zostanie całkowicie wyzerowane, to zawartość wiersza w buforze roboczym pozostanie nie zmieniona. Zlecenie U wykonane po zleceniu O cofa zmiany wykonane w ostatnim poprawionym wierszu.
Działanie: na ekran monitora są wyprowadzane kolejne wiersze wskazanego obszaru. Cała zawartość wiersza jest umieszczana w polu niechronionym i kursor jest ustawiany za ostatnim znakiem wiersza. Zmiany zawartości wiersza można dokonać bezpośrednio wstawiając (INS MODE), usuwając (DEL) lub zamieniając znaki na ekranie. Po wciśnięciu klawisza SEND zmodyfikowana zawartość wiersza jest zapisywana do bufora roboczego i edytor wyprowadza na ekran kolejny wiersz obszaru wskazanego w zleceniu. Wprowadzenie '''dc4''' (PF12) przerywa wykonanie zlecenia (ostatni wiersz wyświetlony na ekranie pozostaje w buforze bez zmian). Zawartość wierszy jest wyprowadzana na ekran w postaci określonej przez handler monitorów 7910/50 . Niezależnie od ustawienia opcji 'listcontrol' znaki o kodach 1..26 są listowane (jako małe litery poprzedzone znakiem funta) a inne znaki nie wyświetlane są zamieniane na spacje. I tak też zostaną wprowadzone do bufora po poprawieniu. Poprawione wiersze są po wczytaniu modyfikowane zgodnie z ustawieniem opcji 'lowtoupper' i 'clear'. Opcja 'octalcod' jest ignorowana, nie są też wykonywane makrorozwinięcia. Uwaga. Jeżeli pole niechronione zostanie całkowicie wyzerowane, to zawartość wiersza w buforze roboczym pozostanie nie zmieniona. Zlecenie <code>U</code> wykonane po zleceniu <code>O</code> cofa zmiany wykonane w ostatnim poprawionym wierszu.


=== Usuwanie znaków kontrolnych ===
=== Usuwanie znaków kontrolnych ===
Linia 821: Linia 834:
Działanie: wskazane wiersze zostaną połączone w jeden wiersz. Jeżeli opisany obszar zawiera tylko jeden wiersz, do tego wiersza jest dołączany następny wiersz. Parametry zlecenia:
Działanie: wskazane wiersze zostaną połączone w jeden wiersz. Jeżeli opisany obszar zawiera tylko jeden wiersz, do tego wiersza jest dołączany następny wiersz. Parametry zlecenia:


* ^ - usuwanie z dołączanych wierszy wszystkich początkowych spacji i znaków tabulacji ht
* <code>^</code> - usuwanie z dołączanych wierszy wszystkich początkowych spacji i znaków tabulacji '''ht'''
* /<łańcuch> - przed każdym dołączanym wierszem jest wstawiany podany łańcuch
* <code>/<łańcuch></code> - przed każdym dołączanym wierszem jest wstawiany podany łańcuch


Wierszem bieżącym po wykonaniu zlecenia jest nowo utworzony wiersz. Zlecenie U rozdziela wiersz na wiersze składowe.
Wierszem bieżącym po wykonaniu zlecenia jest nowo utworzony wiersz. Zlecenie <code>U</code> rozdziela wiersz na wiersze składowe.


== Przenoszenie i kopiowanie wierszy ==
== Przenoszenie i kopiowanie wierszy ==
Linia 830: Linia 843:
=== Przenoszenie i kopiowanie wierszy w buforze ===
=== Przenoszenie i kopiowanie wierszy w buforze ===


Składnia zlecenia: <opis_obszaru> <instrukcja_C_M> <wyrażenie_adresowe>
Składnia zlecenia: <code><opis_obszaru> <instrukcja_C_M> <wyrażenie_adresowe></code>


działanie: wskazany obszar jest kopiowany lub przenoszony w miejsce określone przez wyrażenie adresowe.
Działanie: wskazany obszar jest kopiowany lub przenoszony w miejsce określone przez wyrażenie adresowe.


<instrukcja_C_M>:
<instrukcja_C_M>:


* CA - kopiowanie obszaru za wskazany wiersz
* <code>CA</code> - kopiowanie obszaru za wskazany wiersz
* CI - kopiowanie obszaru przed wskazany wiersz
* <code>CI</code> - kopiowanie obszaru przed wskazany wiersz
* MA - przenoszenie obszaru za wskazany wiersz
* <code>MA</code> - przenoszenie obszaru za wskazany wiersz
* MI - przenoszenie obszaru przed wskazany wiersz
* <code>MI</code> - przenoszenie obszaru przed wskazany wiersz


Wierszem bieżącym po wykonaniu zlecenia jest ostatni skopiowany lub przeniesiony wiersz (zlecenia CA i MA) lub wiersz wskazany wyrażeniem adresowym (zlecenia CI i MI).
Wierszem bieżącym po wykonaniu zlecenia jest ostatni skopiowany lub przeniesiony wiersz (zlecenia <code>CA</code> i <code>MA</code>) lub wiersz wskazany wyrażeniem adresowym (zlecenia <code>CI</code> i <code>MI</code>).
Zlecenie U usuwa skopiowany obszar (zlecenia CA i CI) lub przenosi go z powrotem (zlecenia MI i MA).
Zlecenie <code>U</code> usuwa skopiowany obszar (zlecenia <code>CA</code> i <code>CI</code>) lub przenosi go z powrotem (zlecenia <code>MI</code> i <code>MA</code>).


=== Przenoszenie i kopiowanie wierszy do buforów pomocniczych ===
=== Przenoszenie i kopiowanie wierszy do buforów pomocniczych ===


Składnia zlecenia: <opis_obszaru> <instrukcja_D_Y> [>] [<litera>]
Składnia zlecenia: <code><opis_obszaru> <instrukcja_D_Y> [>] [<litera>]</code>


działanie: wskazany obszar jest kopiowany lub przenoszony (usuwany z bufora roboczego) do bufora pomocniczego nazwanego pojedyncza literą. Jeżeli jest podany parametr >, wskazane wiersze są dołączane do zawartości bufora pomocniczego. W przeciwnym razie poprzednia zawartość bufora jest niszczona. Jeżeli nazwa bufora nie zostanie podana, wiersze będą przeniesione lub skopiowane do bufora specjalnego.
Działanie: wskazany obszar jest kopiowany lub przenoszony (usuwany z bufora roboczego) do bufora pomocniczego nazwanego pojedyncza literą. Jeżeli jest podany parametr >, wskazane wiersze są dołączane do zawartości bufora pomocniczego. W przeciwnym razie poprzednia zawartość bufora jest niszczona. Jeżeli nazwa bufora nie zostanie podana, wiersze będą przeniesione lub skopiowane do bufora specjalnego.


<instrukcja_D_Y>:
<instrukcja_D_Y>:


* D - przenoszenie wierszy
* <code>D</code> - przenoszenie wierszy
* Y - kopiowanie wierszy
* <code>Y</code> - kopiowanie wierszy


Można korzystać z 26 buforów pomocniczych o nazwach A..Z oraz z bufora specjalnego bez nazwy. Informacje o zawartości buforów nazwanych są drukowane zleceniem " w postaci:
Można korzystać z 26 buforów pomocniczych o nazwach A..Z oraz z bufora specjalnego bez nazwy. Informacje o zawartości buforów nazwanych są drukowane zleceniem " w postaci:


<nazwa_bufora> <liczba_wierszy>
<nazwa_bufora> <liczba_wierszy>


Wierszem bieżącym po skopiowaniu (Y) jest ostatni wiersz obszaru a po przeniesieniu (D) - pierwszy wiersz za przeniesionymi.
Wierszem bieżącym po skopiowaniu (<code>Y</code>) jest ostatni wiersz obszaru a po przeniesieniu (<code>D</code>) - pierwszy wiersz za przeniesionymi.


Zlecenie U przenosi wiersze z powrotem do bufora roboczego (po kopiowaniu tylko je usuwa z bufora pomocniczego). Jeżeli zlecenie kopiowania lub przenoszenia wierszy do bufora pomocniczego było podane bez parametru >, to zlecenie U nie odtwarza poprzedniej zawartości bufora pomocniczego.
Zlecenie <code>U</code> przenosi wiersze z powrotem do bufora roboczego (po kopiowaniu tylko je usuwa z bufora pomocniczego). Jeżeli zlecenie kopiowania lub przenoszenia wierszy do bufora pomocniczego było podane bez parametru <code>></code>, to zlecenie <code>U</code> nie odtwarza poprzedniej zawartości bufora pomocniczego.


Bufor specjalny (bez nazwy) jest wykorzystywany także przy wykonywaniu innych zleceń niż D i Y. Gdy wykonywane jest zlecenie C, wiersze usunięte tym zleceniem są przenoszone do tego bufora. Także przy wykonywaniu zlecenia U po zleceniach I, A, C, RA i RI wiersze usunięte są przenoszone do bufora specjalnego (ponowne wykonanie zlecenia U przeniesie te wiersze z powrotem do bufora roboczego i bufor specjalny zostanie opróżniony).
Bufor specjalny (bez nazwy) jest wykorzystywany także przy wykonywaniu innych zleceń niż <code>D</code> i <code>Y</code>. Gdy wykonywane jest zlecenie <code>C</code>, wiersze usunięte tym zleceniem są przenoszone do tego bufora. Także przy wykonywaniu zlecenia U po zleceniach <code>I</code>, <code>A</code>, <code>C</code>, <code>RA</code> i <code>RI</code> wiersze usunięte są przenoszone do bufora specjalnego (ponowne wykonanie zlecenia <code>U</code> przeniesie te wiersze z powrotem do bufora roboczego i bufor specjalny zostanie opróżniony).


=== Kopiowanie buforów pomocniczych do bufora roboczego ===
=== Kopiowanie buforów pomocniczych do bufora roboczego ===
Linia 873: Linia 886:
<instrukcja_P>:
<instrukcja_P>:


* PA - kopiowanie bufora za wskazany wiersz
* <code>PA</code> - kopiowanie bufora za wskazany wiersz
* PI - kopiowanie bufora przed wskazany wiersz
* <code>PI</code> - kopiowanie bufora przed wskazany wiersz


Wierszem bieżącym po wykonaniu zlecenie jest ostatni skopiowany wiersz (PA) lub wiersz wskazany wyrażeniem adresowym (PI). Zlecenie U usuwa skopiowany obszar.
Wierszem bieżącym po wykonaniu zlecenie jest ostatni skopiowany wiersz (<code>PA</code>) lub wiersz wskazany wyrażeniem adresowym (<code>PI</code>). Zlecenie <code>U</code> usuwa skopiowany obszar.


== Edycja wielu zbiorów ==
== Edycja wielu zbiorów ==
Linia 882: Linia 895:
=== Edycja następnego zbioru ===
=== Edycja następnego zbioru ===


Składnia zlecenia: N <tytuł_zbioru>
Składnia zlecenia: <code>N <tytuł_zbioru></code>


działanie: wskazany zbiór jest wczytywany do kolejnego bufora roboczego. Bufor roboczy otrzymuje kolejny numer i nazwę zgodną z tytułem zbioru podanym w zleceniu. Dotychczas poprawiany bufor jest zachowywany w zbiorach roboczych. Wskaźnik dostępu jest ustawiany na pierwszy wiersz bufora. Długość czytanego zbioru jest określona parametrami PA1 i PA2. Jeżeli wartość tych parametrów wykracza poza dopuszczalny zakres (lub jest niezgodna z parametrem LEN) sygnalizowany jest zły typ zbioru wejściowego i bufor nie jest otwierany. Jeżeli parametry PA1 i PA2 zbioru mają wartość 0, długość czytanego zbioru jest wyliczana z parametru LEN. Jeżeli zbiór o podanym tytule nie jest dostępny, wyprowadzany jest komunikat:
Działanie: wskazany zbiór jest wczytywany do kolejnego bufora roboczego. Bufor roboczy otrzymuje kolejny numer i nazwę zgodną z tytułem zbioru podanym w zleceniu. Dotychczas poprawiany bufor jest zachowywany w zbiorach roboczych. Wskaźnik dostępu jest ustawiany na pierwszy wiersz bufora. Długość czytanego zbioru jest określona parametrami PA1 i PA2. Jeżeli wartość tych parametrów wykracza poza dopuszczalny zakres (lub jest niezgodna z parametrem LEN) sygnalizowany jest zły typ zbioru wejściowego i bufor nie jest otwierany. Jeżeli parametry PA1 i PA2 zbioru mają wartość 0, długość czytanego zbioru jest wyliczana z parametru LEN. Jeżeli zbiór o podanym tytule nie jest dostępny, wyprowadzany jest komunikat:


  *** NEW FILE ***
  *** NEW FILE ***


i edytor przechodzi do wczytywania wierszy z końcówki - wykonywane jest niejawne zlecenie A (II.5.2). Po wprowadzeniu dc4 edytor kończy wprowadzanie i rozpoczyna edycję bufora ustawiając wskaźnik dostępu na ostatni wprowadzony wiersz. Wprowadzenie pustego zbioru (dc4 w pierwszym wierszu) powoduje powrót do edycji bufora poprawianego do tej pory.
i edytor przechodzi do wczytywania wierszy z końcówki - wykonywane jest niejawne zlecenie <code>A</code>. Po wprowadzeniu '''dc4''' edytor kończy wprowadzanie i rozpoczyna edycję bufora ustawiając wskaźnik dostępu na ostatni wprowadzony wiersz. Wprowadzenie pustego zbioru ('''dc4''' w pierwszym wierszu) powoduje powrót do edycji bufora poprawianego do tej pory.


=== Edycja innego bufora ===
=== Edycja innego bufora ===


Składnia zlecenia: E <wskazanie_bufora> [ ! _ <znak>]
Składnia zlecenia: <code>E <wskazanie_bufora> [ ! _ <znak>]</code>


działanie: następuje przejście do edycji innego bufora. Bufor poprawiany do tej pory jest zachowywany w zbiorach roboczych.
Działanie: następuje przejście do edycji innego bufora. Bufor poprawiany do tej pory jest zachowywany w zbiorach roboczych.


<wskazanie_bufora>:
<wskazanie_bufora>:
Linia 902: Linia 915:
* "<litera> - bufor pomocniczy o podanej nazwie
* "<litera> - bufor pomocniczy o podanej nazwie
* *[<litera>] - bufor pomocniczy zleceń
* *[<litera>] - bufor pomocniczy zleceń
* - - bufor poprawiany przed wykonaniem ostatniego zlecenia E lub N
* - - bufor poprawiany przed wykonaniem ostatniego zlecenia <code>E</code> lub <code>N</code>


Po przejściu do edycji bufora roboczego jest odtwarzany wskaźnik dostępu i znaczniki wierszy użyte w czasie poprzedniej edycji tego bufora. Po przejściu do edycji bufora pomocniczego wskaźnik dostępu jest ustawiany na pierwszy wiersz bufora a znaczniki wierszy są zerowane. Jeżeli wskazany bufor pomocniczy jest pusty, wyprowadzany jest komunikat:
Po przejściu do edycji bufora roboczego jest odtwarzany wskaźnik dostępu i znaczniki wierszy użyte w czasie poprzedniej edycji tego bufora. Po przejściu do edycji bufora pomocniczego wskaźnik dostępu jest ustawiany na pierwszy wiersz bufora a znaczniki wierszy są zerowane. Jeżeli wskazany bufor pomocniczy jest pusty, wyprowadzany jest komunikat:


*** NEW BUFFER ***
*** NEW BUFFER ***


i edytor przechodzi do wprowadzania zawartości bufora z końcówki. Działanie edytora w czasie wprowadzania jest takie samo jak w czasie wykonywania zlecenia A. Podanie jako parametru znaku ! zmienia ustawienie opcji 'autotab' na przeciwne (2.4). Wprowadzanie jest kończone wpisaniem dc4 lub wiersza zawierającego tylko znacznik końca wprowadzania - znaku podanego w zleceniu E za wskazaniem bufora. Znacznikiem końca wprowadzania może być dowolny znak kodu ASCII poza znakami !, cr, dc4, lf i spacją. Edycja buforów pomocniczych niczym nie różni się od edycji buforów roboczych, z tym że niedozwolone jest użycie nazwy poprawianego bufora pomocniczego w zleceniu kopiowania lub przenoszenia wierszy.
i edytor przechodzi do wprowadzania zawartości bufora z końcówki. Działanie edytora w czasie wprowadzania jest takie samo jak w czasie wykonywania zlecenia <code>A</code>. Podanie jako parametru znaku ! zmienia ustawienie opcji 'autotab' na przeciwne. Wprowadzanie jest kończone wpisaniem dc4 lub wiersza zawierającego tylko znacznik końca wprowadzania - znaku podanego w zleceniu <code>E</code> za wskazaniem bufora. Znacznikiem końca wprowadzania może być dowolny znak kodu ASCII poza znakami '''!''', '''cr''', '''dc4''', '''lf''' i spacją. Edycja buforów pomocniczych niczym nie różni się od edycji buforów roboczych, z tym że niedozwolone jest użycie nazwy poprawianego bufora pomocniczego w zleceniu kopiowania lub przenoszenia wierszy.


=== Zmiana nazwy bufora roboczego ===
=== Zmiana nazwy bufora roboczego ===
Linia 924: Linia 937:
=== Listowanie informacji o buforach roboczych ===
=== Listowanie informacji o buforach roboczych ===


Składnia zlecenia: FA
Składnia zlecenia: <code>FA</code>


działanie: na monitor są wyprowadzane informacje o wszystkich buforach roboczych. W pierwszym wierszu jest wyprowadzany opis bufora aktualnie poprawianego w takiej samej postaci jak zleceniem F. W dalszych - opis pozostałych buforów roboczych w podobnej postaci:
Działanie: na monitor są wyprowadzane informacje o wszystkich buforach roboczych. W pierwszym wierszu jest wyprowadzany opis bufora aktualnie poprawianego w takiej samej postaci jak zleceniem <code>F</code>. W dalszych - opis pozostałych buforów roboczych w podobnej postaci:


  <numer_bufora> <tytuł_zbioru> <liczba_wierszy_w_buforze>
  <numer_bufora> <tytuł_zbioru> <liczba_wierszy_w_buforze>


Opis bufora poprawianego poprzednio (dostępnego zleceniem E) jest poprzedzony znakiem - .
Opis bufora poprawianego poprzednio (dostępnego zleceniem <code>E</code>) jest poprzedzony znakiem '''-'''.


== Wyprowadzanie zawartości bufora do zbioru ==
== Wyprowadzanie zawartości bufora do zbioru ==


Składnia zlecenia: <opis_obszaru> <instrukcja_W> [> _ !] [<tytuł_zbioru>]
Składnia zlecenia: <code><opis_obszaru> <instrukcja_W> [> _ !] [<tytuł_zbioru>]</code>


działanie: opisany obszar bufora jest kopiowany do wskazanego zbioru. Jeżeli zbiór nie istnieje, jest tworzony. Gdy nie jest podany opis obszaru, kopiowany jest cały bufor.
Działanie: opisany obszar bufora jest kopiowany do wskazanego zbioru. Jeżeli zbiór nie istnieje, jest tworzony. Gdy nie jest podany opis obszaru, kopiowany jest cały bufor.


<instrukcja_W>:
<instrukcja_W>:


* W - kopiowanie bufora
* <code>W</code> - kopiowanie bufora
* WQ - kopiowanie bufora i wykonanie zlecenia Q
* <code>WQ</code> - kopiowanie bufora i wykonanie zlecenia <code>Q</code>
* > - wskazany obszar jest dołączany do istniejącego zbioru
* <code>></code> - wskazany obszar jest dołączany do istniejącego zbioru
* ! - pozwolenie na zapisanie zawartości bufora do zbioru już istniejącego (wymagane tylko wtedy, gdy jest podany tytuł zbioru)
* <code>!</code> - pozwolenie na zapisanie zawartości bufora do zbioru już istniejącego (wymagane tylko wtedy, gdy jest podany tytuł zbioru)


Gdy zostanie podany tytuł zbioru już istniejącego, wymagane jest podanie jednego z parametrów ! lub >. Inaczej zostanie wyprowadzony komunikat:
Gdy zostanie podany tytuł zbioru już istniejącego, wymagane jest podanie jednego z parametrów <code>!</code> lub <code>></code>. Inaczej zostanie wyprowadzony komunikat:


  FILE ALREADY EXIST: <tytuł_zbioru> ( !, > OR CR ) ?
  FILE ALREADY EXIST: <tytuł_zbioru> ( !, > OR CR ) ?
Linia 951: Linia 964:
Po znaku zapytania należy wprowadzić znak:
Po znaku zapytania należy wprowadzić znak:


* > - wskazany obszar będzie dołączony do zawartości zbioru
* '''>''' - wskazany obszar będzie dołączony do zawartości zbioru
* ! - zawartość zbioru będzie zniszczona
* '''!<''' - zawartość zbioru będzie zniszczona
* cr - zlecenie nie będzie wykonane
* '''cr''' - zlecenie nie będzie wykonane


Jeżeli nie jest podany tytuł zbioru, obszar będzie skopiowany do zbioru o tytule takim jak nazwa poprawianego bufora roboczego. Gdy jest poprawiany bufor pomocniczy, tytuł zbioru jest obowiązkowy. Wierszem bieżącym po wykonaniu instrukcji W jest ostatni skopiowany wiersz. Gdy zostanie wykonana instrukcja WQ, wierszem bieżącym zapamiętanym w zbiorze roboczym będzie wiersz dostępny w momencie wprowadzania zlecenia.
Jeżeli nie jest podany tytuł zbioru, obszar będzie skopiowany do zbioru o tytule takim jak nazwa poprawianego bufora roboczego. Gdy jest poprawiany bufor pomocniczy, tytuł zbioru jest obowiązkowy. Wierszem bieżącym po wykonaniu instrukcji <code>W</code> jest ostatni skopiowany wiersz. Gdy zostanie wykonana instrukcja <code>WQ</code>, wierszem bieżącym zapamiętanym w zbiorze roboczym będzie wiersz dostępny w momencie wprowadzania zlecenia.


== Globalne wykonywanie zleceń ==
== Globalne wykonywanie zleceń ==
Linia 963: Linia 976:
Znaczenie: na wszystkich wierszach opisanego obszaru zgodnych z podanym wzorcem (lub niezgodnych - jeżeli jest podany parametr ^) będzie wykonane wskazane zlecenie. Wskazany obszar musi zawierać więcej niż jeden wiersz. Jeżeli opis obszaru nie zostanie podany, przeszukany zostanie cały bufor. Wzorzec ma składnię i znaczenie opisane w 3.2. Pusty wzorzec oznacza przyjęcie wzorca użytego w ostatnim zleceniu przeszukiwania bufora. Zleceniem G można wykonywać zlecenia: D, A, I, C, RA, RI, P, L, #, Z, S, &, @, %, _~, J, CL, LU, UL, W, Y, PA, PI i O. Jeżeli zlecenie nie zostanie podane, wiersze wskazane wzorcem będą wyświetlone na monitorze w postaci określonej przez opcje listowania. Parametry zlecenia:
Znaczenie: na wszystkich wierszach opisanego obszaru zgodnych z podanym wzorcem (lub niezgodnych - jeżeli jest podany parametr ^) będzie wykonane wskazane zlecenie. Wskazany obszar musi zawierać więcej niż jeden wiersz. Jeżeli opis obszaru nie zostanie podany, przeszukany zostanie cały bufor. Wzorzec ma składnię i znaczenie opisane w 3.2. Pusty wzorzec oznacza przyjęcie wzorca użytego w ostatnim zleceniu przeszukiwania bufora. Zleceniem G można wykonywać zlecenia: D, A, I, C, RA, RI, P, L, #, Z, S, &, @, %, _~, J, CL, LU, UL, W, Y, PA, PI i O. Jeżeli zlecenie nie zostanie podane, wiersze wskazane wzorcem będą wyświetlone na monitorze w postaci określonej przez opcje listowania. Parametry zlecenia:


* ^ - zlecenie dotyczy wierszy niezgodnych z podanym wzorcem
* <code>^</code> - zlecenie dotyczy wierszy niezgodnych z podanym wzorcem
* ? - zlecenie będzie wykonane na wierszach wskazanych wzorcem i parametrem ^, ale dopiero po akceptacji użytkownika. Edytor przed wykonaniem zlecenia wyświetla zawartość wiersza i oczekuje na wprowadzenie znaku akceptacji:
* <code>?</code> - zlecenie będzie wykonane na wierszach wskazanych wzorcem i parametrem <code>^</code>, ale dopiero po akceptacji użytkownika. Edytor przed wykonaniem zlecenia wyświetla zawartość wiersza i oczekuje na wprowadzenie znaku akceptacji:
** + zlecenie będzie wykonane
** '''+''' zlecenie będzie wykonane
** cr zlecenie nie będzie wykonane
** '''cr''' zlecenie nie będzie wykonane
** dc4 zlecenie nie będzie wykonane i pozostałe wiersze wskazanego obszaru nie będą analizowane  
** '''dc4''' zlecenie nie będzie wykonane i pozostałe wiersze wskazanego obszaru nie będą analizowane  


Jeżeli parametr ? nie jest podany, wiersze na których ma być wykonane zlecenie są także wyświetlane na monitorze, ale zatrzymanie wydruku następuje dopiero po zapełnieniu ekranu (zgodnie z ustawieniem opcji 'linecount'). Wprowadzenie cr wznawia wykonanie zlecenia, natomiast dc4 - kończy je. Po wykonaniu całego zlecenia G jest wykonywane automatycznie zlecenie P wyświetlające na monitorze wiersz dostępny w tym momencie (chyba, że wierszem bieżącym jest ostatni wyświetlony wiersz). Zlecenie U cofa wszystkie wykonane zmiany.
Jeżeli parametr <code>?</code> nie jest podany, wiersze na których ma być wykonane zlecenie są także wyświetlane na monitorze, ale zatrzymanie wydruku następuje dopiero po zapełnieniu ekranu (zgodnie z ustawieniem opcji 'linecount'). Wprowadzenie '''cr''' wznawia wykonanie zlecenia, natomiast '''dc4''' - kończy je. Po wykonaniu całego zlecenia <code>G</code> jest wykonywane automatycznie zlecenie <code>P</code> wyświetlające na monitorze wiersz dostępny w tym momencie (chyba, że wierszem bieżącym jest ostatni wyświetlony wiersz). Zlecenie <code>U</code> cofa wszystkie wykonane zmiany.


== Wykonywanie poprawek w trybie niekonwersacyjnym ==
== Wykonywanie poprawek w trybie niekonwersacyjnym ==
Linia 975: Linia 988:
=== Zmiana strumienia zleceń ===
=== Zmiana strumienia zleceń ===


Składnia zlecenia: <wyrażenie_adresowe> INT [<tytuł_zbioru>]
Składnia zlecenia: <code><wyrażenie_adresowe> INT [<tytuł_zbioru>]</code>


Działanie: wskaźnik dostępu do bufora jest ustawiany na wskazany wiersz i dalsze zlecenia edytor będzie pobierał z podanego zbioru. Rozpoznanie znacznika końca zbioru spowoduje powrót do strumienia, z którego zostało pobrane zlecenie INT (dozwolone jest zagłębianie zleceń INT). Jeżeli zlecenia są pobierane ze zbioru, to wykrycie błędnego zlecenia lub wykonanie zlecenia INT bez podanej nazwy zbioru spowoduje przejście do trybu konwersacyjnego. Do pobierania dalszych zleceń ze zbioru można powrócić wprowadzając (w trybie konwersacyjnym) zlecenie INT bez podanej nazwy zbioru.
Działanie: wskaźnik dostępu do bufora jest ustawiany na wskazany wiersz i dalsze zlecenia edytor będzie pobierał z podanego zbioru. Rozpoznanie znacznika końca zbioru spowoduje powrót do strumienia, z którego zostało pobrane zlecenie <code>INT</code> (dozwolone jest zagłębianie zleceń <code>INT</code>). Jeżeli zlecenia są pobierane ze zbioru, to wykrycie błędnego zlecenia lub wykonanie zlecenia <code>INT</code> bez podanej nazwy zbioru spowoduje przejście do trybu konwersacyjnego. Do pobierania dalszych zleceń ze zbioru można powrócić wprowadzając (w trybie konwersacyjnym) zlecenie <code>INT</code> bez podanej nazwy zbioru.


=== Bufory zleceń ===
=== Bufory zleceń ===


Składnia zlecenia: <wyrażenie_adresowe> *[<litera>] [<liczba>$]
Składnia zlecenia: <code><wyrażenie_adresowe> *[<litera>] [<liczba>$]</code>


działanie: wskaźnik dostępu do bufora jest ustawiany na wskazany wiersz, po czym są wykonywane wszystkie zlecenia zapisane we wskazanym buforze zleceń. Można używać 26 buforów o nazwach A do Z oraz jednego bufora bez nazwy. Parametr podany za nazwą bufora
Działanie: wskaźnik dostępu do bufora jest ustawiany na wskazany wiersz, po czym są wykonywane wszystkie zlecenia zapisane we wskazanym buforze zleceń. Można używać 26 buforów o nazwach A do Z oraz jednego bufora bez nazwy. Parametr podany za nazwą bufora oznacza liczbę wykonań tych zleceń. Podanie zamiast liczby wykonań znaku <code>$</code> oznacza wykonywanie zleceń zawartych w buforze aż do wystąpienia błędu. Bufory zleceń są tworzone zleceniem <code>E *</code> i mogą być poprawiane tak samo jak inne bufory pomocnicze. Informacje o używanych buforach zleceń są wyprowadzane wraz z informacjami o innych buforach zleceniem <code>"</code>.
oznacza liczbę wykonań tych zleceń. Podanie zamiast liczby wykonań znaku $ oznacza wykonywanie zleceń zawartych w buforze aż do wystąpienia błędu. Bufory zleceń są tworzone zleceniem E * (8.2) i mogą być poprawiane tak samo jak inne bufory pomocnicze. Informacje o używanych buforach zleceń są wyprowadzane wraz z informacjami o innych buforach zleceniem ".


=== Zlecenia komentarza ===
=== Zlecenia komentarza ===
Linia 1000: Linia 1012:
Składnia: <code>!<zlecenie_OSL-a></code>
Składnia: <code>!<zlecenie_OSL-a></code>


Działanie: łańcuch podany za znakiem ! zostanie przekazany procesowi obsługi operatora jako zlecenie. Składnia tego zlecenia powinna być zgodna ze składnią akceptowaną przez OSL. Przekazane zlecenie zostanie uruchomione w tle (nie należy go kończyć znakiem & oznaczającym wykonanie w tle). Uwaga. Zlecenia wykonywane w podany wyżej sposób nie powinny korzystać z końcówki.
Działanie: łańcuch podany za znakiem <code>!</code> zostanie przekazany procesowi obsługi operatora jako zlecenie. Składnia tego zlecenia powinna być zgodna ze składnią akceptowaną przez OSL. Przekazane zlecenie zostanie uruchomione w tle (nie należy go kończyć znakiem <code>&</code> oznaczającym wykonanie w tle). Uwaga: zlecenia wykonywane w podany wyżej sposób nie powinny korzystać z końcówki.


== Działanie w sytuacjach awaryjnych ==
== Działanie w sytuacjach awaryjnych ==


W tym rozdziale są opisane działania mające uchronić użytkownika przed stratami w przypadku awarii systemu, sprzętu, braku zasobów lub w innych sytuacjach, gdy wykonywanie edycji zostanie przerwane. Jak to już zostało opisane (II.1.2.) stan poprawianych buforów jest zapisywany w zbiorach roboczych EXMLIN i EXMOPI. Część informacji o aktualnie poprawianym buforze ze względu na efektywność działania edytora przechowywana w pamięci edytora. Aby uchronić użytkownika przed zbytnimi stratami w przypadku awarii uniemożliwiającej dalsze wykonanie programu (na przykład pad systemu), co pewien czas (5 minut) wszystkie informacje o poprawianym buforze są kopiowane do zbiorów roboczych. Jeżeli po przerwaniu działania edytora, zostanie on ponownie wywołany bez podanej nazwy zbioru, wczyta ostatni zapamiętany stan edycji. Wszystkie poprawki wykonane przed ostatnim zrzutem będą zachowane. Poprawki wykonane później nie są zachowywane. Ponieważ zapamiętywany jest także wskaźnik dostępu łatwo ustalić, które poprawki nie zostały zapamiętane. Powyższe uwagi dotyczą sytuacji, gdy po przerwaniu działania edytor nie może zostać zrestartowany: po awarii systemu operacyjnego, sprzętu lub przy braku zasobów niezbędnych do dalszej edycji (np brak pamięci dyskowej). Po przerwaniu wykonywania przez OPRQ, komunikat, lub inne zewnętrzne przyczyny nie naruszające programu i jego otoczenia (stan rejestrów, pamięć, przywiązane strumienie) działanie edytora należy wznowić zlecenie RS OSL-a. Z powyższych wywodów wynika, że należy stosować następującą zasadę: jeżeli działanie edytora zostało przerwane z komunikatem EXM FINISH lub EXM STOPPED, należy je wznowić zleceniem RS. We wszystkich innych przypadkach należy usunąć edytor zleceniem DE EXM i wywołać go bez podanej nazwy poprawianego zbioru.
W tym rozdziale są opisane działania mające uchronić użytkownika przed stratami w przypadku awarii systemu, sprzętu, braku zasobów lub w innych sytuacjach, gdy wykonywanie edycji zostanie przerwane. Jak to już zostało opisane, stan poprawianych buforów jest zapisywany w zbiorach roboczych EXMLIN i EXMOPI. Część informacji o aktualnie poprawianym buforze ze względu na efektywność działania edytora przechowywana w pamięci edytora. Aby uchronić użytkownika przed zbytnimi stratami w przypadku awarii uniemożliwiającej dalsze wykonanie programu (na przykład pad systemu), co pewien czas (5 minut) wszystkie informacje o poprawianym buforze są kopiowane do zbiorów roboczych. Jeżeli po przerwaniu działania edytora, zostanie on ponownie wywołany bez podanej nazwy zbioru, wczyta ostatni zapamiętany stan edycji. Wszystkie poprawki wykonane przed ostatnim zrzutem będą zachowane. Poprawki wykonane później nie są zachowywane. Ponieważ zapamiętywany jest także wskaźnik dostępu łatwo ustalić, które poprawki nie zostały zapamiętane. Powyższe uwagi dotyczą sytuacji, gdy po przerwaniu działania edytor nie może zostać zrestartowany: po awarii systemu operacyjnego, sprzętu lub przy braku zasobów niezbędnych do dalszej edycji (np brak pamięci dyskowej). Po przerwaniu wykonywania przez OPRQ, komunikat, lub inne zewnętrzne przyczyny nie naruszające programu i jego otoczenia (stan rejestrów, pamięć, przywiązane strumienie) działanie edytora należy wznowić zlecenie <code>RS</code> OSL-a. Z powyższych wywodów wynika, że należy stosować następującą zasadę: jeżeli działanie edytora zostało przerwane z komunikatem EXM FINISH lub EXM STOPPED, należy je wznowić zleceniem <code>RS</code>. We wszystkich innych przypadkach należy usunąć edytor zleceniem <code>DE</code> EXM i wywołać go bez podanej nazwy poprawianego zbioru.


= Alfabetyczny spis instrukcji edytora EXM =
= Alfabetyczny spis instrukcji edytora EXM =
Linia 1014: Linia 1026:
* CL - usunięcie znaków kontrolnych
* CL - usunięcie znaków kontrolnych
* COM - komentarz
* COM - komentarz
* D - usunięcie wierszy
* D - usunięcie wierszy i wstawienie ich do bufora pomocniczego
* i wstawienie ich do bufora pomocniczego
* E - poprawianie innego bufora
* E - poprawianie innego bufora
* F - nazwa bufora roboczego
* F - nazwa bufora roboczego
Linia 1074: Linia 1085:
* =T[^:]\Y - etykieta (niepusty ciąg znaków ograniczonych znakiem ''':''')
* =T[^:]\Y - etykieta (niepusty ciąg znaków ograniczonych znakiem ''':''')
* =P!.*! - rozdziela wzorzec na części
* =P!.*! - rozdziela wzorzec na części
* =Q\3\2\1 - zmienne P i Q są wykorzystywane przy zamianie miejscami dwóch części wiersza i powinny być używane razem. Zlecenie: S/<część>\P<część>/\Q zamieni miejscami łańcuchy wskazane przez części wzorca. Gdy przestawiane części bezpośrednio stykają się ze sobą można także zapisać: S/<część>!<część>/\Q
* =Q\3\2\1 - zmienne P i Q są wykorzystywane przy zamianie miejscami dwóch części wiersza i powinny być używane razem. Zlecenie: <code>S/<część>\P<część>/\Q</code> zamieni miejscami łańcuchy wskazane przez części wzorca. Gdy przestawiane części bezpośrednio stykają się ze sobą można także zapisać: <code>S/<część>!<część>/\Q</code>. Uwaga: Wzorzec użyty w zlecenie wykorzystującym zmienne P i Q nie powinien zawierać innych znaków ! dzielących go na części. Użycie dodatkowych znaków ! może spowodować przestawienie innych części niż zostało to podane. Na przykład zlecenie <code>S/<część1>!<część2>!<część3>/\Q</code> przestawi części pierwszą i trzecią.
Uwaga. Wzorzec użyty w zlecenie wykorzystującym zmienne P i Q nie powinien zawierać innych znaków ! dzielących go na części. Użycie dodatkowych znaków ! może spowodować przestawienie innych części niż zostało to podane. Na przykład zlecenie <code>S/<część1>!<część2>!<część3>/\Q</code> przestawi części pierwszą i trzecią.
* =V\ - znak backslash \. Definicja taka jest niezbędna, gdy chcemy wprowadzać teksty zawierające litery poprzedzone znakiem \, a używamy zmiennych generacyjnych. Na przykład, jeżeli korzystamy z wcześniej opisanych definicji, to znaki \D zostaną po wprowadzeniu rozwinięte do ciągu [0-9], gdyż taki zapis oznacza zmienną generacyjną. Znaki \D zostaną wprowadzone do wiersza, dopiero jeżeli napiszemy: \VD .
* =V\ - znak backslash \. Definicja taka jest niezbędna, gdy chcemy wprowadzać teksty zawierające litery poprzedzone znakiem \, a używamy zmiennych generacyjnych. Na przykład, jeżeli korzystamy z wcześniej opisanych definicji, to znaki \D zostaną po wprowadzeniu rozwinięte do ciągu [0-9], gdyż taki zapis oznacza zmienną generacyjną. Znaki \D zostaną wprowadzone do wiersza, dopiero jeżeli napiszemy: \VD .



Aktualna wersja na dzień 17:18, 8 cze 2018

Opis użytkowy

Edytor EXM jest edytorem tekstowym pracującym całymi wierszami. Jest on wzorowany na edytorze EX pracującym pod systemem UNIX. Z edytorów pracujących na minikomputerze MERA-400 najbardziej zbliżonym do tego edytora jest edytor EDM (wzorowany na edytorach ED i wcześniejszych wersjach EX).

Wywołanie edytora

Edytor jest wywoływany pod OSL zleceniem: EXM [<tytuł_zbioru>]. Po wywołaniu w powyższy sposób EXM wyprowadza na monitor informacje o wczytanym zbiorze w postaci:

E: 0 <tytuł_zbioru> <liczba_wierszy_w_zbiorze>

i zgłasza się znakiem : - gotów do poprawiania zbioru. Jeżeli zbiór o podanym tytule nie zostanie znaleziony na dysku, EXM wyprowadza komunikat:

*** NEW FILE ***

i przechodzi do wczytywania zbioru z końcówki (dokładnie tak jak program COPY). Po wprowadzeniu wiersza zawierającego znacznik końca zbioru (znak dc4 - CTRL/T), EXM przechodzi do poprawiania zbioru. Wprowadzenie pustego zbioru z końcówki (podanie znacznika końca zbioru w pierwszym wierszu) powoduje usunięcie edytora z komunikatem:

EMPTY FILE

EXM przepisuje zbiór wskazany w wywołaniu do bufora roboczego i wszystkie poprawki są wykonywane w tym buforze. Powrotne przepisanie poprawionego bufora do zbioru wskazanego przy wywołaniu następuje po wprowadzeniu zlecenia W. Jeżeli istnieje potrzeba zachowania zbioru wejściowego bez zmian, poprawiony bufor można wyprowadzić do dowolnego zbioru podając nazwę tego zbioru (jeżeli wskazany zbiór nie istnieje, zostanie utworzony): W <tytuł_zbioru>. Wyjście z edytora następuje po wprowadzeniu zlecenia Q. Wyprowadzenie zbioru i wyjście z edycji można wykonać jednym zleceniem WQ [<tytuł_zbioru>].

Po wprowadzeniu zleceń Q i WQ edytor przechodzi do OSL-a bez żadnego komunikatu i zostaje usunięty. Przed usunięciem edytora stan poprawianego zbioru jest zapisywany w zbiorach roboczych EXMLIN oraz EXMOPI. Ponownie wywołany edytor bez podanego tytułu zbioru wznowi poprawianie zbioru dokładnie w miejscu, w którym zostało ono przerwane. Przerwanie pracy edytora następuje także po wprowadzeniu znacznika końca zbioru - dc4. Edytor przechodzi do OSL-a z komunikatem FINISH. Wznowienie wykonania następuje zleceniem OSL-a RS.

Adresacja wierszy

Po wczytaniu zbioru wskaźnik dostępu do bufora roboczego jest ustawiany na pierwszy wiersz (bieżący wiersz jest wyświetlany na końcówce). Najprostszym sposobem zmiany położenia wskaźnika dostępu (zmiany wiersza bieżącego) jest podanie numeru bezwzględnego wiersza w buforze. Numer wiersza jest to liczba całkowita bez znaku. Pierwszy wiersz bufora roboczego ma numer 1, ostatni jest wskazywany znakiem $. Przykładowo zlecenie 126 ustawi wskaźnik do bufora roboczego na wiersz o numerze 126. Po wykonaniu tego zlecenia zawartość wiersza zostanie wyświetlona na monitorze. Podanie numeru wykraczającego poza liczbę wierszy w buforze jest sygnalizowane komunikatem:

LINE OUT OF FILE

a wiersz bieżący nie ulega zmianie. Wprowadzenie znaku + (plus) lub samego znaku RETURN powoduje przesunięcie wskaźnika dostępu na następny wiersz. Cofanie o jeden wiersz jest realizowane po wprowadzeniu znaku - (minus). Znaki + i - mogą być użyte w jednym zleceniu wielokrotnie. Zapis: ++++ oznacza przesunięcie wskaźnika dostępu do bufora o 4 wiersze do przodu. Zamiast ciągu znaków + (plus) lub - (minus) można wprowadzić liczbę całkowitą ze znakiem. Zlecenie +5 przesuwa wskaźnik dostępu o 5 wierszy do przodu a zlecenie -2 o 2 do tyłu.

Kolejnym, chyba najczęściej stosowanym, sposobem wskazywania wierszy jest podanie wzorca zawartości wiersza. Wzorzec jest to ciąg znaków określających zawartość szukanego wiersza. Wzorzec musi być objęty nawiasami /.../ lub ?...?. Jeżeli będą to znaki / np: /start/, to zbiór będzie przeszukiwany od wiersza bieżącego do przodu. Objęcie wzorca znakami ? oznacza poszukiwanie od wiersza bieżącego do tyłu. Jeżeli wiersz nie zostanie znaleziony do końca (lub początku) bufora roboczego, zostanie wyprowadzony komunikat:

PATTERN NOT FOUND : /<wzorzec>/

Wiersz bieżący w takim przypadku nie ulega zmianie.

Wzorzec może zawierać ciąg znaków, które występują w szukanym wierszu oraz znaki specjalne ^ i $ oznaczające miejsce wystąpienie podanego ciągu. Znak ^ rozpoczynający wzorzec, na przykład: /^aaa/ oznacza, że podany za nim ciąg znaków ma rozpoczynać wiersz, zaś znak $ kończący wzorzec, na przykład: /aaa$/ oznacza, że podany ciąg ma kończyć wiersz. Zgodnie z powyższym zlecenie /^as$/ znajdzie najbliższe wystąpienie wiersza zawierającego dokładnie (i tylko) dwa znaki: as. Do zapisania we wzorcu znaku ograniczającego wzorzec lub znaków specjalnych służy znak \ (backslash), którym należy poprzedzić dany znak. Na przykład, aby znaleźć wiersz zawierający ciąg ^as/ należy wprowadzić zlecenie: /\^as\//. Aby podać we wzorcu znak \, należy go zapisać za pomocą dwóch znaków: \\. Jeżeli znak ograniczający wzorzec z prawej strony jest ostatnim znakiem w zleceniu, może być pominięty - poprawne jest zlecenie /aa. Brak wzorca między znakami ograniczającymi: // lub ?? oznacza, że ma być przyjęty wzorzec użyty w ostatnio wykonywanej operacji przeszukiwania. Poprawne są zlecenia zawierające tylko jeden znak: / lub ? i oznaczają szukanie następnego wiersza zgodnego z ostatnio użytym wzorcem.

Wyrażenia adresowe

Elementy opisane w poprzednim rozdziale mogą być użyte w zleceniach w dowolnej ilości i kombinacji tworząc wyrażenia adresowe. Niedozwolone jest tylko podanie numeru bezwzględnego wiersza jako nie pierwszego elementu. Wiersz wskazany przez kolejny element staje się wierszem bieżącym i od niego jest szukany następny. Oto przykłady najczęściej stosowanych wyrażeń:

  • $- - wskazanie przedostatniego wiersza w buforze.
  • /^stop/+3 - wskazanie trzeciego wiersza za wierszem rozpoczynającym się od ciągu stop.
  • /a=1// - znalezienie drugiego wystąpienia ciągu a=1.
  • $?bufor - znalezienie ostatniego wystąpienia ciągu bufor.

Jeżeli operacja szukania wiersza według wzorca jest podana jako kolejna w zleceniu, jest ona kończona, gdy zostanie znaleziony wiersz zgodny ze wzorcem lub gdy zostanie osiągnięty wiersz dostępny w momencie wprowadzania zlecenia. Po wprowadzeniu zlecenia /x=y bufor roboczy zostanie przeszukany od wiersza bieżącego do końca. Natomiast zlecenie: -10/x=y przeszuka obszar od dziesiątego wiersza przed bieżącym do wiersza bieżącego (dostępnego w momencie wprowadzania zlecenia). Zlecenie $?x=y znajdzie ostatnie wystąpienie w buforze ciągu x=y, o ile wiersz zawierający ten ciąg leży za wierszem bieżącym.

Usuwanie i wstawianie nowych wierszy

Wiersz bieżący można usunąć zleceniem D. Po wykonaniu tego zlecenia wierszem bieżącym staje się wiersz następny. Wyjątkowo po usunięciu ostatniego wiersza w buforze, bieżącym staje się wiersz poprzedni.

Do wstawiania nowych wierszy najczęściej jest używana instrukcja A. Po wprowadzeniu tej instrukcji edytor zgłasza się na początku nowej linii i przyjmuje kolejne wiersze. Nowe wiersze są wprowadzane za wierszem bieżącym. Wprowadzanie kończy wpisanie wiersza zawierającego dc4 (CRTL/T) - wiersz ten nie zostanie już wprowadzony do bufora. Po wykonaniu instrukcji bieżącym wierszem jest ostatni wprowadzony wiersz.

Inne instrukcje służące do wprowadzania wierszy: I - wprowadzanie wierszy przed wierszem bieżącym, oraz C - wprowadzanie wierszy w miejsce wiersza bieżącego działają podobnie jak instrukcja A. Instrukcja C jest równoważna użyciu dwóch instrukcji: D I z tą jednak różnicą,że po wykonaniu instrukcji I wierszem bieżącym pozostanie wiersz dostępny przed wykonaniem zlecenia I, natomiast po wykonaniu instrukcji C wierszem bieżącym będzie ostatni wprowadzony wiersz. Jeżeli wstawiany ma być tylko jeden wiersz, można użyć instrukcji A, I lub C w uproszczonej postaci - po nazwie instrukcji należy wprowadzić znak lf (LINE FEED) i za nim treść wiersza zakończoną znakiem cr (RETURN). Na przykład:

A
a=5
dc4

można wprowadzić krócej:

Alf
a=5

W skróconym zleceniu A można pominąć także nazwę zlecenia i wprowadzić tylko:

lf
a=5

Symbole lf i dc4 w powyższych przykładach oznaczają znaki o kodach odpowiednio 012 i 024.

Adres wiersza w zleceniu

Dotychczas były pokazane przykłady działania na wierszu bieżącym. Chcąc usunąć wiersz zawierający ciąg text1 można wprowadzić dwa zlecenia: /text1 D. Taki sam efekt da wprowadzenie jednego zlecenia: /text1/D. Podobnie inne instrukcje edytora mogą być poprzedzone w zleceniach adresem wiersza. Zlecenie: $A będzie dołączało nowe wiersze na końcu bufora roboczego.

Cofanie wykonanych poprawek

Jeżeli zmiana w poprawianym buforze została wykonana inaczej niż było to zamierzone, można ją cofnąć wprowadzając zlecenie U. Zlecenie to przywraca stan bufora sprzed wykonania poprawki: wiersze usunięte (np zleceniem D) są z powrotem wstawiane, a wiersze wstawione (np zleceniami A, I) - usuwane. Wierszem bieżącym po wykonaniu zlecenia U jest wiersz, który był dostępny przed wykonaniem poprawki w buforze. Wykonanie kolejnego zlecenia U przywraca cofniętą poprawkę. Działanie zlecenia U po innych zleceniach będzie omówione przy opisie tych zleceń.

Opis obszaru

Wiele instrukcji EXM może działać na więcej niż jednym wierszu. Aby na przykład zamienić kilka wierszy na nowe wprowadzone z klawiatury, należy poprzedzić instrukcję C opisem usuwanego obszaru.

Pierwszym sposobem opisania obszaru jest podanie adresu początkowego wiersza obszaru i liczby wierszy. Opis 10:2 obejmuje obszar rozpoczynający się od wiersza 10 i długości 2 wierszy. Pominięty adres pierwszego wiersza oznacza, że obszar rozpoczyna się od wiersza bieżącego. Zlecenie :3C zamieni wiersz bieżący i dwa następne na wiersze wprowadzane z końcówki. Drugim sposobem opisania obszaru jest wskazanie pierwszego i ostatniego wiersza obszaru. 1,$ oznacza obszar od pierwszego do ostatniego wiersza (czyli cały bufor roboczy). I tu pominięcie opisu któregoś z wierszy oznacza wiersz bieżący. Opis 1, oznacza obszar od początku bufora roboczego do wiersza bieżącego. Jeżeli adresy wierszy opisujących obszar nie są numerami bezwzględnymi wierszy w buforze, obliczanie ich wartości rozpoczyna się od wiersza dostępnego w momencie wprowadzania zlecenia. Na przykład, jeżeli dostępny jest wiersz o numerze 50, definicja 40,+5 wskazuje obszar od wiersza 40 do wiersza 55 włącznie. Inaczej będzie, gdy separatorem między adresami wierszy będzie nie przecinek ale średnik. W tym przypadku podstawą do wyliczenia drugiego parametru będzie już znany adres pierwszego wiersza obszaru. Opis 40;+5 obejmie wiersze 40 do 45 włącznie. Należy tu zauważyć, że definicja 40:5 obejmie wiersze 40 do 44.

Znaczniki wierszy

Poza podanymi wcześniej, istnieje jeszcze jeden sposób wskazania w zleceniach żądanego wiersza - przy pomocy znaczników wierszy. Instrukcja M <litera> definiuje znacznik wiersza, nazwany wskazaną literą i przywiązuje doń bieżący wiersz. Podanie następnie w dowolnym zleceniu znacznika w postaci '<litera> jest równoważne podaniu bezwzględnego numeru wiersza. Znacznik traci swoje dotychczasowe przywiązanie, gdy zostanie na nowo zdefiniowany zleceniem M, lub gdy wiersz, z którym był związany zostanie usunięty z bufora roboczego. Do wyświetlania definicji znaczników na monitorze służy bezparametrowe zlecenie '. Definicje są wyświetlane w postaci:

<nazwa_znacznika> <numer_wiersza> <treść_wiersza>

Wyświetlanie zawartości bufora roboczego

Po każdej zmianie położenia wskaźnika dostępu na ekranie jest wyświetlany nowy wiersz bieżący. Wyprowadzane wiersze są poprzedzane swoim bieżącym numerem w buforze. Aby wyprowadzić na monitor większy obszar należy podać opis tego obszaru. Zlecenie ,/^stop wyprowadzi na monitor wiersze od bieżącego począwszy do rozpoczynającego się ciągiem stop. Wszystkie znaki o kodzie 1..26 są wyświetlane jako dwa znaki:

 ^<litera>

(przykładowo ^I oznacza znak tabulacji ht). Inne znaki nie wyświetlane są wyprowadzane jako spacje. Jeżeli w zleceniu listowania zostanie podana instrukcja P: ,/^stop/P to wszystkie znaki kontrolne będą wyprowadzane jako spacje. Po wyprowadzeniu wskazanego obszaru wierszem bieżącym jest ostatni wyświetlony wiersz. Nieco inaczej działa inna instrukcja listująca Z. Powoduje ona wyprowadzenie na monitor obszaru o długości 7 wierszy. Wiersz bieżący jest wyprowadzany w środku (jako czwarty). Zlecenie to ma jeszcze trzy warianty:

  • Z+ - wiersz bieżący wyprowadzany jest jako pierwszy
  • Z- - wiersz bieżący wyprowadzany jest jako ostatni
  • Z= - wiersz bieżący jest wyprowadzany w środku i jest objęty dwoma wierszami zawierającymi ciągi znaków -----.

Instrukcja Z nie zmienia wiersza bieżącego. Może być poprzedzona adresem wiersza (stanie się on wierszem bieżącym).

Zmiana zawartości wiersza

Jedną z najużyteczniejszych instrukcji jest instrukcja podstawienia zmieniająca zawartość wiersza. W najprostszej postaci zamienia ona wskazany łańcuch znaków na inny. Wiersz:

a=x1+2

po wykonaniu instrukcji podstawiania S/x1/y będzie wyglądał:

a=y+2

Łańcuch zawarty między znakami / może zawierać znaki specjalne ^ i $ tworząc wzorzec o takiej samej budowie jak opisany wcześniej wzorzec zawartości wiersza. Łańcuch zgodny ze wzorcem jest zamieniany na podany łańcuch. I tak zlecenie S/a$/bb zamieni znak a kończący wiersz na znaki bb. Zlecenie S/^/<łańcuch> dołączy podany łańcuch na początku wiersza, a zlecenie S/$/<łańcuch> - na końcu. Znak lf we wstawianym łańcuchu powoduje podzielenie wiersza na dwa. Na przykład wiersz:

LWT,R1,0. RW,A(BUF3)

po wykonaniu instrukcji S/./.lf zostanie podzielony na dwa:

LWT,R1,0.
RW,A(BUF3)

Wierszem bieżącym po podzieleniu jest ostatni z wierszy utworzonych w ten sposób.

Jeżeli w zleceniu zostanie podany opis obszaru, przykładowo: 1,$S/tekst/text, to zlecenie zostanie wykonane na wszystkich wskazanych wierszach (w powyższym przykładzie na wszystkich wierszach bufora roboczego). Wiersze zawierające podany wzorzec będą wyświetlone na monitorze w poprawionej postaci. Po wykonaniu zlecenia bieżącym wierszem staje się ostatni wiersz, w którym była dokonana zmiana. Instrukcja U wykonana po zleceniu S cofa wszystkie zmiany wykonane tym zleceniem.

W podanych przykładach podstawienia były wykonywane tylko na pierwszych łańcuchach zgodnych ze wzorcem. Podanie za łańcuchem wstawianym znaku G oznacza, że wszystkie zgodne ze wzorcem łańcuchy w wierszu mają być zamienione:

a=x1+a

po wykonaniu polecenia S/a/b/G:

b=x1+b

Zamianę dowolnego łańcucha zgodnego ze wzorcem umożliwiają bardziej złożone schematy podstawienia:

a3=x1+a2-a+ab

po wykonaniu polecenia S/a/b/--+:

a3=x1+a2-b+ab

Znak - podany po znaku / ograniczającym łańcuch wstawiany oznacza, że kolejny łańcuch ma pozostać bez zmian, znak + oznacza wykonanie podstawienia. Zamiast ciągu znaków + lub - można podawać liczby odpowiednio dodatnie lub ujemne. Zlecenie z ostatniego przykładu można zapisać także: S/a/b/-2+1 lub S/a/b/-2 1 Podanie po ciągu znaków +, - znaku G oznacza wykonanie podstawienia dla wszystkich pozostałych łańcuchów zgodnych ze wzorcem:

a3=x1+a2+a+a

po wykonaniu polecenia S/a/b/--G:

a3=x1+a2+b+b

Użycie znaku & zamiast schematu podstawienia oznacza przyjęcie schematu podstawienia użytego w ostatnim zleceniu podstawienia. Jeżeli schemat podstawienia zostanie zakończony znakiem ?, wszystkie wskazane podstawienia będą wykonane dopiero po akceptacji. Oto przykład:

aa3=x1+aa2+aa+ab
S/aa/b/-G?
aa3=x1+aa2+aa+ab
^^-
aa3=x1+aa2+aa+ab
^^+
aa3=x1+aa2+b+ab

Po znalezieniu wskazanego ciągu, edytor wyświetla na monitorze wiersz i w linii poniżej wyprowadza ciąg znaków ^^..^ podkreślających łańcuch zgodny z podanym wzorcem. Zamiana wskazanego łańcucha i dalsze działanie edytora są zależne od wprowadzonego znaku akceptacji:

  • - - podstawienie nie jest wykonywane
  • + - podstawienie jest wykonywane
  • G - wykonywane jest podstawienie tego i wszystkich pozostałych łańcuchów w wierszu zgodnych ze wzorcem
  • cr - podstawienie nie jest wykonywane i dalsza część wiersza nie jest analizowana
  • dc4 - podobnie jak cr kończy analizę wiersza. Jeżeli zlecenie podstawienia dotyczyło więcej niż jednego wiersza, dalsze wiersze nie będą analizowane.

Instrukcja S ma jeszcze specjalne warianty:

  • S//<łańcuch> - zamiana ciągu znaków określonych przez wzorzec użyty w ostatnio wykonanej operacji przeszukiwania bufora na podany w zleceniu.
  • & - ponowne wykonanie ostatniej instrukcji S.
  • &/<łańcuch> - zamiana łańcucha wskazanego przez wzorzec użyty w ostatnio wykonanej instrukcji podstawienia na podany łańcuch.
  • ~ - zamiana ciągu znaków wskazanych przez wzorzec użyty w ostatnio wykonanej operacji szukania wiersza na taki sam ciąg znaków, jak w ostatnio wykonanym zleceniu S.
  • ~/<łańcuch> - ta postać jest równoważna nieco dłuższej, już opisanej S//<łańcuch> - wykonanie podstawienia odwrotnego niż w podstawienia - łańcuch wstawiony w ostatnim zleceniu jest zamieniany na łańcuch usunięty w tym zleceniu (działanie tego zlecenia wcale nie musi być równoważne działaniu zlecenia U)
  • %/<łańcuch> - powyższe zlecenie zamieni łańcuch wstawiony w ostatnim zleceniu podstawienia na podany łańcuch.

Wszystkie podane wyżej warianty mogą być uzupełnione opisem obszaru i schematem podstawienia. Oto przykłady poprawnych zleceń:

  • +,$&G? - na wszystkich wierszach od następnego do końca bufora zostanie wykonane ostatnio wykonane podstawienie. Zamienione zostaną wszystkie łańcuchy zgodne ze wzorcem ale dopiero po akceptacji.
  • &/ak1/-+ - w wierszu bieżącym łańcuch zgodny ze wzorcem określonym przez ostatnio wykonane zlecenie podstawienia zostanie zamieniony na podany łańcuch. Podstawienie zostanie wykonane na drugim łańcuchu zgodnym ze wzorcem.
  • 1:10% - na dziesięciu pierwszych wierszach bufora zostanie wykonane podstawienie odwrotne do ostatnio wykonanego podstawienia.

Łączenie wierszy

Do łączenia wierszy służy instrukcja J. Zlecenie JJ połączy bieżący wiersz z następnym. Jeżeli w zleceniu opisany jest obszar obejmujący więcej niż jeden wiersz, to połączone zostaną wszystkie wskazane wiersze. Należy zwrócić tu uwagę, że zlecenia w postaci J, :1J, :2J,+1J są równoważne sobie i powodują połączenie bieżącego wiersza z następnym (zlecenia inne działające na wielu wierszach np D:, 1D, :2D,+1D nie są sobie równoważne, gdyż dwa pierwsze dotyczą wiersza bieżącego, a pozostałe wiersza bieżącego i następnego).

Wierszem bieżącym po wykonaniu instrukcji jest nowo utworzony wiersz. Zlecenie J może być uzupełnione dodatkowymi parametrami oznaczającymi, że z wierszy dołączanych będą usuwane wszystkie spacje i znaki tabulacji rozpoczynające te wiersze: J^ oraz, że przed każdym dołączonym wierszem zostanie wstawiony wskazany łańcuch: J/<łańcuch>. Oba parametry można użyć razem: J^/*. Powyższy przykład oznacza usunięcie z dołączanego wiersza prowadzących spacji i znaków tabulacji oraz wstawienie między połączone wiersze znaku *.

Wprowadzanie zawartości innych zbiorów

Do wprowadzania do poprawianego bufora roboczego zawartości innych zbiorów służą dwie instrukcje:

  • RA <tytuł_zbioru> - wczytanie wskazanego zbioru za wierszem bieżącym
  • RI <tytuł_zbioru> - wczytanie zbioru przed wierszem bieżącym.

Instrukcje przenoszenia i kopiowania

Instrukcje tej grupy służą do kopiowania lub przenoszenia fragmentów bufora roboczego w inne miejsce bufora, a także między poprawianym buforem a buforami pomocniczymi. Przy przenoszeniu wierszy wewnątrz bufora roboczego zlecenie ma następującą postać: [<opis_obszaru>] <instrukcja> [<adres_wiersza>]

Tak jak dla wcześniej opisanych instrukcji, pusty parametr oznacza wiersz bieżący. Instrukcje są następujące:

  • MA - przeniesienie obszaru za wskazany wiersz
  • MI - przeniesienie obszaru przed wskazany wiersz
  • CA - skopiowanie obszaru za wskazany wiersz
  • CI - skopiowanie obszaru przed wskazany wiersz

Po wykonaniu zlecenia wierszem bieżącym staje się ostatni przeniesiony lub skopiowany wiersz (instrukcje MA, CA) lub wiersz wskazany po prawej stronie zlecenia (przy instrukcjach CI, MI). Obszar bufora roboczego może być kopiowany lub przenoszony także między buforem roboczym a buforami pomocniczymi znajdującymi się poza poprawianym buforem. Jest 26 buforów nazwanych pojedynczymi literami A..Z oraz jeden specjalny bufor pomocniczy bez nazwy. Przenoszenie wierszy do buforów pomocniczych jest wykonywane zleceniem D. Zlecenie to wykonane w postaci podanej wcześniej w opisie usunie wskazane wiersze z bufora roboczego i przeniesie je do specjalnego bufora pomocniczego. Podanie zlecenia D z parametrem np: D B przeniesie wskazane wiersze (tu tylko wiersz bieżący) do wskazanego bufora. Kopiowanie wierszy do buforów pomocniczych jest wykonywane zleceniem Y. I tu można podać nazwę bufora, do którego mają być skopiowane wskazane wiersze. Gdy nazwa bufora nie zostanie podana, buforem tym będzie specjalny bufor pomocniczy. Kopiowanie zawartości buforów pomocniczych do bufora roboczego jest wykonywane zleceniami PA i PI. Kopiują one zawartość wskazanego bufora odpowiednio za (PA) lub przed (PI) wierszem bieżącym. Jeżeli nazwa bufora nie zostanie podana, kopiowany będzie specjalny bufor pomocniczy. Zlecenia: 20:5 Y A 30 PA A są równoważne zleceniu 20:5 CA 30 z tą jednak różnicą, że w buforze A są zachowane wiersze 20-24 i można je skopiować jeszcze raz (lub dowolnie wiele razy) w inne miejsce bufora roboczego. Bezparametrowe zlecenie " wyświetla na monitorze informacje o zawartości buforów w postaci:

<nazwa_bufora> <liczba_wierszy_w_buforze>

Zawartość bufora specjalnego jest zmieniana nie tylko przez zlecenia D i Y, ale także przez zlecenie C oraz zlecenie U wykonane po zleceniach I, A, C, RA i RI. Do bufora specjalnego są przenoszone wiersze usunięte tymi zleceniami.

Wyprowadzanie bufora roboczego do zbioru

Do wyprowadzania aktualnie poprawianego bufora służy opisane już wcześniej zlecenie W <tytuł_zbioru>. Zlecenie w powyższej postaci wyprowadza do wskazanego zbioru cały bufor roboczy. W poprzedzone opisem obszaru wyprowadza do zbioru tylko wskazane wiersze. Zlecenie 10,20 W ROB wyprowadzi do zbioru ROB tylko wiersze od 10 do 20 włącznie. Wyprowadzane wiersze będą dołączane do istniejącego zbioru, jeżeli tytuł zbioru zostanie poprzedzona znakiem >: W >ROB. Brak opisu obszaru w zleceniu W nie oznacza, jak dla innych zleceń wiersza bieżącego ale cały zbiór. Wiersz bieżący (i tylko ten jeden wiersz) można wskazać znakiem kropki. Zlecenie .W >ROB dołączy do zbioru ROB tylko wiersz bieżący. Nie podanie nazwy zbioru w zleceniu W oznacza wyprowadzenie wskazanych wierszy do tego samego zbioru, który został uprzednio wczytany do bufora roboczego (tytuł zbioru wczytanego do bufora jest parametrem domyślnym zlecenia W). Wyprowadzenie wierszy do innego zbioru można uzyskać podając nazwę zbioru w zleceniu W (tak jak pokazano wcześniej) lub zmieniając parametr domyślny tego zlecenia instrukcją F <tytuł_zbioru>. Zlecenie F bez podanej nazwy zbioru wyprowadza informacje o poprawianym buforze roboczym w postaci:

E: <numer_bufora> <tytuł_zbioru> <liczba_wierszy>

Numer bufora jest to numer poprawianego zbioru. Gdy poprawiany jest jeden zbiór numer ten jest równy 0.

Edycja wielu zbiorów

EXM umożliwia wykonywanie edycji wielu zbiorów jednocześnie. Jest to wygodne przy przenoszeniu fragmentów jednego zbioru do innego zbioru. Zlecenie N <tytuł_zbioru> wczytuje do kolejnego bufora roboczego wskazany zbiór i edytor przechodzi do edycji tego bufora. Poprawiany do tej pory bufor jest zachowywany w zbiorze roboczym. Buforom tworzonym zleceniem N są nadawane kolejne numery od 1 do 9 (bufor utworzony przy wywołaniu edytora ma numer 0). Po wczytaniu zbioru na monitor są wyprowadzane informacje o zbiorze w takiej postaci jak zleceniem F. Jeżeli zbiór wskazany zleceniem N nie istnieje, na monitor jest wyprowadzany komunikat:

*** NEW FILE ***

i edytor przechodzi do wczytywania wierszy z końcówki (jest wykonywane niejawne zlecenie A). Po wprowadzeniu pustego zbioru (dc4 w pierwszym wierszu) edytor wyprowadza komunikat:

EMPTY FILE

i powraca do edycji bufora dotychczas poprawianego. Powrót do edycji bufora wcześniej utworzonego i poprawianego następuje po wprowadzeniu zlecenia E w jednej z poniższych postaci:

  • E <tytuł_zbioru>
  • E <numer_bufora>
  • E-

Zlecenie E w ostatniej postaci odtwarza bufor, który był poprawiany przed wykonaniem ostatniego zlecenia N lub E. Zlecenie E odtwarza wskaźnik dostępu do bufora i znaczniki wierszy użyte w czasie edycji tego bufora. Informacje o wszystkich buforach roboczych są drukowane zleceniem FA w postaci podobnej jak zleceniem F. W pierwszym wierszu wyprowadzany jest opis bufora aktualnie poprawianego (poprzedzony znakami E:), w następnych - pozostałych buforów. Opis bufora poprzednio poprawianego (dostępnego zleceniem E-) jest poprzedzony znakiem -. Oto przykładowa sekwencja wyżej opisanych zleceń:

EXM FILA - wywołanie edytora
E: 0 FILA 89 - opis wczytanego zbioru
... - edycja bufora FILA
N NEWFIL - wczytanie kolejnego zbioru
E: 1 NEWFIL 255 - opis wczytanego zbioru
... - edycja bufora NEWFIL
E- - powrót do poprzedniego bufora
E: 0 FILA 100 - opis bufora
... - edycja bufora FILA
FA - listowanie opisu buforów
E: 0 FILA 101 - opis bufora poprawianego
- 1 NEWFIL 213 - opis bufora poprzednio poprawianego 

EXM pozwala także na poprawianie zawartości buforów pomocniczych A..Z. W zleceniu E należy wskazać nazwę bufora pomocniczego E "A. Edycja buforów pomocniczych niczym nie różni się od edycji buforów roboczych, z tym, że niedozwolone jest użycie w zleceniach kopiowania i przenoszenia nazwy poprawianego bufora pomocniczego. Ponadto zlecenie W wprowadzane w czasie edycji bufora pomocniczego musi zawierać nazwę zbioru (niedozwolone jest także ustawianie parametru domyślnego tego zlecenia zleceniem F). Po zakończeniu edycji bufora pomocniczego i przejściu do edycji innego bufora nie jest zapamiętywany wskaźnik dostępu ani znaczniki wierszy.

Opcje

Pewne działania edytora można zmienić ustawiając różne opcje. Zlecenie SET <lista_opcji> ustawia wskazane opcje. Lista opcji jest to ciąg nazw opcji rozdzielonych spacjami. Niektórym opcjom można nadawać różne wartości - po nazwie opcji należy podać znak = i ustawianą wartość. Przykład ustawienia opcji: SET WS LIN=15.

Pierwsza z opcji pokazanych w przykładzie - 'wrapscan' (ustawiana WS/gaszona NWS) jest istotna przy wykonywaniu operacji szukania wiersza według wzorca: gdy wskazany wzorzec nie zostanie znaleziony do końca (lub początku - przy szukaniu do tyłu) bufora roboczego, przeszukany będzie jeszcze obszar od początku (lub końca) bufora roboczego do wiersza bieżącego. Gdy opcja 'wrapscan' jest zgaszona, nie znalezienie wzorca do końca (lub początku - przy przeszukiwaniu do tyłu) bufora roboczego kończy szukanie.

Dużą grupę opcji stanowią opcje listowania. Opcja 'autoprint' (AP/NAP) oznacza wyświetlanie bieżącego wiersza po wykonaniu każdego zlecenia. Gdy opcja 'autoprint' jest zgaszona, wiersze są wyświetlane tylko zleceniami zawierającymi instrukcje P, L lub #. Instrukcje P i L różnią się sposobem wyprowadzania znaków kontrolnych (o kodach 1 do 26). Instrukcja P zamienia je na spacje, L - wyprowadza za pomocą dwóch znaków: ^<litera>. Przy ustawionej opcji 'autoprint' sposób wyświetlania znaków kontrolnych ustala opcja 'listcontrol' (LC/NLC). Gdy jest zapalona, znaki kontrolne są wyprowadzane tak jak instrukcją L, w przeciwnym razie - tak jak instrukcją P. Ostatnia opcja listowania: 'number' (NU/NNU) oznacza listowanie wierszy z numeracją w buforze. Każdy wyprowadzany wiersz jest poprzedzany numerem zajmującym pole 5 znaków (lewostronnie uzupełnionym spacjami) i jedną spacją separującą numer od zawartości wiersza. Gdy opcja jest zgaszona (NNU), wiersze są wyprowadzane bez numeracji.

Kolejna opcja: 'clear' (CL/NCL) dotyczy wierszy wprowadzanych do obszaru roboczego (zleceniami RA, RI, I, A, C, S). Gdy jest ustawiona, ze wszystkich wprowadzanych wierszy są usuwane wszystkie znaki kontrolne oprócz lf(012) ht (011) i ff (014). Znaki kontrolne z wiersza bieżącego (lub ze wskazanych wierszy) można usunąć instrukcją CL działającą niezależnie od opcji 'clear'. Drugą opcją dotyczącą wierszy wprowadzanych (działa na te same wiersze co opcja 'clear') jest opcja 'lowtoupper' (LU/NLU). Gdy jest ustawiona, wszystkie małe litery są zamieniane na duże. Litery małe na duże można zamienić w wierszu bieżącym lub we wskazanych wierszach zleceniem LU działającym niezależnie od opcji 'lowtoupper'.

Dwie dalsze opcje: 'lenghtline'(LEN/NLE) i 'linenumber' (LIN/NLI) formatują listowane obszary bufora na ekranie monitora. Zapalona opcja 'lenghtline' oznacza,że wyprowadzane wiersze mają być dzielone na linie o co najwyżej ustalonej długości. Opcja 'linenumber' steruje wydrukiem większych obszarów. Jeżeli jest zapalona, to po zapełnieniu ekranu wydruk jest zatrzymywany. Wznowienie wydruku następuje po wprowadzeniu cr. Wprowadzenie dc4 kończy wydruk - wierszem bieżącym jest ostatni wyprowadzony wiersz. Opcje 'linenumber' i 'lenghtline' działają także przy wykonywaniu zlecenia S, gdy zmieniane wiersze są wyświetlane na ekranie. Po zapełnieniu ekranu wykonywanie zlecenia jest zatrzymywane. wprowadzenie cr wznawia wykonanie, zaś dc4 kończy wykonanie zlecenia( pozostałe wiersze nie są analizowane). Obu opcjom można nadawać dowolne wartości. Ustawienie: SET LEN=40 LIN=18 oznacza skrócenie wyprowadzanych linii do 40 znaków (dłuższe wiersze są dzielone na linie o tej długości) i zatrzymywanie listingu po wyprowadzeniu 18 wierszy. Jeżeli opcje te zostaną zgaszone: SET NLE NLI, to ponowne ich ustawienie: SET LEN LIN przywróci opcjom wartości jakie miały przed zgaszeniem. Po wywołaniu edytora stan powyższych opcji jest taki jak po wykonaniu zlecenia: SET NWS AP NU LC NCL NLU LIN=22 LEN=80

Opis ścisły

Wstęp

Druga część zawiera ścisły opis edytora. Zapis w tej części jest częściowo sformalizowany. Używane są następujące elementy:

  • <...> - metasymbole
  • ::= - definicja
  • [...] - opcja
  • {...} - iteracja (może być pusta)
  • ..._... - alternatywa

Znaki wytłuszczone oznaczają siebie. Bez definicji są podane metasymbole:

  • <litera> - znaki A..Z lub a..z
  • <liczba> - liczba całkowita dziesiętna bez znaku
  • <tytuł_zbioru> - nazwa o składni takiej samej jak tytuł zbioru w OSL-u.
  • <łańcuch> - ciąg dowolnych znaków oprócz cr i dc4 (może być pusty)

Są używane także symbole oznaczające niektóre znaki kontrolne:

  • cr - RETURN (CRTL/M) - koniec zlecenia lub wiersza
  • lf - LINE FEED (CTRL/J) - początek nowej linii
  • ht - TAB (CRTL/I) - tabulacja
  • ff - FORM FEED (CRTL/L) - znacznik nowej strony
  • vt - VTAB (CTRL/K)
  • dc4 (CRTL/T) - znacznik końca zbioru

Wywołanie edytora

Składnia: EXM [ <tytuł_zbioru> [ , <tytuł_zbioru_zleceń> ]]

<tytuł_zbioru> - tytuł poprawianego zbioru.

Jeżeli wskazany zbiór istnieje, jest wczytywany do bufora roboczego. Bufor otrzymuje numer 0 i nazwę zgodną z tytułem wczytanego zbioru. Na monitor jest wyprowadzany komunikat:

E: 0 <tytuł_zbioru> <liczba_wierszy>

Wskaźnik dostępu jest ustawiany na pierwszy wiersz bufora. Długość czytanego zbioru jest określona parametrami PA1 i PA2. Jeżeli wartość tych parametrów wykracza poza dopuszczalny zakres (lub jest niezgodna z parametrem LEN), sygnalizowany jest zły typ zbioru wejściowego i edytor jest usuwany. Jeżeli parametry PA1 i PA2 zbioru mają wartość 0, długość czytanego zbioru jest wyliczana z parametru LEN.

Jeżeli zbiór o podanym tytule nie istnieje, wyprowadzany jest komunikat:

*** NEW FILE ***

i edytor przechodzi do wczytywania wierszy z końcówki - wykonywane jest niejawne zlecenie A. Po wpisaniu wiersza zawierającego dc4 edytor kończy wprowadzanie i rozpoczyna edycję bufora. Wprowadzenie pustego zbioru (dc4 w pierwszym wierszu) powoduje usunięcie edytora z komunikatem:

EMPTY FILE

Po przejściu do edycji zapisanego bufora wskaźnik dostępu jest ustawiany na ostatni wprowadzony wiersz. Bufor roboczy otrzymuje numer 0 i nazwę podaną w wywołaniu.

W obu powyższych przypadkach jeżeli dostępny jest zbiór o nazwie EXMINI, to przed wczytanie poprawianego zbioru do bufora roboczego są wykonywane zlecenia zapisane w zbiorze EXMINI. Dozwolone jest wykonanie wyłącznie zleceń ustawiających lub listujących zmienne generacyjne i opcje, zleceń komentarzy oraz zlecenia INT. Wystąpienie w zbiorze EXMINI (lub innym wywołanym zleceniem INT) innego zlecenia spowoduje usunięcie edytora z sygnalizacją błędu.

Jeżeli nie jest podany tytuł zbioru, a istnieją zbiory EXMLIN i EXMOPI zawierające bufory robocze poprawiane w poprzedniej sesji edytora, EXM odtwarza ostatni zapamiętany stan edycji i wznawia poprawianie. Poprawiany bufor roboczy, wskaźnik dostępu, znaczniki wierszy, definicje zmiennych generacyjnych i opcje edycji są takie same jakie zostały zapamiętane w ostatniej edycji.

<tytuł_zbioru_zleceń>

Jeżeli tytuł zbioru zleceń jest podany, to po wczytaniu poprawianego zbioru do bufora roboczego będą wykonane zlecenia zapisane we wskazanym zbiorze. Po wykonaniu wszystkich zleceń ze zbioru zleceń lub po wykryciu błędnego zlecenia edytor przechodzi do pracy w trybie konwersacyjnym. Jeżeli wykonywanie zleceń zostało przerwane po wykryciu błędnego zlecenia, wykonanie pozostałych zleceń ze zbioru można wznowić zleceniem INT.

Zakończenie pracy edytora

Składnia: Q [!]

Działanie: edytor jest usuwany. Jeżeli po wykonaniu ostatniej poprawki nie było wykonane zlecenie W, należy podać parametr !. Inaczej edytor wyprowadzi na monitor tekst:

NO WRITE AFTER LAST CHANGE : <zlecenie> ( ! OR CR) ?

Po znaku zapytania należy wprowadzić znak ! - zlecenie zostanie wykonane, lub cr (return) - zlecenie nie będzie wykonane. Przed usunięciem stan edycji jest zapamiętywany w zbiorach roboczych EXMLIN i EXMOPI. Zachowywane są następujące elementy:

  • bufory robocze
  • bufory pomocnicze
  • nazwa aktualnie poprawianego bufora
  • wskaźniki dostępu do buforów roboczych
  • znaczniki wierszy użyte w czasie edycji buforów roboczych
  • stan opcji
  • wartość zmiennych generacyjnych

Ponowne wywołanie edytora bez podania nazwy zbioru wznowi edycję dokładnie w miejscu, w którym została przerwana. Zatrzymanie pracy edytora następuje także po wprowadzeniu zamiast zlecenia - znacznika końca zbioru dc4. W tym przypadku jednak edytor nie jest usuwany. Aktualny stan edycji jest, tak jak dla zlecenia Q, zapamiętywany w zbiorach roboczych. Wznowienie pracy edytora następuje zleceniem RS OSL-a.

Zlecenia edytora

Zlecenia edytora są wprowadzane po wyprowadzeniu przez edytor znaku zachęty :. Treść zleceń przed ich analizą może być poddana następującym modyfikacjom (w podanej kolejności):

  • makrorozwinięcie i zamiana kodów oktalnych,
  • zamiana małych liter na duże,
  • usunięcie znaków kontrolnych.

Długość zleceń jest ograniczona do 128 znaków (po makrorozwinięciu do 256). Nazwy i parametry zleceń będące literami mogą być pisane zarówno dużymi jak i małymi literami (zamiana liter małych na duże jest istotna wyłącznie dla parametrów, które są łańcuchami).

Zmienne generacyjne i makrorozwinięcia tekstów

Składnia: =<litera><łańcuch>

Działanie: zmiennej generacyjnej nazwanej pojedyncza literą (są 52 zmienne o nazwach A..Z i a..z) jest nadawana wartość: podany łańcuch. Pusty łańcuch usuwa dotychczasową definicję. Zmienne generacyjne mogą być użyte w dowolnym miejscu tekstu wprowadzanego z klawiatury. Znaki: \<litera> występujące w tekście i oznaczające zmienną generacyjną są zamieniane na łańcuch zdefiniowany zleceniem = (wstawiany tekst nie podlega makrorozwinięciu). Jeżeli wskazana zmienna generacyjna nie jest zdefiniowana, jej oznaczenie pozostaje w tekście bez zmian. Wartości zmiennych generacyjnych są listowane zleceniem \. Poza wymienionymi wyżej zmiennymi mogą być używane zmienne - i = określające znaczniki końca strony. Wiersz zawierający wyłącznie łańcuch zdefiniowany przez jedną z tych zmiennych kończy stronę. Z tym, że jeżeli łańcuch ten jest zdefiniowany zmienną = i kończona strona ma numer nieparzysty, to następna strona ma numer będący kolejną liczbą nieparzystą. Po wywołaniu edytora zmienna - ma wartość: ff (znacznik końca strony przyjmowany przez programy listujące DLIST i LIST), natomiast zmienna = jest niezdefiniowana. Zmienne - i = mogą być przedefiniowane tak jak inne zmienne, ale definicje te muszą być zawarte w zbiorze EXMINI. W tekstach wprowadzanych z klawiatury znaki - i = są rozwijane tak jak inne zmienne generacyjne, ale tylko wtedy, gdy opcja 'number' ma wartość PNU.

Opcje edycji

Składnia: SET {<opcja> _ <opcja>=<wartość>}

Działanie: ustawienie wskazanych opcji zmieniających sposób działania niektórych mechanizmów. Jeżeli lista opcji jest pusta, na monitor wyprowadzane są wartości wszystkich używanych opcji.

Opcje (pełen opis przy zleceniach, na które działają):

  • 'wrapscan' (WS/NWS) - przeszukiwanie całego zbioru
  • 'ignorcase' (IC/NIC) - równość małych i dużych liter
  • 'magic' (MG/NMG) - specjalne znaki we wzorcach
  • 'octalcod' (OC/NOC) - przyjmowanie kodów oktalnych
  • 'lowtoupper' (LU/NLU) - zamiana małych liter na duże
  • 'clear' (CL/NCL) - usuwanie znaków kontrolnych
  • 'autoprint' (AP/NAP) - automatyczne drukowanie
  • 'listcontrol' (LC/NLC) - listowanie znaków kontrolnych
  • 'step' (ST/NST) - wyprowadzanie po cr
  • 'number' (NU/PNU/NNU) - numerowanie wierszy
  • 'pagelenght (PLE) - długość strony
  • 'linecount' (LIN/NLI) - długość ekranu
  • 'lenghtline' (LEN/NLE) - długość linii monitora
  • 'autotab' (AT/NAT) - automatyczna tabulacja
  • 'shiftwidth' (SW) - długość tabulatora
  • 'Zwindow' (ZW) - długość obszaru w zleceniu Z

Po wywołaniu edytora stan opcji jest taki jak po ustawieniu:

SET NWS NIC NMG NOC NLU NCL AP LC NST NU PLE=64 LIN=22 LEN=80 NAT SW=4 ZW=7

Modyfikacja wprowadzanych tekstów

Treść tekstów (zleceń, wierszy) wprowadzanych z klawiatury jest modyfikowana w sposób zależny od ustawienia opcji 'octalcod', 'clear' i 'lowtoupper'. Ustawienie opcji 'octalcod' umożliwia wprowadzenie do zlecenia lub wiersza znaku o dowolnym kodzie 0-0177:

  • OC - ciąg znaków: \0<liczba> występujący w tekście wprowadzanym z klawiatury jest zamieniany na bajt o kodzie oktalnym wskazanym przez liczbę.
  • NOC - kody oktalne nie są przyjmowane - oznaczają ciąg znaków.

Opcja 'clear' działa na znakach kontrolnych:

  • CL - z treści wprowadzanych wierszy są usuwane wszystkie znaki kontrolne oprócz znaków ht, lf, ff i vt.
  • NCL - znaki kontrolne są pozostawiane bez zmian

Opcja 'lowtoupper' działa na małe litery:

  • LU - wszystkie małe litery są zamieniane na duże
  • NLU - małe litery są pozostawiane bez zmian

W czasie wprowadzania do bufora wierszy z klawiatury działa także opcja 'autotab':

  • NAT - wiersze są wprowadzane bez zmian
  • AT - każdy wprowadzany wiersz jest poprzedzany przez edytor ciągiem spacji o długości równej liczbie początkowych spacji w wierszu wprowadzonym poprzednio (pierwszy wprowadzany w zleceniu wiersz nie jest poprzedzany żadnymi spacjami). Liczba tych spacji jest pokazywana umieszczeniem kursora w odpowiedniej kolumnie ekranu. Wprowadzenie ciągu spacji na początku wiersza zwiększa liczbę spacji poprzedzających wprowadzane wiersze. Sposób skrócenia tego łańcucha jest zależny od typu monitora. Pracując z monitorami 7910 lub 7950 można to uczynić cofając kursor aż do początku wiersza (pole niechronione rozciąga się od początku linii do miejsca umieszczenia kursora jest wypełnione spacjami) Przy pracy z każdym innym monitorem skrócenie długości łańcucha spacji następuje przez wprowadzenie na początku wiersza znaków CRTL/C. Każdy taki znak oznacza skasowanie spacji w ilości określonej przez wartość opcji 'shiftwidth' (standardowo 4). Skasowanie całego łańcucha spacji następuje po wprowadzeniu na początku wiersza (lub za znakami CTRL/C rozpoczynającymi wiersz) znaku CTRL/B. Wiersze w których zmniejszono w ten sposób liczbę początkowych spacji są po wczytaniu ponownie wyświetlane na monitorze i w zależności od ustawienia opcji 'step' są wyprowadzane:
    • NST - w tej samej linii ekranu (celowe dla monitorów w których znak cr cofa kursor na początek linii)
    • ST - w następnej linii (celowe dla monitorów w których znak cr nie cofa kursora do początku linii lub dla terminali drukujących np. DZM-KSR) Jeżeli bezpośrednio za znakami CTRL/B lub CTRL/C zostanie wprowadzony znak cr, to taki wiersz nie będzie wczytany do bufora roboczego, a tylko zostanie zmodyfikowane położenie kursora na ekranie, tak aby wskazywał na nową liczbę spacji, którymi będzie poprzedzony wprowadzany wiersz. Jeżeli opcja 'step' ma wartość ST, kursor jest przenoszony do następnej linii ekranu.

Opcja 'shiftwidth' określa liczbę spacji kasowanych znakiem CTRL/C przy wprowadzaniu wierszy z ustawioną opcją 'autotab':

SW=<liczba>

Przy pracy z monitorami 7950 i 7910 opcja ta nie ma żadnego znaczenia. Stan powyższych opcji po starcie edytora:

SET NOC NCL NLU NAT SW=4

Cofanie poprawek

Składnia: U

Działanie: zawartość bufora, wskaźnik dostępu i znaczniki wierszy będą takie jak przed wykonaniem ostatniego zlecenia zmieniającego zawartość bufora. Kolejne zlecenie U przywróci stan bufora sprzed wykonania ostatniego zlecenia U. Działanie zlecenia jest szczegółowo opisane dla każdego zlecenia zmieniającego zawartość bufora.

Adresowanie wierszy

Wskaźnik dostępu do bufora

Po wczytaniu zbioru do bufora roboczego wskaźnik dostępu jest ustawiany na pierwszy wiersz bufora. Zmiana wskaźnika dostępu (wiersza bieżącego) następuje po wykonaniu większości zleceń edytora. Zmiana wiersza bieżącego bez jakichkolwiek innych efektów następuje po wprowadzeniu adresu wiersza: <wyrażenie_adresowe>.

Wprowadzenie zlecenia pustego - tylko znaku cr (RETURN) przesuwa wskaźnik dostępu na następny wiersz w buforze. Wiersz ten jest wyprowadzany w zależności od ustawienia opcji 'step':

  • ST - w następnej linii monitora (zalecane dla monitorów, w których znak cr nie powoduje przesunięcia kursora na początek linii ekranu)
  • NST - w tej samej linii, w której zostało wprowadzone zlecenie (zalecane dla monitorów, w których cr przesuwa kursor na początek linii ekranu)

Po wywołaniu edytora opcja 'step' jest zgaszona (NST).

Wyrażenia regularne

Wyrażenia regularne służą do opisywania zawartości wierszy. Sekwencja znaków oznaczających siebie i znaków specjalnych tworzących wyrażenie regularne jest wzorcem opisującym pewien zbiór łańcuchów. Wiersz zawierający co najmniej jeden z łańcuchów tego zbioru jest zgodny ze wzorcem zawartości wiersza. Wzorce zawartości wierszy są używane w operacjach szukania wierszy i w zleceniach podstawienia.

Opcje przetwarzania wyrażeń regularnych

Opcja 'magic' ustala znaczenie specjalne pewnych znaków zawartych we wzorcach zawartości wierszy:

  • MG - znaki: . * + { [ ? < > % ! ~ _ zawarte we wzorcu zawartości wiersza i znaki: & @ % zawarte we wzorcu łańcucha wstawianego mają specjalne znaczenie. Znaczenie to tracą w miejscach, w których zostaną poprzedzone znakiem \.
  • NMG - wszystkie znaki we wzorcach oznaczają siebie (za wyjątkiem znaku ^ rozpoczynającego wzorzec i znaku $ kończącego wzorzec i nie poprzedzonego znakiem \). Specjalne znaczenie otrzymują znaki poprzedzone znakiem \.

Aby zapisać we wzorcu znak \ lub znaki ograniczające wzorzec należy te znaki poprzedzić znakiem \.

Opcja 'ignorcase' decyduje o równoważności małych i dużych liter przy wyznaczaniu łańcucha zgodnego ze wzorcem:

  • IC - litery małe i duże są traktowane jako te same znaki
  • NIC - litery małe są rozróżniane od liter dużych

Stan opcji po wywołaniu edytora jest:

SET NMG NIC

Wzorzec zawartości wiersza

Składnia (podana w postaci wymaganej przy zapalonej opcji 'magic' MG): <wzorzec> ::= [^] [<część>] {!<część>} [$]

  • ^ - oznacza, że łańcuch wskazany wzorcem ma rozpoczynać wiersz
  • $ - oznacza, że łańcuch wskazany wzorcem ma kończyć wiersz
  • ! - dzieli wzorzec na części. Części łańcucha zgodne z częściami wzorca są numerowane od 1 do 9 i mogą być wskazywane we wzorcu łańcucha wstawianego.
<część> ::= <fragment> { _ <fragment>}

_ - rozdziela fragmenty alternatywne - odpowiednia część łańcucha wskazanego wzorcem musi być zgodna z co najmniej jednym z fragmentów. Przykładowo wzorzec: IB_RZ!(ZMIEN) opisuje wiersze zawierające łańcuchy: RZ(ZMIEN) lub IB(ZMIEN).

<fragment> ::= { <ciąg> _ <ogranicznik> _ <symbol_łańcucha> }
<ciąg> ::= <element> [<krotność>]
  • <element> - wskazuje znak w szukanym łańcuchu:
    • <znak> - wskazany znak:
    • . - dowolny znak
    • [<zbiór_znaków>] - znak należący do podanego zbioru znaków
    • [^<zbiór_znaków>] - znak nie należący do podanego zbioru znaków
<zbiór_znaków> ::= {<znak>-<znak> _ <znak> }
  • <znak>-<znak> - podzbiór znaków o kodach (ASCII) zawartych między kodami wskazanych znaków (włącznie)
  • <znak> - wskazany znak

Znaki opisujące zbiór znaków oznaczają zawsze siebie niezależnie od ustawienia opcji 'magic'. Specjalne znaczenie (także niezależnie od ustawienia opcji 'magic') mają tylko znaki: ^ rozpoczynający opis zbioru, - rozdzielający parę dowolnych znaków, oraz ] zamykający opis zbioru znaków. Znaki te poprzedzone znakiem \ oznaczają siebie.

Przykładowo opis: [^-a-d-Z-]] oznacza dopełnienie (^ na pierwszej pozycji) zbioru składającego się z podzbiorów: -, a-d, -, Z-] (pierwszy i trzeci znak - nie separujące pary znaków - analiza przebiega od lewej strony - oznaczają siebie; podobnie pierwszy znak ] będący drugim znakiem w parze znaków, nie oznacza końca opisu zbioru). Przy zgaszonej opcji 'magic' znak \ musi poprzedzać tylko nawias otwierający opis zbioru: \[^-a-d-Z-]]

  • <krotność> : - określa liczbę elementów ciągu
  • {<liczba>} - wskazana liczba

{[<liczba>],[<liczba>]} - liczba zawarta w podanym zakresie. Pominięcie pierwszego parametru oznacza 0 - ciąg pusty; pominięcie drugiego - ciąg dowolnie długi: do 255 znaków. Jeżeli pierwszy parametr ma mniejszą wartość niż drugi, to znajdowany jest najkrótszy łańcuch zgodny z tym wzorcem. Gdy drugi parametr jest mniejszy od pierwszego, szukany jest najdłuższy łańcuch zgodny z tym wzorcem.

Znaki , i } zawarte w tym elemencie mają zawsze specjalne znaczenie niezależnie od ustawienia opcji 'magic'.

Krotność może być podana także w skróconej formie:

  • * - równoważne {,}
  • + - równoważne {1,}
  • ? - równoważne {0,1}

<ogranicznik> - opisuje znaki leżące obok:

  • ( - znak następny ma rozpoczynać nazwę
  • ) - znak poprzedni ma kończyć nazwę
  • < - znak następny ma rozpoczynać słowo
  • > - znak poprzedni ma kończyć słowo

Nazwą jest ciąg znaków zawierający litery, cyfry lub znak podkreślenia _, natomiast słowem - ciąg znaków ograniczonych znakami : spacja, ht, lf lub granicami wiersza. Symbole \( i \) muszą być pisane w podanej postaci (znak nawiasu poprzedzony znakiem \) niezależnie od ustawienia opcji 'magic'.

<symbol_łańcucha> - w miejscu wystąpienia tego znaku zostanie wstawiony łańcuch:

  • % - ostatni łańcuch wprowadzony zleceniem podstawienia
  • ~ - ostatni łańcuch znaleziony w operacji przeszukiwanie bufora

Wzorzec zawartości wiersza jest analizowany od lewej strony i ze wszystkich łańcuchów zgodnych ze wzorcem jest wybierany łańcuch rozpoczynający się możliwie najbardziej z lewej strony.

Wyrażenie adresowe

Składnia: [<adres_bezwzględny>] {<adres_względny> _ <opis_zawartości_wiersza>}

Puste wyrażenie adresowe oznacza zwykle wiersz bieżący (odstępstwa są wyraźnie wskazane).

<adres_bezwzględny>:

  • ^<liczba> - pierwszy wiersz strony o podanym numerze. Standardowo EXM dzieli poprawiany zbiór na strony tak samo jak programy listujące LIST i DLIST. Znacznikiem końca strony jest wiersz zawierający tylko znak ff. Przy korzystaniu z innych programów listujących (na przykład LISTOR) można zdefiniować inne znaczniki końca strony. Maksymalna długość stron jest ograniczona przez wartość opcji 'pagelenght' - standardowo 64.
  • <liczba> - numer wiersza w buforze (pierwszy wiersz ma numer 1). Jeżeli opcja 'number' ma wartość PNU, wiersze są numerowane od początku bieżącej strony.
  • $ - ostatni wiersz w buforze
  • . - wiersz bieżący
  • '<litera> - wiersz wskazany przez znacznik wiersza (3.4)
  • - wiersz dostępny przed wykonaniem ostatniego zlecenia, które zmieniło położenie wskaźnika dostępu (ciąg pustych zleceń - wprowadzanie tylko znaków cr - jest tu traktowany jako jedno zlecenie).

<adres_względny>:

  • + - wiersz następny
  • - - wiersz poprzedni
  • +<liczba> - przesunięcie o wskazaną liczbę wierszy do przodu
  • -<liczba> - przesunięcie o wskazaną liczbę wierszy do tyłu
  • ^ - pierwszy wiersz bieżącej strony
  • $ - ostatni wiersz bieżącej strony (nie licząc wiersza zawierającego znacznik końca strony). Znak $ ma podane tu znaczenie tylko wtedy, gdy nie jest pierwszym elementem wyrażenia adresowego.
  • > - pierwszy wiersz następnej strony
  • ><liczba> - wykonanie operacji > wskazaną liczbę razy
  • < - pierwszy wiersz poprzedniej strony
  • <<liczba> - wykonanie operacji < wskazaną liczbę razy

<opis_zawartości_wiersza>: podanie tego elementu oznacza, że począwszy od wiersza znalezionego w wyniku wykonania wcześniejszych operacji wyrażenia adresowego, będzie szukany wiersz o zawartości zgodnej z podanym wzorcem:

  • /<wzorzec>/[<liczba>] - bufor przeszukiwany do przodu
  • ?<wzorzec>?[<liczba>] - bufor przeszukiwany do tyłu

Składnia i znaczenie wzorca jest zgodne z opisem podanym w p 3. 2.1. Jeżeli wzorzec jest pusty, zostanie przyjęty wzorzec użyty w ostatniej operacji przeszukiwania bufora. Podanie liczby za znakiem ograniczającym wzorzec oznacza wykonanie operacji szukania wskazaną liczbę razy. Gdy znak ograniczający wzorzec z prawej strony jest ostatnim znakiem w zleceniu, może być pominięty. Przeszukiwanie bufora jest kończone po : - znalezieniu wiersza zgodnego ze wzorcem - osiągnięciu wiersza dostępnego w momencie rozpoczynania obliczania wyrażenia adresowego Akcja po osiągnięciu końca bufora (lub początku przy przeszukiwaniu do tyłu) jest zależna od ustawienia opcji 'wrapscan':

  • WS - przeglądany jest jeszcze obszar od początku (lub końca zbioru przy przeglądaniu do tyłu)

do wiersza bieżącego

  • NWS - przeglądanie bufora jest kończone

Po wystartowaniu edytora opcja 'wrapscan' jest zgaszona: NWS.

Znaczniki wierszy

Można zdefiniować 26 znaczników o nazwach A..Z:

<wyrażenie_adresowe> M <litera>

Działanie: do wiersza wskazanego wyrażeniem adresowym jest przywiązywany znacznik o podanej nazwie. Znacznik traci swoje przywiązanie po przedefiniowaniu lub usunięciu wiersza z bufora roboczego (przeniesieniu do bufora pomocniczego). Definicje znaczników są wyprowadzane zleceniem ' w postaci:

<nazwa_znacznika> <numer_wiersza> <zawartość_wiersza>

Opis obszaru

  • <wyrażenie_adresowe> - obszar obejmuje tylko wskazany wiersz
  • <wyrażenie_adresowe>:<liczba> - obszar obejmuje wskazaną liczbę wierszy począwszy od wskazanego wyrażeniem adresowym
  • <wyrażenie_adresowe>,<wyrażenie_adresowe> - obszar obejmuje wiersze od wskazanego pierwszym wyrażeniem adresowym do wskazanego drugim wyrażeniem adresowym włącznie. Jeżeli wyrażenia adresowe nie rozpoczynają się numerem bezwzględnym, wierszem bieżącym przyjętym do wyliczania obu wyrażeń jest wiersz dostępny w momencie wprowadzania zlecenia.
  • <wyrażenie_adresowe>;<wyrażenie_adresowe> - obszar obejmuje wiersze od wskazanego pierwszym wyrażeniem do wskazanego drugim wyrażeniem włącznie. Jeżeli drugie wyrażenie nie rozpoczyna się numerem bezwzględnym, wierszem bieżącym przyjętym do wyliczania tego wyrażenia jest wiersz wskazany pierwszym wyrażeniem.

Wyprowadzanie zawartości bufora na monitor

Wyprowadzenie wiersza bieżącego. Opcje listowania

Po każdym zleceniu zmieniającym wskaźnik dostępu do bufora nowy wiersz bieżący jest drukowany zależnie od opcji 'autoprint':

  • AP - wyświetlanie automatyczne
  • NAP - wyświetlanie tylko po wykonaniu zleceń zawierających instrukcje listowania

Jeżeli zlecenie nie zawiera instrukcji listującej określającej sposób wyprowadzania, postać wyprowadzanych wierszy jest zależna od opcji 'listcontrol':

  • LC - znaki kontrolne (o kodach 1-26) są wyprowadzane za pomocą dwóch znaków : ^<litera> (dla monitorów 7910 i 7950 zamiast znaku ^ jest użyty znak funta). Pozostałe znaki nie wyświetlane przez monitory są wyprowadzane w postaci: \<liczba> , gdzie <liczba> jest 3 znakową liczbą oktalną równą wartości wyprowadzanego znaku.
  • NLC - wszystkie znaki nie wyświetlane są wyprowadzane jako spacje

'lenghtline':

  • NLE - wiersz nie jest dzielony na linie
  • LEN - wiersz jest dzielony na linie o długości takiej jak przed wyłączeniem opcji
  • LEN=<liczba> - wyprowadzane wiersze są dzielone na linie o wskazanej długości

i 'number':

  • NU - wyprowadzanie numeru wiersza w buforze
  • PNU - wyprowadzanie numeru strony i numeru wiersza na stronie
  • NNU - numer wiersza nie jest wyprowadzany

Maksymalna długość strony jest ograniczona wartością opcji 'pagelenght':

PLE=<liczba> - ustawienie długości strony

Stan powyższych opcji po wywołaniu edytora:

SET AP LC NU PLE=64 LEN=80

Wyprowadzanie obszaru bufora na monitor

Składnia zlecenia: <opis_obszaru><instrukcje_listujące>

Działanie: wskazany obszar jest wyprowadzany na monitor w postaci określonej przez instrukcje listujące lub opcje listowania

<instrukcje_listujące> ::= [L_P][#]

  • P - wszystkie znaki nie wyświetlane (o kodach 0-037 i powyżej 0177) są zamieniane na spacje
  • L - znaki kontrolne (o kodach 1 - 26) są wyprowadzane za pomocą dwóch znaków: ^<litera> (dla monitorów 7910 i 7950 zamiast znaku ^ jest użyty znak funta). Inne znaki nie wyświetlane są wyprowadzane w postaci: \<liczba>, gdzie <liczba> jest 3 znakową liczbą oktalną równą wartości znaku.
  • # - wyprowadzane wiersze są poprzedzane numerami

Gdy instrukcje listujące nie są podane, sposób wyprowadzania jest określony przez opcje listowania : 'autoprint', 'listcontrol' i 'number'.

Wyprowadzanie obszarów większych niż jeden wiersz jest sterowane opcją 'linecount':

  • NLI - obszar jest wyprowadzany bez zatrzymania wydruków
  • LIN - wydruk jest zatrzymywany po zapełnieniu całego ekranu. Wykonywanie zlecenia po wprowadzeniu:
    • cr - jest wznawiane
    • dc4 - jest kończone
  • LIN=<liczba> - ustawienie długości ekranu

Stan opcji po wywołaniu edytora:

SET LIN=22

Jeżeli przed wywołaniem edytora zostanie ustawiona opcja OSL-a REP LIN, to wartość tej opcji zostanie przekazana opcji LIN w edytorze.

Wierszem bieżącym po wykonaniu zlecenia listowania jest ostatni wyprowadzony wiersz.

Wyprowadzanie obszaru zleceniem Z

Składnia zlecenia: <wyrażenie_adresowe><instrukcja_Z> [<liczba>] [#]

Działanie: na monitor jest wyprowadzany obszar określony przez wyrażenie adresowe i instrukcję Z. Długość tego obszaru jest określona przez podaną liczbę lub, gdy nie jest ona podana, przez wartość opcji 'Zwindow' (standardowo 7):

ZW=<liczba>

<instrukcja_Z>:

  • Z - wskazany wiersz jest wyprowadzany w środku obszaru
  • Z- - wskazany wiersz jest ostatnim wyprowadzanym
  • Z+ - wskazany wiersz jest pierwszym wyprowadzanym
  • Z= - wskazany wiersz jest wyprowadzany w środku i jest objęty dwiema liniami zawierającymi ciągi znaków ----

Przy wykonywaniu zleceń Z, Z+ i Z- wskazany wiersz jest oznaczany znakiem * wyprowadzanym zamiast spacji separującej numer wiersza od jego zawartości.

# - listowanie z numeracją wierszy

Przy wykonaniu zlecenia Z działają opcje 'listcontrol', 'number', 'lenghtline' i 'linecount'. Wierszem bieżącym po wykonaniu zlecenia jest wiersz wskazany przez wyrażenie adresowe.

Wyprowadzanie wierszy instrukcją globalną

Składnia zlecenia: [<opis_obszaru>] G[^]/<wzorzec>

Znaczenie: wszystkie wiersze wskazanego obszaru zgodne z podanym wzorcem (lub niezgodne - jeżeli jest podany parametr ^) będą wyprowadzone na monitor. Pusty wzorzec oznacza przyjęcie wzorca użytego w ostatnim zleceniu przeszukiwania bufora. Wskazany obszar musi zawierać więcej niż jeden wiersz. Jeżeli opis obszaru nie zostanie podany, przeszukany zostanie cały bufor. Przy wyprowadzaniu działają opcje 'listcontrol', 'number', 'lenghtline' i 'linecount'. Wierszem bieżącym po wykonaniu zlecenia jest ostatni wyprowadzony wiersz.

Usuwanie i wstawianie wierszy

Usuwanie wierszy z bufora

Składnia zlecenia: <opis_obszaru> D

Działanie: wskazany obszar jest usuwany. Usunięte wiersze są przenoszone do specjalnego bufora pomocniczego. Niedozwolone jest usunięcie całego poprawianego bufora. Wierszem bieżącym po wykonaniu zlecenia jest pierwszy wiersz za usuniętymi; wyjątkowo po usunięciu ostatniego wiersza w buforze - wiersz poprzedzający wiersze usunięte. Zlecenie U wstawia usunięte wiersze z powrotem do bufora roboczego.

Wprowadzanie wierszy z klawiatury

Składnia zlecenia: <wyrażenie_adresowe> <instrukcja_A_I> [ ! _ <znak>]

Działanie: w miejsce wskazane wyrażeniem adresowym i instrukcją będą wprowadzane wiersze z klawiatury. Po wprowadzeniu zlecenia edytor zgłasza się w nowej linii (jeżeli opcja 'number' ma wartość NU lub PNU, wyświetlany jest numer wprowadzanego wiersza) i wczytuje kolejne wiersze. Jeżeli opcja 'autotab' ma wartość AT, każdy wprowadzany wiersz jest poprzedzany przez edytor ciągiem spacji o długości równej liczbie prowadzących spacji w wierszu wprowadzonym poprzednio (2.4). Podanie jako parametru znaku ! zmienia stan opcji 'autotab' na przeciwny (tylko na czas wykonania zlecenia). Wprowadzanie kończy wpisanie wiersza zawierającego tylko znacznik końca wprowadzania lub znacznik końca zbioru dc4. Znacznikiem końca wprowadzania jest znak podany za instrukcją. Może to być dowolny znak kodu ASCII poza !, cr, dc4, lf i spacją. Jeżeli znacznik końca wprowadzania nie jest podany, wprowadzanie kończy tylko dc4.

Wprowadzane wiersze mogą mieć długość do 255 znaków. Zawartość wprowadzonych wierszy podlega makrorozwinięciu i jest modyfikowana zgodnie z ustawieniem opcji 'octalcod', 'clear' i 'lowtoupper'.

<instrukcja_A_I>:

  • A - wiersze są dołączane za wierszem wskazanym wyrażeniem adresowym. Wierszem bieżącym po wykonaniu zlecenia jest ostatni wprowadzony wiersz.
  • I - wiersze są wprowadzane przed wierszem wskazanym przez wyrażenie adresowe. Wierszem bieżącym po wykonaniu zlecenia jest wiersz wskazany wyrażeniem adresowym.

Dołączenie jednego wiersza realizują instrukcje A I w postaci skróconej:

[A]lf<łańcuch> - wiersz zawierający łańcuch jest dołączany za wierszem wskazanym (znak A nie ma żadnego znaczenia i może być pominięty) Ilf<łańcuch> - wiersz zawierający wskazany łańcuch jest wstawiany przed wierszem wskazanym.

Po wstawieniu wiersza edytor zgłasza się po kolejne zlecenie. Zlecenie U usuwa wstawione wiersze z bufora roboczego i przenosi je do specjalnego bufora pomocniczego.

Zamiana wierszy na wprowadzane z końcówki

Składnia zlecenia: <opis_obszaru> C [ lf<łańcuch> _ ! _ <znak> ]

Znaczenie: wskazany obszar jest usuwany (przenoszony do specjalnego bufora pomocniczego) i na jego miejsce są wprowadzane z klawiatury nowe wiersze. Parametry zlecenia są takie same jak w zleceniach A, I. Wprowadzanie jest wykonywane również tak samo jak instrukcjami A I . Wierszem bieżącym po wykonaniu zlecenia jest ostatni wprowadzony wiersz. Zlecenie U wstawia wiersze usunięte (przenosi je ze specjalnego bufora pomocniczego do bufora roboczego) i usuwa wiersze wstawione (przenosi je do specjalnego bufora pomocniczego).

Wczytywanie do bufora wierszy ze zbioru

Składnia zlecenia: <wyrażenie_adresowe> <instrukcja_R> <tytuł_zbioru> [<opis_obszaru>]

Działanie: w miejsce określone wyrażeniem adresowym i zleceniem R zostaną wprowadzone wiersze ze zbioru o podanej nazwie. Wiersze, które mają być wczytane są wskazane opisem obszaru podanym za nazwą zbioru. Opis obszaru ma składnię w zasadzie taką samą jak opisany w p 3.5. tzn. może składać się z adresu wiersza, adresów wierszy rozdzielonych znakami , lub ; (znaczenie obu separatorów jest w tym przypadku takie samo) albo adresu wiersza i liczby wierszy. Brak opisu obszaru oznacza wczytanie całego zbioru. Elementami wyrażeń adresowych nie mogą być elementy cofające wskaźnik dostępu (- < ^ ?<wzorzec>? ). Pozostałe elementy mają takie samo znaczenie, jak w wyrażeniach adresowych. Jedynym wyjątkiem jest znak $ oznaczający koniec bieżącej strony. I tu oznacza on ostatni wiersz strony, ale wiersz zawierający znacznik końca strony jest wliczany do strony. Wczytywany zbiór jest dzielony na strony tak samo jak poprawiany bufor. Długość czytanego zbioru jest określona parametrami PA1 i PA2. Jeżeli wartość tych parametrów wykracza poza dopuszczalny zakres (lub jest niezgodna z parametrem LEN) sygnalizowany jest zły typ zbioru wejściowego i zbiór nie jest wczytywany. Jeżeli parametry PA1 i PA2 zbioru mają wartość 0, długość czytanego zbioru jest wyliczana z parametru LEN. Wprowadzane wiersze muszą mieć długość do 255 znaków. Wiersze dłuższe są dzielone na wiersze o długości 255 znaków.

<instrukcja_R>:

  • RA - zawartość zbioru jest wprowadzana za wierszem wskazanym wyrażeniem adresowym. Wierszem bieżącym po wykonaniu zlecenia jest ostatni wprowadzony wiersz.
  • RI - zawartość zbioru jest wprowadzana przed wierszem wskazanym przez wyrażenie adresowe. Wierszem bieżącym po wykonaniu zlecenia jest wiersz wskazany wyrażeniem adresowym.

Zlecenie U usuwa wprowadzone wiersze (przenosi je do specjalnego bufora pomocniczego - 7.2).

Zmiany zawartości wierszy

Zlecenie podstawienia

Składnia zlecenia: <opis_obszaru>S/<wzorzec> [/<wzorzec_łańcucha> [/<schemat_podstawienia> <instrukcje_listujące>] ]

Działanie: we wskazanych wierszach łańcuchy zgodne ze wzorcem są zamieniane na łańcuchy wskazane przez <wzorzec_łańcucha>. Z łańcuchów zgodnych ze wzorcem są zamieniane tylko wskazane przez schemat podstawienia. Po wykonaniu zlecenia poprawione wiersze są wyprowadzane na monitor w postaci określonej przez instrukcje listujące. Uwaga. Znakiem ograniczającym wzorce może być zamiast znaku / dowolny inny znak poza spacją. Ze względu na specjalne znaczenie wielu znaków we wzorcach nie zaleca się stosowania innych znaków poza: ; : ' " i = .

  • <wzorzec> - składnia zgodna ze składnią wzorca w p. 3.2. Pusty wzorzec oznacza, że ma być przyjęty wzorzec użyty w ostatniej operacji przeszukiwania bufora.
  • <wzorzec_łańcucha> - określa łańcuch wstawiany w miejsce łańcucha wskazanego wzorcem.

Wzorzec łańcucha może zawierać znaki oznaczające siebie i symbole specjalne oznaczające:

  • lf - podział wiersza na dwa
  • % - ostatni łańcuch wstawiony zleceniem podstawienia.
  • & - łańcuch wskazany przez wzorzec użyty w tej instrukcji podstawienia.
  • @ - ostatni łańcuch usunięty zleceniem podstawienia
  • \<cyfra> - łańcuch zgodny ze wskazaną częścią wzorca.
  • \? - łańcuch wstawiony w momencie wykonywania podstawienia: edytor wyświetla poprawiany wiersz i podkreśla usuwany łańcuch ciągiem znaków ^^..^
  • . Po wyprowadzeniu znaku zachęty ? należy wprowadzić łańcuch (może być pusty), który ma być wstawiony w miejsce symbolu \?. Wprowadzony tekst podlega makrorozwinięciu i jest modyfikowany zgodnie z ustawieniem opcji 'octalcod', 'clear' i 'lowtoupper'. Wprowadzenie dc4 przerywa wykonanie zlecenia (pokazane podstawienie nie jest wykonywane).

Jeżeli opcja 'magic' jest zgaszona (NMG), to aby symbole @, % i & miały znaczenie opisane powyżej, należy je poprzedzić znakiem \. Dowolny element wzorca łańcucha wstawianego może być poprzedzony wskaźnikiem konwersji liter:

  • \^ - zamiana małych liter na duże
  • \_ - zamiana dużych liter na małe

Jeżeli wskaźnik konwersji poprzedza symbol oznaczający łańcuch, zamienione zostaną wszystkie litery wskazanego łańcucha.

<schemat_podstawienia> ::= {<opis_wystąpień>}[G] [?] _ & [?]

Pusty schemat podstawienia oznacza zamianę tylko pierwszego zgodnego ze wzorcem łańcucha w wierszu.

<opis_wystąpienia> : opisuje operację wykonywaną na kolejnych łańcuchach zgodnych ze wzorcem:

  • - - kolejny łańcuch pozostaje bez zmian
  • + - kolejny łańcuch jest zamieniany
  • -<liczba> - wskazana liczba kolejnych łańcuchów jest pozostawiana bez zmian
  • [+]<liczba> - wskazana liczba kolejnych łańcuchów jest zamieniana
  • G - wszystkie następne łańcuchy zgodne ze wzorcem znajdujące się w wierszu są zamieniane
  • & - schemat podstawienia jest taki sam jak w ostatnim zleceniu podstawienia (nie dotyczy ostatniego elementu - ?)
  • ? - wszystkie podstawienia wskazane przez schemat podstawienia będą wykonane dopiero po akceptacji. łańcuch, który ma być zamieniony, jest podkreślany przez edytor ciągiem znaków ^..^. O podstawieniu decyduje wprowadzony znak akceptacji:
    • + - podstawienie wykonywane
    • - - podstawienie nie wykonywane
    • G - wszystkie pozostałe podstawienia wykonywane bez akceptacji
    • cr - podstawienie nie wykonywane i dalsza część wiersza pozostaje bez zmian
    • dc4 - podstawienie nie wykonywane, dalsza część wiersza pozostaje bez zmian i następne wiersze wskazanego obszaru nie są analizowane

<instrukcje_listujące>- składnia i znaczenie takie same jak opisane w p 4.2.

Przy ustawionej opcji 'autoprint' lub podaniu instrukcji listującej wiersze zawierające łańcuchy zgodne ze wzorcem są wyprowadzane na monitor w postaci zależnej od ustawienia opcji listowania (4.1) lub wprowadzonych instrukcji listujących. Działa także zatrzymywanie listowania po zapełnieniu ekranu (4.2). Wierszem bieżącym po wykonaniu zlecenia jest ostatni wiersz wskazanego obszaru zgodny z podanym wzorcem. Zlecenie U cofa wszystkie wykonane podstawienia.

Skrócone instrukcje podstawienia

Składnia zlecenia: <opis_obszaru> <instrukcja_S> / <wzorzec_łańcucha> [/<schemat_podstawienia> <instrukcje_listujące>]

Działanie: we wskazanych wierszach łańcuchy zgodne ze wzorcem określonym przez instrukcję S są zamieniane na łańcuchy określone przez podany <wzorzec_łańcucha> Uwaga. Znakiem separującym w tych zleceniach musi być znak /.

<opis_obszaru> <instrukcja_S> [<schemat_podstawienia> <instrukcje_listujące>]

działanie: we wskazanych wierszach łańcuchy zgodne ze wzorcem określonym przez instrukcję S są zamieniane na łańcuchy określone przez tę instrukcję. Skrócone zlecenia podstawienia wykorzystują następujące ciągi znaków:

  • wzorzec zawartości wiersza użyty w ostatniej operacji przeszukiwania bufora
  • wzorzec zawartości wiersza użyty w ostatnim zleceniu podstawienia
  • ostatni łańcuch usunięty zleceniem podstawienia
  • ostatnio użyty wzorzec łańcucha wstawianego
  • ostatni wstawiony łańcuch

<instrukcja_S>:

  • & - równoważne S/b/d (ponowne wykonanie ostatniego zlecenia podstawienia)
  • ~ - równoważne S/a/d
  • % - równoważne S/e/c (wykonanie podstawienia odwrotnego do ostatniego - nie zawsze jest równoważne wykonaniu zlecenia U)
  • @ - równoważne S/c/e (wykonanie takiego samego podstawienia jak w ostatnim zleceniu podstawienia - nie zawsze jest równoważne zleceniu &)

Uwaga. Ciągi % i @ niezależnie od ustawienia opcji 'magic' nie są rozwijane - wszystkie znaki oznaczają siebie.

Schemat podstawienia i instrukcje listujące są takie same jak dla pełnej instrukcji podstawienia.

Ostatnio użyte wzorce i łańcuchy wymienione wyżej oraz łańcuch wskazywany przez symbol @ są wyświetlane na monitorze bezparametrowym zleceniem S. W pierwszym wierszu są wyprowadzane ostatnio użyte wzorce w postaci: /a/ S /b/d/ (a, b i d oznaczają wzorce jw.). W następnych wierszach są wyprowadzane łańcuchy wskazywane symbolami _~, @ i % używanymi we wzorcach.

Bezpośrednie poprawianie wierszy

Uwaga. Tryb pracy opisany w tym rozdziale jest w aktualnej wersji edytora dostępny wyłącznie dla użytkowników korzystających z monitorów MERA 7910 lub 7950.

Składnia zlecenia: <opis_obszaru> O

Działanie: na ekran monitora są wyprowadzane kolejne wiersze wskazanego obszaru. Cała zawartość wiersza jest umieszczana w polu niechronionym i kursor jest ustawiany za ostatnim znakiem wiersza. Zmiany zawartości wiersza można dokonać bezpośrednio wstawiając (INS MODE), usuwając (DEL) lub zamieniając znaki na ekranie. Po wciśnięciu klawisza SEND zmodyfikowana zawartość wiersza jest zapisywana do bufora roboczego i edytor wyprowadza na ekran kolejny wiersz obszaru wskazanego w zleceniu. Wprowadzenie dc4 (PF12) przerywa wykonanie zlecenia (ostatni wiersz wyświetlony na ekranie pozostaje w buforze bez zmian). Zawartość wierszy jest wyprowadzana na ekran w postaci określonej przez handler monitorów 7910/50 . Niezależnie od ustawienia opcji 'listcontrol' znaki o kodach 1..26 są listowane (jako małe litery poprzedzone znakiem funta) a inne znaki nie wyświetlane są zamieniane na spacje. I tak też zostaną wprowadzone do bufora po poprawieniu. Poprawione wiersze są po wczytaniu modyfikowane zgodnie z ustawieniem opcji 'lowtoupper' i 'clear'. Opcja 'octalcod' jest ignorowana, nie są też wykonywane makrorozwinięcia. Uwaga. Jeżeli pole niechronione zostanie całkowicie wyzerowane, to zawartość wiersza w buforze roboczym pozostanie nie zmieniona. Zlecenie U wykonane po zleceniu O cofa zmiany wykonane w ostatnim poprawionym wierszu.

Usuwanie znaków kontrolnych

Składnia zlecenia: <opis_obszaru> CL

Działanie: z opisanego obszaru zostaną usunięte wszystkie znaki kontrolne oprócz lf, ff, vt i ht. Zlecenie to działa niezależnie od opcji 'clear'. Wierszem bieżącym po wykonaniu zlecenia jest ostatni wiersz opisanego obszaru. Zlecenie U nie działa w przypadku tego zlecenia.

Zamiana liter

Składnia zlecenia: <opis_obszaru> LU

Działanie: we wskazanych wierszach wszystkie małe litery są zamieniane na duże. Zlecenie to działa niezależnie od opcji 'lowtoupper'.

<opis_obszaru> UL

działanie: we wskazanych wierszach wszystkie duże litery są zamieniane na małe. Wierszem bieżącym po wykonaniu powyższych zleceń jest ostatni wiersz wskazanego obszaru. Zlecenie U nie działa w przypadku tych zleceń.

Łączenie wierszy

Składnia zlecenia: <opis_obszaru> J [^][/<łańcuch>]

Działanie: wskazane wiersze zostaną połączone w jeden wiersz. Jeżeli opisany obszar zawiera tylko jeden wiersz, do tego wiersza jest dołączany następny wiersz. Parametry zlecenia:

  • ^ - usuwanie z dołączanych wierszy wszystkich początkowych spacji i znaków tabulacji ht
  • /<łańcuch> - przed każdym dołączanym wierszem jest wstawiany podany łańcuch

Wierszem bieżącym po wykonaniu zlecenia jest nowo utworzony wiersz. Zlecenie U rozdziela wiersz na wiersze składowe.

Przenoszenie i kopiowanie wierszy

Przenoszenie i kopiowanie wierszy w buforze

Składnia zlecenia: <opis_obszaru> <instrukcja_C_M> <wyrażenie_adresowe>

Działanie: wskazany obszar jest kopiowany lub przenoszony w miejsce określone przez wyrażenie adresowe.

<instrukcja_C_M>:

  • CA - kopiowanie obszaru za wskazany wiersz
  • CI - kopiowanie obszaru przed wskazany wiersz
  • MA - przenoszenie obszaru za wskazany wiersz
  • MI - przenoszenie obszaru przed wskazany wiersz

Wierszem bieżącym po wykonaniu zlecenia jest ostatni skopiowany lub przeniesiony wiersz (zlecenia CA i MA) lub wiersz wskazany wyrażeniem adresowym (zlecenia CI i MI). Zlecenie U usuwa skopiowany obszar (zlecenia CA i CI) lub przenosi go z powrotem (zlecenia MI i MA).

Przenoszenie i kopiowanie wierszy do buforów pomocniczych

Składnia zlecenia: <opis_obszaru> <instrukcja_D_Y> [>] [<litera>]

Działanie: wskazany obszar jest kopiowany lub przenoszony (usuwany z bufora roboczego) do bufora pomocniczego nazwanego pojedyncza literą. Jeżeli jest podany parametr >, wskazane wiersze są dołączane do zawartości bufora pomocniczego. W przeciwnym razie poprzednia zawartość bufora jest niszczona. Jeżeli nazwa bufora nie zostanie podana, wiersze będą przeniesione lub skopiowane do bufora specjalnego.

<instrukcja_D_Y>:

  • D - przenoszenie wierszy
  • Y - kopiowanie wierszy

Można korzystać z 26 buforów pomocniczych o nazwach A..Z oraz z bufora specjalnego bez nazwy. Informacje o zawartości buforów nazwanych są drukowane zleceniem " w postaci:

<nazwa_bufora> <liczba_wierszy>

Wierszem bieżącym po skopiowaniu (Y) jest ostatni wiersz obszaru a po przeniesieniu (D) - pierwszy wiersz za przeniesionymi.

Zlecenie U przenosi wiersze z powrotem do bufora roboczego (po kopiowaniu tylko je usuwa z bufora pomocniczego). Jeżeli zlecenie kopiowania lub przenoszenia wierszy do bufora pomocniczego było podane bez parametru >, to zlecenie U nie odtwarza poprzedniej zawartości bufora pomocniczego.

Bufor specjalny (bez nazwy) jest wykorzystywany także przy wykonywaniu innych zleceń niż D i Y. Gdy wykonywane jest zlecenie C, wiersze usunięte tym zleceniem są przenoszone do tego bufora. Także przy wykonywaniu zlecenia U po zleceniach I, A, C, RA i RI wiersze usunięte są przenoszone do bufora specjalnego (ponowne wykonanie zlecenia U przeniesie te wiersze z powrotem do bufora roboczego i bufor specjalny zostanie opróżniony).

Kopiowanie buforów pomocniczych do bufora roboczego

Składnia zlecenia: <wyrażenie_adresowe> <instrukcja_P> [<litera>]

działanie: zawartość bufora pomocniczego nazwanego literą jest kopiowana we wskazane miejsce bufora roboczego. Gdy nazwa bufora nie zostanie podana, skopiowany będzie specjalny bufor pomocniczy.

<instrukcja_P>:

  • PA - kopiowanie bufora za wskazany wiersz
  • PI - kopiowanie bufora przed wskazany wiersz

Wierszem bieżącym po wykonaniu zlecenie jest ostatni skopiowany wiersz (PA) lub wiersz wskazany wyrażeniem adresowym (PI). Zlecenie U usuwa skopiowany obszar.

Edycja wielu zbiorów

Edycja następnego zbioru

Składnia zlecenia: N <tytuł_zbioru>

Działanie: wskazany zbiór jest wczytywany do kolejnego bufora roboczego. Bufor roboczy otrzymuje kolejny numer i nazwę zgodną z tytułem zbioru podanym w zleceniu. Dotychczas poprawiany bufor jest zachowywany w zbiorach roboczych. Wskaźnik dostępu jest ustawiany na pierwszy wiersz bufora. Długość czytanego zbioru jest określona parametrami PA1 i PA2. Jeżeli wartość tych parametrów wykracza poza dopuszczalny zakres (lub jest niezgodna z parametrem LEN) sygnalizowany jest zły typ zbioru wejściowego i bufor nie jest otwierany. Jeżeli parametry PA1 i PA2 zbioru mają wartość 0, długość czytanego zbioru jest wyliczana z parametru LEN. Jeżeli zbiór o podanym tytule nie jest dostępny, wyprowadzany jest komunikat:

*** NEW FILE ***

i edytor przechodzi do wczytywania wierszy z końcówki - wykonywane jest niejawne zlecenie A. Po wprowadzeniu dc4 edytor kończy wprowadzanie i rozpoczyna edycję bufora ustawiając wskaźnik dostępu na ostatni wprowadzony wiersz. Wprowadzenie pustego zbioru (dc4 w pierwszym wierszu) powoduje powrót do edycji bufora poprawianego do tej pory.

Edycja innego bufora

Składnia zlecenia: E <wskazanie_bufora> [ ! _ <znak>]

Działanie: następuje przejście do edycji innego bufora. Bufor poprawiany do tej pory jest zachowywany w zbiorach roboczych.

<wskazanie_bufora>:

  • <tytuł_zbioru> - bufor roboczy o podanej nazwie
  • <numer_bufora> - bufor roboczy o podanym numerze
  • "<litera> - bufor pomocniczy o podanej nazwie
  • *[<litera>] - bufor pomocniczy zleceń
  • - - bufor poprawiany przed wykonaniem ostatniego zlecenia E lub N

Po przejściu do edycji bufora roboczego jest odtwarzany wskaźnik dostępu i znaczniki wierszy użyte w czasie poprzedniej edycji tego bufora. Po przejściu do edycji bufora pomocniczego wskaźnik dostępu jest ustawiany na pierwszy wiersz bufora a znaczniki wierszy są zerowane. Jeżeli wskazany bufor pomocniczy jest pusty, wyprowadzany jest komunikat:

*** NEW BUFFER ***

i edytor przechodzi do wprowadzania zawartości bufora z końcówki. Działanie edytora w czasie wprowadzania jest takie samo jak w czasie wykonywania zlecenia A. Podanie jako parametru znaku ! zmienia ustawienie opcji 'autotab' na przeciwne. Wprowadzanie jest kończone wpisaniem dc4 lub wiersza zawierającego tylko znacznik końca wprowadzania - znaku podanego w zleceniu E za wskazaniem bufora. Znacznikiem końca wprowadzania może być dowolny znak kodu ASCII poza znakami !, cr, dc4, lf i spacją. Edycja buforów pomocniczych niczym nie różni się od edycji buforów roboczych, z tym że niedozwolone jest użycie nazwy poprawianego bufora pomocniczego w zleceniu kopiowania lub przenoszenia wierszy.

Zmiana nazwy bufora roboczego

Składnia zlecenia: F <tytuł_zbioru>

działanie: nazwa aktualnie poprawianego bufora roboczego jest zamieniana na podaną w zleceniu. Nie dozwolone jest zmienianie nazwy bufora pomocniczego. Gdy w zleceniu nie jest podany tytuł zbioru, dotychczasowa nazwa bufora nie ulega zmianie, a na monitor są wyprowadzane informacje o poprawianym buforze roboczym w postaci:

E: <numer_bufora> <tytuł_zbioru> <liczba_wierszy_w_buforze>

lub pomocniczym:

E: <nazwa_bufora> <liczba_wierszy_w_buforze>

Listowanie informacji o buforach roboczych

Składnia zlecenia: FA

Działanie: na monitor są wyprowadzane informacje o wszystkich buforach roboczych. W pierwszym wierszu jest wyprowadzany opis bufora aktualnie poprawianego w takiej samej postaci jak zleceniem F. W dalszych - opis pozostałych buforów roboczych w podobnej postaci:

<numer_bufora> <tytuł_zbioru> <liczba_wierszy_w_buforze>

Opis bufora poprawianego poprzednio (dostępnego zleceniem E) jest poprzedzony znakiem -.

Wyprowadzanie zawartości bufora do zbioru

Składnia zlecenia: <opis_obszaru> <instrukcja_W> [> _ !] [<tytuł_zbioru>]

Działanie: opisany obszar bufora jest kopiowany do wskazanego zbioru. Jeżeli zbiór nie istnieje, jest tworzony. Gdy nie jest podany opis obszaru, kopiowany jest cały bufor.

<instrukcja_W>:

  • W - kopiowanie bufora
  • WQ - kopiowanie bufora i wykonanie zlecenia Q
  • > - wskazany obszar jest dołączany do istniejącego zbioru
  • ! - pozwolenie na zapisanie zawartości bufora do zbioru już istniejącego (wymagane tylko wtedy, gdy jest podany tytuł zbioru)

Gdy zostanie podany tytuł zbioru już istniejącego, wymagane jest podanie jednego z parametrów ! lub >. Inaczej zostanie wyprowadzony komunikat:

FILE ALREADY EXIST: <tytuł_zbioru> ( !, > OR CR ) ?

Po znaku zapytania należy wprowadzić znak:

  • > - wskazany obszar będzie dołączony do zawartości zbioru
  • !< - zawartość zbioru będzie zniszczona
  • cr - zlecenie nie będzie wykonane

Jeżeli nie jest podany tytuł zbioru, obszar będzie skopiowany do zbioru o tytule takim jak nazwa poprawianego bufora roboczego. Gdy jest poprawiany bufor pomocniczy, tytuł zbioru jest obowiązkowy. Wierszem bieżącym po wykonaniu instrukcji W jest ostatni skopiowany wiersz. Gdy zostanie wykonana instrukcja WQ, wierszem bieżącym zapamiętanym w zbiorze roboczym będzie wiersz dostępny w momencie wprowadzania zlecenia.

Globalne wykonywanie zleceń

Składnia zlecenia: [<opis_obszaru>] G[^][?]/<wzorzec> [/<zlecenie>]

Znaczenie: na wszystkich wierszach opisanego obszaru zgodnych z podanym wzorcem (lub niezgodnych - jeżeli jest podany parametr ^) będzie wykonane wskazane zlecenie. Wskazany obszar musi zawierać więcej niż jeden wiersz. Jeżeli opis obszaru nie zostanie podany, przeszukany zostanie cały bufor. Wzorzec ma składnię i znaczenie opisane w 3.2. Pusty wzorzec oznacza przyjęcie wzorca użytego w ostatnim zleceniu przeszukiwania bufora. Zleceniem G można wykonywać zlecenia: D, A, I, C, RA, RI, P, L, #, Z, S, &, @, %, _~, J, CL, LU, UL, W, Y, PA, PI i O. Jeżeli zlecenie nie zostanie podane, wiersze wskazane wzorcem będą wyświetlone na monitorze w postaci określonej przez opcje listowania. Parametry zlecenia:

  • ^ - zlecenie dotyczy wierszy niezgodnych z podanym wzorcem
  • ? - zlecenie będzie wykonane na wierszach wskazanych wzorcem i parametrem ^, ale dopiero po akceptacji użytkownika. Edytor przed wykonaniem zlecenia wyświetla zawartość wiersza i oczekuje na wprowadzenie znaku akceptacji:
    • + zlecenie będzie wykonane
    • cr zlecenie nie będzie wykonane
    • dc4 zlecenie nie będzie wykonane i pozostałe wiersze wskazanego obszaru nie będą analizowane

Jeżeli parametr ? nie jest podany, wiersze na których ma być wykonane zlecenie są także wyświetlane na monitorze, ale zatrzymanie wydruku następuje dopiero po zapełnieniu ekranu (zgodnie z ustawieniem opcji 'linecount'). Wprowadzenie cr wznawia wykonanie zlecenia, natomiast dc4 - kończy je. Po wykonaniu całego zlecenia G jest wykonywane automatycznie zlecenie P wyświetlające na monitorze wiersz dostępny w tym momencie (chyba, że wierszem bieżącym jest ostatni wyświetlony wiersz). Zlecenie U cofa wszystkie wykonane zmiany.

Wykonywanie poprawek w trybie niekonwersacyjnym

Zmiana strumienia zleceń

Składnia zlecenia: <wyrażenie_adresowe> INT [<tytuł_zbioru>]

Działanie: wskaźnik dostępu do bufora jest ustawiany na wskazany wiersz i dalsze zlecenia edytor będzie pobierał z podanego zbioru. Rozpoznanie znacznika końca zbioru spowoduje powrót do strumienia, z którego zostało pobrane zlecenie INT (dozwolone jest zagłębianie zleceń INT). Jeżeli zlecenia są pobierane ze zbioru, to wykrycie błędnego zlecenia lub wykonanie zlecenia INT bez podanej nazwy zbioru spowoduje przejście do trybu konwersacyjnego. Do pobierania dalszych zleceń ze zbioru można powrócić wprowadzając (w trybie konwersacyjnym) zlecenie INT bez podanej nazwy zbioru.

Bufory zleceń

Składnia zlecenia: <wyrażenie_adresowe> *[<litera>] [<liczba>$]

Działanie: wskaźnik dostępu do bufora jest ustawiany na wskazany wiersz, po czym są wykonywane wszystkie zlecenia zapisane we wskazanym buforze zleceń. Można używać 26 buforów o nazwach A do Z oraz jednego bufora bez nazwy. Parametr podany za nazwą bufora oznacza liczbę wykonań tych zleceń. Podanie zamiast liczby wykonań znaku $ oznacza wykonywanie zleceń zawartych w buforze aż do wystąpienia błędu. Bufory zleceń są tworzone zleceniem E * i mogą być poprawiane tak samo jak inne bufory pomocnicze. Informacje o używanych buforach zleceń są wyprowadzane wraz z informacjami o innych buforach zleceniem ".

Zlecenia komentarza

Składnia zlecenia: COM <łańcuch>

Znaczenie: wiersz zawierający to zlecenie jest ignorowany.

Składnia zlecenia: MES <łańcuch>

Znaczenie: wiersz zawierający to zlecenie jest wyprowadzany na monitor.

Wykonywanie zleceń OSL-a

Składnia: !<zlecenie_OSL-a>

Działanie: łańcuch podany za znakiem ! zostanie przekazany procesowi obsługi operatora jako zlecenie. Składnia tego zlecenia powinna być zgodna ze składnią akceptowaną przez OSL. Przekazane zlecenie zostanie uruchomione w tle (nie należy go kończyć znakiem & oznaczającym wykonanie w tle). Uwaga: zlecenia wykonywane w podany wyżej sposób nie powinny korzystać z końcówki.

Działanie w sytuacjach awaryjnych

W tym rozdziale są opisane działania mające uchronić użytkownika przed stratami w przypadku awarii systemu, sprzętu, braku zasobów lub w innych sytuacjach, gdy wykonywanie edycji zostanie przerwane. Jak to już zostało opisane, stan poprawianych buforów jest zapisywany w zbiorach roboczych EXMLIN i EXMOPI. Część informacji o aktualnie poprawianym buforze ze względu na efektywność działania edytora przechowywana w pamięci edytora. Aby uchronić użytkownika przed zbytnimi stratami w przypadku awarii uniemożliwiającej dalsze wykonanie programu (na przykład pad systemu), co pewien czas (5 minut) wszystkie informacje o poprawianym buforze są kopiowane do zbiorów roboczych. Jeżeli po przerwaniu działania edytora, zostanie on ponownie wywołany bez podanej nazwy zbioru, wczyta ostatni zapamiętany stan edycji. Wszystkie poprawki wykonane przed ostatnim zrzutem będą zachowane. Poprawki wykonane później nie są zachowywane. Ponieważ zapamiętywany jest także wskaźnik dostępu łatwo ustalić, które poprawki nie zostały zapamiętane. Powyższe uwagi dotyczą sytuacji, gdy po przerwaniu działania edytor nie może zostać zrestartowany: po awarii systemu operacyjnego, sprzętu lub przy braku zasobów niezbędnych do dalszej edycji (np brak pamięci dyskowej). Po przerwaniu wykonywania przez OPRQ, komunikat, lub inne zewnętrzne przyczyny nie naruszające programu i jego otoczenia (stan rejestrów, pamięć, przywiązane strumienie) działanie edytora należy wznowić zlecenie RS OSL-a. Z powyższych wywodów wynika, że należy stosować następującą zasadę: jeżeli działanie edytora zostało przerwane z komunikatem EXM FINISH lub EXM STOPPED, należy je wznowić zleceniem RS. We wszystkich innych przypadkach należy usunąć edytor zleceniem DE EXM i wywołać go bez podanej nazwy poprawianego zbioru.

Alfabetyczny spis instrukcji edytora EXM

  • A - dołączanie wierszy za wierszem wskazanym
  • C - zmiana wierszy na nowe
  • CA - kopiowanie wierszy za wskazany
  • CI - kopiowanie wierszy przed wskazany
  • CL - usunięcie znaków kontrolnych
  • COM - komentarz
  • D - usunięcie wierszy i wstawienie ich do bufora pomocniczego
  • E - poprawianie innego bufora
  • F - nazwa bufora roboczego
  • FA - opis buforów roboczych
  • G - instrukcja globalna
  • I - wstawienie wierszy przed wierszem wskazanym
  • INT - zmiana strumienia zleceń
  • J - połączenie wierszy
  • L - listowanie ze znakami kontrolnymi
  • LU - zamiana liter małych na duże
  • M - definiowanie znacznika wiersza
  • MA - przenoszenie wierszy za wiersz wskazany
  • MI - przenoszenie wierszy przed wiersz wskazany
  • MES - komentarz wyprowadzany na monitor
  • N - edycja nowego zbioru
  • O - bezpośrednie poprawianie wierszy
  • P - listowanie bez znaków kontrolnych
  • PA - kopiowanie bufora za wiersz wskazany
  • PI - kopiowanie bufora przed wiersz wskazany
  • Q - usunięcie edytora
  • RA - wczytanie zbioru za wierszem wskazanym
  • RI - wczytanie zbioru przed wierszem wskazanym
  • S - zamiana łańcuchów
  • SET - ustawienie opcji
  • U - cofnięcie zmiany
  • UL - zamiana liter dużych na małe
  • W - wyprowadzenie bufora do zbioru
  • WQ - wyprowadzenie bufora do zbioru i usunięcie
  • Y - kopiowanie obszaru do bufora pomocniczego
  • Z - listowanie 7 wierszy
  • & - powtórzenie zlecenia podstawienia
  • @ - powtórzenie podstawienia
  • % - podstawienie odwrotne
  • ~ - zamiana łańcucha szukanego
  • " - bufory pomocnicze
  • * - bufor zleceń
  • ' - znaczniki wierszy
  • # - listowanie z numeracją wierszy
  • = - definicja zmiennej generacyjnej
  • \ - listowanie zmiennych generacyjnych

Standardowe definicje wyrażeń regularnych

Wraz z edytorem są dostarczane zbiory zawierające definicje zmiennych generacyjnych opisujące pewne typowe i najczęściej używane struktury wyrażeń regularnych. Wprowadzenie tych definicji do edytora jest wykonywane zleceniem INT, w którym zostanie podany tytuł zbioru zawierającego żądany zestaw definicji. Jeżeli użytkownik ma zamiar na stałe korzystać z tych definicji, może do zbioru EXMINI zapisać wybrane definicje albo wywołanie wybranych zbiorów zleceniem INT.

Zbiory MAGIC i NOMAG zawierają definicje typowych i najczęściej stosowanych sekwencji wyrażeń regularnych. Zbiór MAGIC zawiera definicje w postaci wymaganej przy zapalonej opcji 'magic' (MG), natomiast zbiór NOMAG - przy zgaszonej (NMG). Definicje są następujące (przy opcji 'magic' zapalonej MG):

  • =D[0-9] - cyfra 0..9
  • =L[a-zA-Z] - litera A..Z a..z
  • =X{255,0} - krotność od dowolnej do 0 (odpowiednik *)
  • =Y{255,1} - krotność od dowolnej do 1 (odpowiednik +)
  • =N\(\D\Y - liczba poprzedzona znakiem nie będącym literą ani znakiem podkreślenia
  • =R.\X - pozostała część wiersza
  • =M[a-zA-Z0-9_]*\) - pozostała część nazwy
  • =Z\([a-zA-Z0-9_]+\) - dowolna nazwa
  • =W[^ht lf]*> - pozostała część słowa
  • =S<[^ht lf]+> - dowolne niepuste słowo
  • =T[^:]\Y - etykieta (niepusty ciąg znaków ograniczonych znakiem :)
  • =P!.*! - rozdziela wzorzec na części
  • =Q\3\2\1 - zmienne P i Q są wykorzystywane przy zamianie miejscami dwóch części wiersza i powinny być używane razem. Zlecenie: S/<część>\P<część>/\Q zamieni miejscami łańcuchy wskazane przez części wzorca. Gdy przestawiane części bezpośrednio stykają się ze sobą można także zapisać: S/<część>!<część>/\Q. Uwaga: Wzorzec użyty w zlecenie wykorzystującym zmienne P i Q nie powinien zawierać innych znaków ! dzielących go na części. Użycie dodatkowych znaków ! może spowodować przestawienie innych części niż zostało to podane. Na przykład zlecenie S/<część1>!<część2>!<część3>/\Q przestawi części pierwszą i trzecią.
  • =V\ - znak backslash \. Definicja taka jest niezbędna, gdy chcemy wprowadzać teksty zawierające litery poprzedzone znakiem \, a używamy zmiennych generacyjnych. Na przykład, jeżeli korzystamy z wcześniej opisanych definicji, to znaki \D zostaną po wprowadzeniu rozwinięte do ciągu [0-9], gdyż taki zapis oznacza zmienną generacyjną. Znaki \D zostaną wprowadzone do wiersza, dopiero jeżeli napiszemy: \VD .

Dalsze zbiory zawierają definicje słów (NWORDS i MWORDS) i nazw (NNAMES i MNAMES). Po wprowadzeniu jednego z tych zestawów definicji, zmienne a do z (małe litery) będą oznaczały słowa lub nazwy dowolnej długości rozpoczynające się od liter odpowiednio a lub A do z lub Z. Zbiory NNAMES i NWORDS zawierają definicje wymagane przy zgaszonej opcji 'magic' (NMG), natomiast MNAMES i MWORDS - przy zapalonej (MG). Użytkownik może użyć jednego z wyżej wymienionych zbiorów zależnie od potrzeb (w trakcie edycji można zmieniać definicje wczytując zleceniem INT inny zbiór definicji). Definicje wszystkich zmiennych mają podobną postać. Na przykład zbiór NWORDS zawiera definicje w postaci:

=a\<\[aA]\[^ht lf]\*\>

a zbiór NNAMES w postaci:

=a\(\[aA]\[a-zA-Z0-9_]\*\)

Przed wczytaniem definicji ustawiane są opcje NLU

Źródło: EXM - Edytor tekstowy dla systemu operacyjnego CROOK-4, Tadeusz Wilczek, INSTYTUT MASZYN MATEMATYCZNYCH, ul. Krzywickiego 34, Warszawa, 1985.04.09