Cui i-e frică de Emacs?

Mihai BUDIU - budiu@cs.cornell.edu
http://www.cs.cornell.edu/Info/People/budiu/budiu.html

21 martie 1997


Contents

Subiect:
Comenzile esențiale ale editorului Emacs
Cuvinte cheie:
editor de texte
Cunoștințe necesare:
un editor de texte

Sunt un mare fan al editorului de texte Emacs. Nu am devenit dintr-o dată: prima oară cînd mi s-a sugerat să învăț să-l folosesc am strîmbat din nas după 15 minute de citit manualul introductiv. ``Prea multe lucruri de memorat, nici o regulă, nu aranjează frumos în pagină, ce-mi trebuie mie ceva așa de sofisticat'' -- motive ca să amîn.

Ei bine, recunosc, am greșit. Emacs este un program foarte simpatic, foarte eficient și foarte flexibil. Atît de flexibil încît mai am foarte multe lucruri de învățat despre el, deși îl folosesc de 4 ani și adaug mereu cunoștințe.

Nu, nu plecați. Nu am spus asta ca să vă descurajez, ci dimpotrivă! Ideea pe care vreau s-o pun în evidență este că se pot învăța foarte repede toate funcțiile esențiale din Emacs, care sunt utile (și suficiente) pentru treburile de zi cu zi. Dacă folosiți în mod regulat un calculator pentru a scrie texte (de orice fel: programe, articole, scrisori), ar fi o idee bună să învățați să folosiți Emacs, pentru că vă va permite ca în scurtă vreme să faceți aceste lucruri mai repede și mai eficient decît multe alte editoare.

Dacă nu sunteți un sofisticat nimeni nu vă împinge la a folosi cantitatea nesfîrșită de resurse pe care Emacs le pune la dispoziție: puteți să vă mulțumiți cu puțin. Dacă sunteți însă un împătimit al calculatoarelor, Emacs se poate dovedi o sculă foarte eficientă pentru multe dintre activitățile dumneavoastră, și atunci merită într-adevăr să-l învățați.

Articolul acesta este foarte elementar; nu își propune deloc să pună în evidență toată puterea care se ascunde sub acest motor de programe interactive (Emacs este folosit pentru multe alte lucruri decît scrierea de texte: cam toate activitățile de natură interactivă: căutarea prin fișiere, plimbatul pe web, depanarea programelor sunt toate activități la care Emacs poate ajuta). Din această cauză foarte adesea nu vom spune tot adevărul cu privire la anumite lucruri, ci doar atît cît este nevoie.

Există mai multe ``digest''-uri (sumare) cu comenzile esențiale Emacs în circulație. Întîmplător nici unul nu mi s-a părut foarte sintetic, așa că m-am apucat să mai fac eu încă unul.

Terminologie

Probabil cea mai grea este pentru un începător problema terminologiei; Emacs are nume foarte precise pentru tot felul de componente, pe care le folosește în mod uniform în toate documentațiile. De aceea este foarte important să știm ce este un ``buffer'', o fereastră (``window''), marcă (``mark'') și punctul (``point'').

Două motive mă îndeamnă să păstrez numele originale ale comenzilor și termenilor, în engleză:

Din păcate aceste două motive vor face textul românesc să fie amplu pigmentat cu cuvinte englezești. Cred că aceasta va fi multă vreme soarta scrierilor despre calculatoare.

Buffer = zonă de lucru separată.

Una din trăsăturile foarte utile ale lui Emacs este că poate lucra cu mai multe fișiere simultan. Fiecare fișier este deschis pentru inspectare/modificare într-un ``buffer'' diferit. La un moment dat numai unele dintre buffere sunt vizibile utilizatorului; celelalte sunt ascunse undeva ``în spate'', dar conțin fișierele așa cum au fost ele modificate. În fiecare clipă unul dintr buffere este cel ``curent'': în care se petrece acțiunea.

Window = un buffer vizibil.

Fiecare fișier este prelucrat într-un buffer care-i aparține. Numai unele dintre buffere sunt însă vizibile. Emacs afișează la un moment dat la un moment numai unele dintre buffere. Fiecare buffer vizibil este arătat într-o fereastră (``window''). Numărul de ferestre vizibile este variabil, controlat de utilizator. Bufferul curent este întotdeauna într-o fereastră.

Cursor = locul curent unde se acționează

Noțiunea de cursor este familiară tuturor editoarelor de texte; cursorul este locul unde următorul caracter va fi inserat/șters. Emacs încearcă să arate cursorul ca pe un dreptunghi mic negru.

Point = poziția curentă într-un buffer

Fiecare buffer are propriul lui punct. Caracterele apăsate sunt inserate în text în locul unde se află punctul. Diferența dintre cursor și punct este că există un punct în fiecare buffer, dar unul singur dintre puncte este și cursor, cel din buffer-ul curent.

Minibuffer = locul pentru dialoguri cu Emacs

Unul dintre buffere este rezervat pentru dialogul cu Emacs; acolo Emacs raportează rezultatele comenzilor, afișează combinațiile de taste care au fost apăsate parțial.

