EXM
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ć instrukcje 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 pierwszyZ-
- wiersz bieżący wyprowadzany jest jako ostatniZ=
- 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:
a=x1+2 - wiersz bieżący S/x1/y - instrukcja podstawienia 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 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:
LWT,R1,0. RW,A(BUF3) S/./.lf 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 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 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 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ż opisanejS//<ł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 zleceniaU
)%/<ł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żącymRI <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 wierszMI
- przeniesienie obszaru przed wskazany wierszCA
- skopiowanie obszaru za wskazany wierszCI
- 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 (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
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<//code> 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 (II.2.2.) i zamiana kodów oktalnych (II.2.4)
- zamiana małych liter na duże (II.2.4.)
- usunięcie znaków kontrolnych (II.2.4.)
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 (4.1).
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 (3.3)
- 'ignorcase' IC/NIC równość małych i dużych liter (3.2)
- 'magic' MG/NMG specjalne znaki we wzorcach (3.2)
- 'octalcod' OC/NOC przyjmowanie kodów oktalnych (2.4)
- 'lowtoupper' LU/NLU zamiana małych liter na duże (2.4)
- 'clear' CL/NCL usuwanie znaków kontrolnych (2.4)
- 'autoprint' AP/NAP automatyczne drukowanie (4.1)
- 'listcontrol' LC/NLC listowanie znaków kontrolnych (4.1)
- 'step' ST/NST wyprowadzanie po cr (3.1)
- 'number' NU/PNU/NNU numerowanie wierszy (4.1)
- 'pagelenght PLE długość strony (4.1)
- 'linecount' LIN/NLI długość ekranu (4.2)
- 'lenghtline' LEN/NLE długość linii monitora (4.1)
- 'autotab' AT/NAT automatyczna tabulacja (2.4)
- 'shiftwidth' SW długość tabulatora (2.4)
- 'Zwindow' ZW długość obszaru w zleceniu Z (4.3)
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 (3.3):
<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 (3.3) i w zleceniach podstawienia (6.1).
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 (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 \.
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 \.
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 (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 :
<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 (2.2). Maksymalna długość stron jest ograniczona przez wartość opcji 'pagelenght' - standardowo 64 (4.1).
- <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.
- $ - 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 (4.2)
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'(4.1).
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<//code>, 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'(4.1) i 'linecount'(4.2). Wierszem bieżącym po wykonaniu zlecenia jest wiersz wskazany przez wyrażenie adresowe.
Wyprowadzanie wierszy instrukcją globalną
Składnia zlecenia: [<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.
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 (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.
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 (2.2) i jest modyfikowana zgodnie z ustawieniem opcji 'octalcod', 'clear' i 'lowtoupper' (2.4).
<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 (7.2).
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 - 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).
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 (6.1)
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 (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.
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 (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.
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 * (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
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 (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.
Alfabetyczny spis instrukcji edytora EXM
- A - dołączanie wierszy za wierszem wskazanym (5.2)
- C - zmiana wierszy na nowe (5.3)
- CA - kopiowanie wierszy za wskazany (7.1)
- CI - kopiowanie wierszy przed wskazany (7.1)
- CL - usunięcie znaków kontrolnych (6.4)
- COM - komentarz (11.3)
- D - usunięcie wierszy (5.1)
- i wstawienie ich do bufora pomocniczego (7.2)
- E - poprawianie innego bufora (8.2)
- F - nazwa bufora roboczego (8.3)
- FA - opis buforów roboczych (8.4)
- G - instrukcja globalna (10.)
- I - wstawienie wierszy przed wierszem wskazanym (5.2)
- INT - zmiana strumienia zleceń (11.1)
- J - połączenie wierszy (6.6)
- L - listowanie ze znakami kontrolnymi (4.2)
- LU - zamiana liter małych na duże (6.5)
- M - definiowanie znacznika wiersza (3.4)
- MA - przenoszenie wierszy za wiersz wskazany (7.1)
- MI - przenoszenie wierszy przed wiersz wskazany (7.1)
- MES - komentarz wyprowadzany na monitor (11.3)
- N - edycja nowego zbioru (8.1)
- O - bezpośrednie poprawianie wierszy (6.3)
- P - listowanie bez znaków kontrolnych (4.2)
- PA - kopiowanie bufora za wiersz wskazany (7.3)
- PI - kopiowanie bufora przed wiersz wskazany (7.3)
- Q - usunięcie edytora (1.2)
- RA - wczytanie zbioru za wierszem wskazanym (5.4)
- RI - wczytanie zbioru przed wierszem wskazanym (5.4)
- S - zamiana łańcuchów (6.1)
- SET - ustawienie opcji (2.3)
- U - cofnięcie zmiany (2.5)
- UL - zamiana liter dużych na małe (6.5)
- W - wyprowadzenie bufora do zbioru (9)
- WQ - wyprowadzenie bufora do zbioru i usunięcie (9)
- Y - kopiowanie obszaru do bufora pomocniczego (7.2)
- Z - listowanie 7 wierszy (4.3)
- & - powtórzenie zlecenia podstawienia (6.2)
- @ - powtórzenie podstawienia (6.2)
- % - podstawienie odwrotne (6.2)
- ~ - zamiana łańcucha szukanego (6.2)
- " - bufory pomocnicze (7.2)
- * - bufor zleceń (11.2)
- ' - znaczniki wierszy (3.4)
- # - listowanie z numeracją wierszy (4.2)
- = - definicja zmiennej generacyjnej (2.2)
- \ - listowanie zmiennych generacyjnych (2.2)
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