EXM: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
Dodane 968 bajtów ,  8 cze 2018
brak opisu edycji
(Utworzono nową stronę "= 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...")
 
Nie podano opisu zmian
Linia 13: Linia 13:
  *** NEW FILE ***
  *** 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:
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
  EMPTY FILE
Linia 19: Linia 19:
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 <code>W</code>. 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): <code>W <tytuł_zbioru></code>. Wyjście z edytora następuje po wprowadzeniu zlecenia <code>Q</code>. Wyprowadzenie zbioru i wyjście z edycji można wykonać jednym zleceniem <code>WQ [<tytuł_zbioru>]</code>.
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 <code>W</code>. 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): <code>W <tytuł_zbioru></code>. Wyjście z edytora następuje po wprowadzeniu zlecenia <code>Q</code>. Wyprowadzenie zbioru i wyjście z edycji można wykonać jednym zleceniem <code>WQ [<tytuł_zbioru>]</code>.


Po wprowadzeniu zleceń <code>Q</code> i <code>WQ</code> 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 <code>RS</code>.
Po wprowadzeniu zleceń <code>Q</code> i <code>WQ</code> 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 <code>RS</code>.


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


== Wyrażenia adresowe ==
== Wyrażenia adresowe ==
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 72:
== 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 80:
== 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ć instrukcje C 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 94: Linia 94:
   ^<litera>
   ^<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 <code>P</code>: <code>,/^stop/P</code> 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 <code>Z</code>. 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:
(przykładowo '''^I''' oznacza znak tabulacji '''ht'''). Inne znaki nie wyświetlane są wyprowadzane jako spacje. Jeżeli w zleceniu listowania zostanie podana instrukcja <code>P</code>: <code>,/^stop/P</code> 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 <code>Z</code>. 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:


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


Instrukcja <code>Z</code> nie zmienia wiersza bieżącego. Może być poprzedzona adresem wiersza (stanie się on wierszem bieżącym).
Instrukcja <code>Z</code> nie zmienia wiersza bieżącego. Może być poprzedzona adresem wiersza (stanie się on wierszem bieżącym).
Linia 110: Linia 110:
  a=y+2 - wiersz po zmianie
  a=y+2 - wiersz po zmianie


Ł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 <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ń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:


  LWT,R1,0. RW,A(BUF3)
  LWT,R1,0. RW,A(BUF3)
Linia 121: Linia 121:
Jeżeli w zleceniu zostanie podany opis obszaru, przykładowo: <code>1,$S/tekst/text</code>, 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 <code>U</code> wykonana po zleceniu <code>S</code> cofa wszystkie zmiany wykonane tym zleceniem.
Jeżeli w zleceniu zostanie podany opis obszaru, przykładowo: <code>1,$S/tekst/text</code>, 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 <code>U</code> wykonana po zleceniu <code>S</code> 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:
W podanych przykładach podstawienia były wykonywane tylko na pierwszych łańcuchach zgodnych ze wzorcem. Podanie za łańcuchem wstawianym znaku <code>G</code> oznacza, że wszystkie zgodne ze wzorcem łańcuchy w wierszu mają być zamienione:


  a=x1+a
  a=x1+a
Linia 133: Linia 133:
  a3=x1+a2-b+ab
  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: <code>S/a/b/-2+1</code> lub <code>S/a/b/-2 1</code> Podanie po ciągu znaków '''+''' , '''-''' znaku '''G''' 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> 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
Linia 139: Linia 139:
  a3=x1+a2+b+b
  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:
Użycie znaku <code>&</code> zamiast schematu podstawienia oznacza przyjęcie schematu podstawienia użytego w ostatnim zleceniu podstawienia. Jeżeli schemat podstawienia zostanie zakończony znakiem <code>?</code>, wszystkie wskazane podstawienia będą wykonane dopiero po akceptacji. Oto przykład:


  aa3=x1+aa2+aa+ab
  aa3=x1+aa2+aa+ab