Figure 1: Emacs în acțiune.
\begin{figure}\centerline{\epsfxsize=16cm\epsffile{emacs.eps}}\end{figure}

Figura 1 arată un editor Emacs în acțiune. Sunt vizibile 3 ferestre, fiecare desigur cu un buffer. (Mai există încă un buffer care nu e vizibil).

Mode line = raportul stării curente

Fiecare buffer are la bază o linie care de obicei este tipărită pe fond negru, care sumarizează lucrurile importante despre acel buffer. Printre altele linia arată ce fișier este prezent în buffer, dacă fișierul a fost modificat, ``modul major și cele minore active'' în buffer (vedeți ceva mai jos), poziția cursorului (relativă și absolută = linie/coloană). Utilizatorul poate influența ce informații să apară pe linia de mod, așa că forma ei nu este întotdeauna aceeași. Nu o să-i consacrăm prea mult spațiu în acest articol.

mark = o poziție marcată în buffer

Așa cum fiecare buffer are un punct, fiecare poate avea și o ``marcă''. Marca este o poziție a punctului indicată de utilizator; practic atunci cînd utilizatorul vrea pentru un motiv oarecare să-și amintească o anumită poziție, pune punctul acolo și apasă o combinație de taste. Locul acesta este marcat.

region = zona dintre punct și marcă

În fiecare buffer partea cuprinsă între marcă (unde a fost pusă ultima oară) și punct se numește ``regiune''. Regiunea este extrem de utilă pentru că multe comenzi funcționează pe zone de text: de pildă corectură de texte, aranjarea în pagină, capitalizarea, ștergerea, etc. Pe anumite terminale regiunea este înfățișată cu altă culoare.

kill = a șterge text

Emacs ne pune la dispoziție multe comenzi pentru a șterge părți de text. În terminologia sa ștergerea unei părți de text ceva mai mari se numește ``omorîre'' (kill). Omorîrea este interesantă pentru că Emacs păstrează undeva în măruntaiele sale textele care au fost șterse, și permite accesul la ele, așa că ele nu sunt pierdute. Pentru a muta o bucată de text dintr-un loc într-altul ea este marcată cu o regiune, omorîtă și apoi pusă la loc.

yank = a pune la loc un text omorît

Acțiunea de a recupera un text omorît se numește ``to yank''. Emacs încearcă să țină minte cît se poate de multe texte omorîte (cît are memorie), în ceea ce se cheamă ``inelul cu texte omorîte'' (kill ring). E un inel pentru că la un moment dat texte omorîte vechi sunt ``uitate'' și textele noi omorîte sunt scrise peste ele. Emacs permite extragerea (yank) tuturor textelor din inel.

undo = a des-face ultima acțiune

Una din trăsăturile foarte plăcute ale lui Emacs este că ține minte foarte multe din operațiile făcute asupra textelor și permite des-facerea lor. Dacă ai șters părți mari de text, ai modificat altele, le-ai reordonat și apoi te-ai răzgîndit, Emacs îți permite să dai înapoi cît vrei.

mode (major/minor) = modul de lucru

Emacs este foarte flexibil: în funcție de tipul textelor pe care le editați permite efectuarea anumitor operații cu ușurință. De exemplu dacă scrieți programe permite aranjarea automată în pagină, căutarea variabilelor și funcțiilor în fișiere, compilarea, etc. Dacă scrieți texte în limbi ``naturale'' oferă o suită de comenzi pentru prelucrat fraze, paragrafe, cuvinte. Aceeași comandă înseamnă un lucru diferit dacă se scriu programe sau texte.

Practic modul major arată ce comenzi oferă Emacs. Astfel, există suite de comenzi speciale pentru următoarele tipuri de texte (lista este ne-exhaustivă!):

Modurile minore oferă operațiuni suplimentare și coexistă cu modurile majore. De exemplu moduri minore oferă salvare automată a fișierelor, aranjare automată în pagină, posibilitatea de a abrevia anumite texte, etc.

fill = a aranja text

Operația de a aranja textul în pagină în așa fel încît sa nu aibă liniile prea lungi se numește la Emacs ``fill'' (umplere).

C-x, M-x = Control-x, Meta-x

Emacs a fost proiectat să funcționeze pe aproape orice fel de terminal. Din cauza asta, Emacs încearcă să se descurce fără să folosească taste cu săgeți sau alte ciudățenii care nu se găsesc peste tot (dacă le aveți însă de obicei le puteți folosi).

Pentru o implementa funcționalitatea tastelor speciale Emacs folosește doar tastele ordinare prezente peste tot (litere, cifre, cîteva semne speciale) plus doar 2 taste speciale. Denumirile lor sunt CONTROL și META. Ele nu trebuie să existe întocmai pe tastatura dumneavoastră. ``Control'' este prezentă pe cele mai multe claviaturi. Meta e mai rară, și atunci de obicei tasta ``Alt'' îi ține locul. Pentru uniformitate însă se folosește peste tot numele de ``Meta''.

Control și Meta se folosesc numai în combinații cu alte taste, ca și shift-urile. Notația standard în Emacs pentru apăsarea simultană a lui Control cu x este C-x. Asta înseamnă că se apasă Control, se ține apăsată și se apasă apoi tasta x, după care se eliberează amîndouă.

Atenție: C-X este altceva decît C-x: prima se apasă cu 3 taste!, Control, Shift și X (e X mare), iar a doua numai cu Control și x. Există și combinații C-M-x: control, meta și x simultan (nu le folosesc prea des).

Dacă chiar nu aveți o tastă pentru Meta, se poate folosi tasta ESCAPE pentru acest scop, dar într-un mod diferit. Tasta ESCAPE se mai numește ``metafy'', pentru că apăsată separat face următoarea tastă să se comporte ca și cum ar fi apăsată cu Meta împreună. Cu alte cuvinte, următoarele acțiuni sunt echivalente:

Apăs Meta Apăs Escape
Apăs x Eliberez Escape
Eliberez Meta și x Apăs x
  Eliberez x

Anumite comenzi sunt formate din suite de taste. De exemplu comanda C-x C-s (care salvează fișierul din bufferul curent) înseamnă să se apese C-x, după care să se apese C-s. Comanda este complet diferită de C-x s. Dacă apăsați numai C-x Emacs va aștepta o urmare. Dacă ea nu vine suficient de repede, Emacs va scrie în minibuffer ce ați apăsat: C-x.

Taste fundamentale

Voi prezenta foarte puține taste, dar care practic folosesc cam 95% din timp. Voi încerca să arăt ca numele lor sunt foarte bine alese pentru a fi ușor de memorat. Ca dovadă (indirectă) că lucrurile stau așa, comenzile Emacs pentru editat texte au devenit folosite de din ce in ce mai multe programe interactive: shell-uri (bash, csh), managere de fișiere (git), Netscape, etc. În plus, toate modurile majore încearcă să folosească tastele cam în același fel: de exemplu ``P'' să însemne mereu ``înapoi'' (Previous).

Iată deci regulile mnemonice:

Tasta Mnemonică (în engleză) Traducere
p Previous Anterior
n Next Următor
b Back Înapoi
f Forward Înainte
v $\downarrow$ În jos
e End Sfîrșit
a A Început
s Search Caută
r Reverse Search Caută invers
t Transpose Interschimbă
d Delete Șterge
k Kill Omoară
y Yank Adu text omorît

Firește, anumite comenzi nu au nume atît de sugestive, dar era de așteptat. Iată ce cred că ar mai trebui știut:

De ce Emacs

Ca să vă îndemn mai tare să folosiți Emacs, iată o pagină de reclamă fără prea multe explicații. De-a lungul timpului veți învăța să folosiți și să apreciați aceste trăsături.

Anexă

Iată pe o pagină, condensate toate lucrurile importante spuse de-a lungul articolului. Cred că dacă tipăriți pagina asta și o țineți la-ndemînă în timp ce-nvățați Emacs, se poate dovedi foarte utilă.

Tabelul principal este în engleză, din cauza mnemonicilor și e ordonat pentru a ilustra înrudirile dintre comenzi.

                           Essential Emacs keys

C-@      Set Mark (also C-SPC)         M-w      Copy region in kill ring
C-a      Beginning of line             C-x 0    Delete this window
M-a      Beginning of sentence         C-x 1    Keep only this window
C-b      Back one char                 C-x 2    Split window vertically
M-b      Backward word                 C-x 3    Split window horizontally
C-d      Delete one char               C-x b    Select buffer by name
M-d      Delete word                   C-x C-b  List all buffers
DEL      Delete previous character     C-x C-c  Exit
M-DEL    Delete previous word          C-x C-f  Find a file and load it
C-e      End of line                   C-x C-w  Write in file (save as)
M-e      End of sentence               C-x d    Directory editor (file manager)
C-f      Forward one char              C-x k    Kill this buffer
M-f      Forward word                  C-x o    Move to other window
C-g      Abort current command         C-x s    Save all buffers
C-h i    Info help system              C-x u    Undo
C-k      Kill line                     C-y      Yank last killed text
M-k      Kill sentence                 M-y      Yank previous from kill ring
C-l      Refresh screen                C-z      Stop emacs
C-n      Next line                     M-/      Fill word automatically
C-p      Previous line                 M--      Same as C-u -1
C-r      Incremental search backward   M-c      Capitalize word
C-s      Incremental search forward    M-h      Make this paragraph region
C-SPC    Set mark here                 M-l      Lowercase word
C-t      Transpose characters          M-q      Fill paragraph
M-t      Transpose words               M-SPC    Delete space arount point
C-u      Numeric argument follows      M-u      Uppercase word
C-v      Page down                     M-x      Type command by name
M-v      Page up                       M-<      Beginning of buffer
C-w      Kill region                   M->      End of buffer

                        Moduri majore importante

text            Text (limbi normale)   gnus            Citit news
c               Limbajul C             tex             TeX
rmail           Citit mail             latex           LaTeX
mail            Scris mail             lisp            Lisp editting
dired           Manipulari fisiere     info            Help hipertext