Linia 151: Linia 151:
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:
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 nie jest wykonywane
* + - podstawienie jest wykonywane
* '''+''' - podstawienie jest wykonywane
* G - wykonywane jest podstawienie tego i wszystkich pozostałych łańcuchów w wierszu zgodnych ze wzorcem
* '''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
* '''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.
* '''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 <code>S</code> ma jeszcze specjalne warianty:
Instrukcja <code>S</code> ma jeszcze specjalne warianty:


* <code>S//<łańcuch></code> - zamiana ciągu znaków określonych przez wzorzec użyty w ostatnio wykonanej operacji przeszukiwania bufora na podany w zleceniu.
* <code>S//<łańcuch></code> - zamiana ciągu znaków określonych przez wzorzec użyty w ostatnio wykonanej operacji przeszukiwania bufora na podany w zleceniu.
* <code>&</code> - ponowne wykonanie ostatniej instrukcji S.
* <code>&</code> - ponowne wykonanie ostatniej instrukcji <code>S</code>.
* <code>&/<łańcuch></code> - zamiana łańcucha wskazanego przez wzorzec użyty w ostatnio wykonanej instrukcji podstawienia na podany łańcuch.
* <code>&/<łańcuch></code> - zamiana łańcucha wskazanego przez wzorzec użyty w ostatnio wykonanej instrukcji podstawienia na podany łańcuch.
* <code>~</code> - 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.
* <code>~</code> - 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 <code>S</code>.
* <code>~/<łańcuch></code> - ta postać jest równoważna nieco dłuższej, już opisanej <code>S//<łańcuch></code> - 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 <code>U</code>)
* <code>~/<łańcuch></code> - ta postać jest równoważna nieco dłuższej, już opisanej <code>S//<łańcuch></code> - 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 <code>U</code>)
* <code>%/<łańcuch></code> - powyższe zlecenie zamieni łańcuch wstawiony w ostatnim zleceniu podstawienia na podany łańcuch.
* <code>%/<łańcuch></code> - powyższe zlecenie zamieni łańcuch wstawiony w ostatnim zleceniu podstawienia na podany łańcuch.
Linia 216: Linia 216:
  *** NEW FILE ***
  *** NEW FILE ***


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


  EMPTY FILE
  EMPTY FILE
Linia 226: Linia 226:
* <code>E-</code>
* <code>E-</code>


Zlecenie <code>E</code> w ostatniej postaci odtwarza bufor, który był poprawiany przed wykonaniem ostatniego zlecenia <code>N</code> lub <code>E</code>. Zlecenie <code>E</code> 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 <code>FA</code> w postaci podobnej jak zleceniem <code>F</code>. 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 <code>E-</code>) jest poprzedzony znakiem -. Oto przykładowa sekwencja wyżej opisanych zleceń:
Zlecenie <code>E</code> w ostatniej postaci odtwarza bufor, który był poprawiany przed wykonaniem ostatniego zlecenia <code>N</code> lub <code>E</code>. Zlecenie <code>E</code> 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 <code>FA</code> w postaci podobnej jak zleceniem <code>F</code>. 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 <code>E-</code>) jest poprzedzony znakiem '''-'''. Oto przykładowa sekwencja wyżej opisanych zleceń:


  EXM FILA - wywołanie edytora
  EXM FILA - wywołanie edytora
Linia 253: Linia 253:
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 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: <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 272: Linia 272:
* '''<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:


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


=== Wywołanie edytora ===
=== Wywołanie edytora ===
Linia 287: Linia 287:
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:
'''<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:
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>
  E: 0 <tytuł_zbioru> <liczba_wierszy>
Linia 295: Linia 295:
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.
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:
Jeżeli zbiór o podanym tytule nie istnieje, 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 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 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:


  EMPTY FILE
  EMPTY FILE
Linia 307: Linia 307:
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.
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.
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.
'''<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 ===
=== Zakończenie pracy edytora ===
Linia 319: Linia 321:
  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 329: Linia 331:
* wartość zmiennych generacyjnych
* 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 <code>RS<//code> OSL-a.
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 <code>Q</code>, zapamiętywany w zbiorach roboczych. Wznowienie pracy edytora następuje zleceniem <code>RS<//code> OSL-a.


=== Zlecenia edytora ===
=== Zlecenia edytora ===
Linia 335: Linia 337:
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):
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 (II.2.2.) i zamiana kodów oktalnych (II.2.4)
* makrorozwinięcie i zamiana kodów oktalnych,
* zamiana małych liter na duże (II.2.4.)
* zamiana małych liter na duże,
* usunięcie znaków kontrolnych (II.2.4.)
* 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).
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).
Linia 345: Linia 347:
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 = (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 (4.1).
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 (4.1).


=== Opcje edycji ===
=== Opcje edycji ===
Linia 355: Linia 357:
Opcje (pełen opis przy zleceniach, na które działają):
Opcje (pełen opis przy zleceniach, na które działają):


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


Po wywołaniu edytora stan opcji jest taki jak po ustawieniu:
Po wywołaniu edytora stan opcji jest taki jak po ustawieniu:
Linia 380: Linia 382:
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.


Opcja 'clear' działa na znakach kontrolnych:
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.
* 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
* NCL - znaki kontrolne są pozostawiane bez zmian


Linia 397: Linia 399:
* NAT - wiersze są wprowadzane bez zmian
* 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:
* 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)
** 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.
** 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':
Opcja 'shiftwidth' określa liczbę spacji kasowanych znakiem CTRL/C przy wprowadzaniu wierszy z ustawioną opcją 'autotab':
Linia 412: Linia 414:
Składnia: <code>U</code>
Składnia: <code>U</code>


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 <code>U</code>. Działanie zlecenia jest szczegółowo opisane dla każdego zlecenia zmieniającego zawartość bufora.
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 <code>U</code>. Działanie zlecenia jest szczegółowo opisane dla każdego zlecenia zmieniającego zawartość bufora.


== Adresowanie wierszy  ==
== Adresowanie wierszy  ==
Linia 418: Linia 420:
=== Wskaźnik dostępu do bufora ===
=== 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 (3.3):
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: <code><wyrażenie_adresowe></code>.


<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' :


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)
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).
Po wywołaniu edytora opcja 'step' jest zgaszona (NST).
Linia 431: Linia 431:
=== Wyrażenia regularne ===
=== 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 (3.3) i w zleceniach podstawienia (6.1).
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 ====
==== Opcje przetwarzania wyrażeń regularnych ====
Linia 437: Linia 437:
Opcja 'magic' ustala znaczenie specjalne pewnych znaków zawartych we wzorcach zawartości wierszy:
Opcja 'magic' ustala znaczenie specjalne pewnych znaków zawartych we wzorcach zawartości wierszy:


MG - znaki: . * + { [ ? < > % ! ~ _ zawarte we wzorcu zawartości wiersza (3.2.2) i znaki: & @ % zawarte we wzorcu łańcucha wstawianego (6.1) mają specjalne znaczenie. Znaczenie to tracą w miejscach, w których zostaną poprzedzone znakiem \.
* 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 '''\'''.
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 (punkty 3.2.2. i 6.1) należy te znaki poprzedzić 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:
Opcja 'ignorcase' decyduje o równoważności małych i dużych liter przy wyznaczaniu łańcucha zgodnego ze wzorcem:
Linia 454: Linia 453:
==== Wzorzec zawartości wiersza ====
==== Wzorzec zawartości wiersza ====


składnia (podana w postaci wymaganej przy zapalonej opcji 'magic' MG) :
Składnia (podana w postaci wymaganej przy zapalonej opcji 'magic' MG): <code><wzorzec> ::= [^] [<część>] {!<część>} [$]</code>
 
<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 (6.1).
 
<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 :
* <code>^</code> - oznacza, że łańcuch wskazany wzorcem ma rozpoczynać wiersz
* <code>$</code> - oznacza, że łańcuch wskazany wzorcem ma kończyć wiersz
* <code>!</code> - 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.


<znak> - wskazany znak
<część> ::= <fragment> { _ <fragment>}
. - 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> }
<code>_</code> - rozdziela fragmenty alternatywne - odpowiednia część łańcucha wskazanego wzorcem musi być zgodna z co najmniej jednym z fragmentów. Przykładowo wzorzec: <code>IB_RZ!(ZMIEN)</code> opisuje wiersze zawierające łańcuchy: ''RZ(ZMIEN)'' lub ''IB(ZMIEN)''.


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


[^-a-d-Z-]]
<zbiór_znaków> ::= {<znak>-<znak> _ <znak> }


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 :
* <code><znak>-<znak></code> - podzbiór znaków o kodach (ASCII) zawartych między kodami wskazanych znaków (włącznie)
* <code><znak></code> - wskazany znak


\[^-a-d-Z-]]
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: <code>^</code> rozpoczynający opis zbioru, <code>-</code> rozdzielający parę dowolnych znaków, oraz <code>]</code> zamykający opis zbioru znaków. Znaki te poprzedzone znakiem <code>\</code> oznaczają siebie.


<krotność> : - określa liczbę elementów ciągu
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>


{<liczba>} - wskazana liczba
<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.
<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.


Znaki , i } zawarte w tym elemencie mają zawsze specjalne znaczenie niezależnie od ustawienia opcji 'magic'.
Znaki <code>,</code> i <code>}</code> 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:
Krotność może być podana także w skróconej formie:


* * - równoważne {,}
* <code>*</code> - równoważne {,}
* + - równoważne {1,}
* <code>+</code> - równoważne {1,}
* ? - równoważne {0,1}
* <code>?</code> - równoważne {0,1}


<ogranicznik> - opisuje znaki leżące obok:
<ogranicznik> - opisuje znaki leżące obok:
Linia 519: Linia 503:
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'.
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:
<code><symbol_łańcucha></code> - w miejscu wystąpienia tego znaku zostanie wstawiony łańcuch:


* % - ostatni łańcuch wprowadzony zleceniem podstawienia  
* <code>%</code> - ostatni łańcuch wprowadzony zleceniem podstawienia  
* ~ - ostatni łańcuch znaleziony w operacji przeszukiwanie bufora
* <code>~</code> - 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 .
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 ===
=== Wyrażenie adresowe ===
Linia 534: Linia 518:
<adres_bezwzględny>:
<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 (2.2). Maksymalna długość stron jest ograniczona przez wartość opcji 'pagelenght' - standardowo 64 (4.1).
* <code>^<liczba></code> - 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 (II.4.1), wiersze są numerowane od początku bieżącej strony.
* <code><liczba></code> - 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
* <code>$</code> - ostatni wiersz w buforze
* . - wiersz bieżący
* <code>.</code> - wiersz bieżący
* '<litera> - wiersz wskazany przez znacznik wiersza (3.4)
* <code>'<litera></code> - 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).
* <code>''</code> - 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> :
<adres_względny>:


* + - wiersz następny
* + - wiersz następny

Menu nawigacyjne