dimarts, 7 de febrer del 2012

Linux: l'editor de text vi

En aquest segon lliurament d'apunts antics, li toca a l'editor vi; és útil quan administrem un Linux de forma remota amb telnet, i necessitem editar algun fitxer de configuració.

Contingut:
 



Introducció a l'editor vi
  • En Linux existeixen molts editors de text disponibles, com ara l'ex, l'ed, el vi o l'emacs. L'editor estàndard d'Unix System V és el vi.
  • L'editor vi està pensat per a l'ús dels programadors i no pas com a procés de text d'ús general orientat a usuaris. La seva interfície es poc amigable. En el seu disseny s'ha privilegiat la eficiència i no pas l'aspecte. Principalment l'usarem per a escriure scripts (programes del shell) i programes en 'C'.
  • vi funciona en qualsevol sistema Unix-Linux en modus text. En Linux Red Hat hi ha una versió evolucionada anomenada vim. Quan treballem en l'entorn de finestres (X-Windows) serà més eficient traballar amb l'editor emacs.
  • En principi vi sembla un editor molt senzill, peró descobrirem que té un munt de possibilitats i opcions que no podrem estudiar al complert per manca de temps.
  • Per a utilitzar adecuadament un procés de text hem de tenir correctament configurat el tipus de terminal que usem. Aixó ho fem amb la variable d'entorn TERM. Comproveu el seu valor:
$ echo $TERM
linux
Si TERM no conté la paraula linux, aleshores ho arreglem:
$ TERM=linux
$ export TERM
    En entorns UNIX TERM haurà de contindre la paraula ansi.
     
  • Quan treballem en vi sobre un cert fitxer aquest es manté inalterat ja que es crea una còpia en memòria sobre la que es treballa. Només si al sortir donem l'ordre de grabació es modificarà realment el fitxer original.

Com entrar a l'editor
$ vi
- Entra sense nom de fitxer. Escriurem text i donem el nom del fitxer al sortir.
$ vi fitxer
- Edita el fitxer. Si no existeix, el crea.
$ vi fitxer1 fitxer2
- Obra els dos fitxers. Primer mostra fitxer1. Quan tanquem fitxer1 mostra fitxer2. Si els volem editar els dos alhora caldrà crear finestres independents per cadascun (veure l'apartat de finestres més endavant).
$ vi +10 fitxer
- Obra el fitxer i es sitúa en la línia 10. És útil quan estem compilant el fitxer del text d'un programa i sabem que en la línia 10 hi ha un error.
$ vi + fitxer
- Obra el fitxer i es sitúa en la última línea.
$ vi -r fitxer
- Obra el fitxer en modus "recuperació". Útil només si el sistema s'ha penjat mentre modificavem el fitxer i volem recuperar tot el posible a partir de la últimacòpia de seguretat que ha fet el vi.
Modus de funcionament
  • Hi han dos modus de funcionament: el modus ordre i el el modus edició.
  • El modus ordre permet introduir tot tipus d'ordre dirigides a l'editor, com ara esborrar líneas, gravar els canvis, sortir de l'editor, etc. Quan entrem en vi, sempre estem en modus ordre. En modus ordre no podem introduïr text, només admet comandaments.
  • El modus edició permet treballar amb el text del fitxer. Algunes ordres es poden executar directament des del modus edició combinant la tecla CTRL amb altres.
  • Inicialment entrem al vi en modus ordre, pasem a modus edició per a treballar amb el text i després conmutem entre els modus ordre i text per fer modificacions. Finalment quan sortim del vi ho farem en modus ordre.
Tipus d'ordres
  • Totes les ordres s'ha de introduïr en el modus ordre.
  • Hi han dos tipus d'ordres: les ordres de l'editor (com ara sortir del vi) i els comandaments d'edició (com ara esborrar una línea o una paraula).
  • Les ordres de l'editor sempre comencen per dos punts (:) i es mostren en l'ùltima línea de la finestra de l'editor. Per exemple :q per sortir del vi.
  • Els comandaments d'edició per defecte no es mostren: simplement tecleixem el comandament i vi l'executa directament. Per exemple per esborrar la línea de text en la qual està el cursor piquem dos cops la lletra d (dd).

Canvi de mode de funcionament
  • Per canviar de modus ordre a modus edició premem la lletra i (apareix a l'última línea de la pantalla la paraula insert). Podem aleshores introduïr text.
  • Per canviar de modus edició a modus ordre premem la tecla ESC (escape). Desapareix la paraula insert de la pantalla.
Sortir de vi
  • Sortirem sempre des del modus ordre. Les opcions més interesants són:
:q
- Surt del vi sempre i quan no s'hagi modificat el fitxer
:q!
- Surt del vi sense grabar els canvis
:wq
- Guarda el fitxer i surt. El fitxer ha de tenir un nom assignat abans de sortir. Si el fitxer es nou i no té encara nom, primer l'haurem de donar-ne un abans de sortir. Per exemple:
:w fitxer
:q Executar ordres del shell sense sortir de vi
  • Des del modus ordre del vi podem executar programes i ordres del shell. Per exemple per veure els fitxers del directori actual des del vi escribim:

  • :!ls
  • També podem sortir temporalment al shell amb l'ordre :bash
  • Per tornar al vi després de haber sortit temporalment fem $ exit
 
 
 
Edició bàsica 
Moviment per dintre del text
  • En mode edició podem fer servir les fletxes de moviment estàndard del teclat
  • En mode ordre tenim, per exemple (no donem totes les possibilitats), les següents:

  •   j        moure una línia avall
     k       "            "   "       amunt
     0       anar al principi de la línia actual
     $       anar al final de la línia
     G      anar al final del fitxer
    1G    anar al principi del fitxer
    nG    anar a la línia "n" del fitxer. Exemple: 10G anirà a la línia 10
Suprimir caràcters
  • En vi quan suprimim caràcters, paraules o línies el que fem es passar-los a un buffer d'edició, es a dir que de fet no els esborrem sinó que els "retallem".
  • En mode edició, premem la tecla Supr.
  • En mode ordre tenim el comandament x que esborra el caràcter on està el cursor. Podem esborrar un número de caràcters indicant-lo abans. Per exemple 4x esborra quatre caràcters.
Suprimir paraules (modus ordre)
  • Amb el cursor situat en la primera lletra de la paraula premem dw (delete word). Si la paraula acaba en un signe de puntuació (coma, punt i coma, punt, etc) i també el volem esborrar junt amb la paraula premem dW
  • Podem suprimir un número de paraules. Per exemple per suprimir 3 paraules premem 3dw
Suprimir línies (mode ordre)
  • Situem el cursor en qualsevol punt de la línia i premem dd. Per esborrar un nombre de  línies premem 3dd (esborrar 3 línies).
Copiar text (mode ordre)
  • Per copiar la línia actual al buffer premem yy
  • Per copiar "n" línies començant per l'actual premem nyy
  • Per copiar des de la posició del cursor fins el final de la paraula premem yw
Moure text (mode ordre)
  • Primer copiem o esborrem el text, el qual en els dos casos quedarà copiat en el buffer d'edició, i després el recuperem amb el comandament p (paste).
Cerca i substitució de text (mode ordre)
  • Per buscar la propera aparició de la paraula "exemple" premem /exemple
  • Per seguir buscant la següent aparició premem n
  • Per buscar l'anterior aparició de la paraula "exemple" premem ?exemple
  • Per seguir buscant l'anterior aparició premem N
  • Per substituir text utilitzem un ordre de l'editor (recordem que les ordres de l'editor comencen per dos punts) amb la següent sintaxi:
    • :inici,final s/text1/text2/opcions
    - inici és la primera línia del fitxer des d'on comencem a executar l'ordre
    - final és la ultima línia del fitxer que quedarà afectada per l'ordre
    - s és l'ordre de substitució de text
    - text1 és el text a buscar i reemplaçar
    - text2 és el text que reemplaça a text1
    - opcions són paràmetres optatius. El més important és el paràmetre g (la g de global) que indica que efectúe totes les substitucions. Cas de no indicar-lo només efectuaria una substitució per cada línia del text.
    - Exemple: per substituir la paraula gener per febrer des de la línia 10 fins la 20 fem
    :10,20 s/gener/febrer/g
    - Per fer el mateix en tot el fitxer escriurem
    :1,$ s/gener/febrer/gInserir una línia
  • En mode edició premem Intro al principi o al final d'una de les línies existents.
  • Em mode ordre premem la lletra o
Repetició de pulsacions de tecles
  • Si escrivim unes línies (en modus edició) i després les volem repetir, passem a mode ordre (amb ESC) i premem . (punt) amb la qual cosa vi repetirà tot el que hem escrit anteriorment.

Cancel.lació i repetició de l'ùltima acció (modus ordre)
  • Premem la lletra u (undo, desfer acció).
  • Per desfer els canvis efectuats només en una línia premem U
  • Per repetir l'ùltima acció premem . (punt)

 
Buffers 
  • A banda del buffer estàndard d'edició (recordem, buffer: zona de memòria reservada per un programa per realitzar certes operacions habituals) vi en disposa d'altres: els buffers numerats i els buffers alfabètics. Tots ells s'accedeixen des del mode ordre.
  • Els buffers numerats van de l'u al nou. Formen un històric del buffer estàndard d'edició. Quan copiem alguna cosa en el buffer d'edició el seu contingut anterior no es perd sinó que es passa al buffer numerat 1. Si tornem a copiar un altre cosa en el d'edició aleshores el contingut d'u es passa al buffer dos i el d'edició es passa a l'u. Etc.
  • Per recuperar el contingut del buffer n premem, en modus ordre, np
  • Si només volem veure el contingut del buffer n primer premem np (copiar) i després u (desfer)
  • Els buffers alfabètics són d'ús particular de l'usuari. Hi han 26, des de l'a fins el z.
  • Per accedir a un buffer tenim la següent sintaxi: "xOrdre
- "           és el prefix que indica que accedim a un buffer alfabètic
- x           és la lletra que identifica al buffer
- ordre    indica qué és el que fem amb el buffer
  • Exemples d'ús dels buffers alfabètics:

  • - Per copiar (ordre Y) la línia actual al buffer a premem "aY
    - Per recuperar (ordre p) el contingut del buffer b premem "bp
    - Per esborrar la línia actual (ordre dd) i copiar-la en el buffer c premem "cdd 
    - Per esborrar la paraula actual (ordre dw) i copiar-la en el buffer z premem "zdw



 
Finestres
  • Podem dividir la finestra de l'editor en dues o més subfinestres que poden mostrar el mateix fitxer o bé diferents fitxers. És útil quan volem copiar part del contingut d'un fitxer en un altre (per exemple per aprofitar una part d'un programa en un altre). Habitualment no treballarem amb més de dues subfinestres.
  • Els comandaments de finestres s'accedeixen amb la combinació de tecles CTRL simultàniament amb la lletra w ( de windows, finestra en anglès). Abreviadament: CTRL + w (el signe + no es part del comandament, simplement indica que hem de prémer les dues tecles simultàniament).
  • Cada comandament tindrà, doncs, la sintaxi CTRL + w comandament
  • Per dividir la finestra actual en dues subfinestres idèntiques premem CTRL + w s  (la s vé de split, partir en anglès)
  • Per anar a la finestra superior premem CTRL + w j
  • Per anar a la finestra inferior premem CTRL + w k
  • Per tancar la finestra actual fem com si sortíssim del vi, premem :q o bé :wq o bé :q!
  • Per iniciar vi amb dues finestres: $ vi -o 2
  • Per editar un fitxer anomenat text en la finestra actual premem :e text

 
 
Opcions. Inicialització i configuració de l'editor
  • vi permet personalitzar el seu comportament modificant el valor de les seves variables d'entorn. Algunes d'aquestes variables són de tipus lògic: estàn activades o desactivades. Per canviar el valor de les variables tenim el comandament :set variable
  • Per veure totes les possibles opcions (hi han moltes!) premem :set all
  • Amb set all es mostren totes les opcions numèriques, de text i només les lògiques que estiguin activades
  • Per activar una opció lògica premem :set opció
  • Exemple: el mode edició s'indica per la paraula Insert degut a que la variable showmode està activada.

  • - Per desactivar-la premem :set noshowmode
    - Per tornar-la a activar premem :set showmode
  • Una opció interesant és la que activa la visualització dels comandaments d'edició que per defecte no es mostren mentre els premem. Per activar la visualització fem :set showcmd i per desactivar-la fem :set noshowcmd
  • Els canvis fets amb set no són permanents sinó que per el contrari només valen per la sessió actual d'edició. En surtir del vi es perden.
  • Si volem que una opció duri tota la nostre sessió (des de l'inici de la nostra connexió fins que fem exit per sortir) la definirem en la variable d'entorn EXINIT. Per exemple:

  • $ EXINIT='set showcmd'
    $ export EXINIT
  • Amb EXINIT les opcions es perden quan ens desconnectem del sistema.
  • Quan volem que les opcions siguin permanents, o bé tenim moltes opcions personalitzades, utilitzarem el fitxer d'inici del vi anomenat .exrc (els noms de fitxers que comencin per un punt solen estar reservats per fitxers d'inicialització com a norma). Per exemple des de la línia d'ordres del shell fem:
$ cat >.exrc            creem el fitxer d'inici del vi
set showcmd           opció 1: mostrar comandaments de l'editor
set visualbell          opció 2: quan passem del final del text la finestra farà "pampallugues"
set noshowmode     opció 3: no mostra Insert en el mode edició
CTRL+d                  fi del fitxer
$ vi                          entrem en vi per comprovar
:set all                    comproveu els valors de les opcions anteriors
  • Quan utilitzem simultàniament EXINIT i .exrc hem de tenir en compte que s'exclouen un a l'altre. En alguns sistemes el primer anul·la al segon (cas del Linux Red Hat per exemple) i en altres es a l'inrevés (cas de l'Unix System V).

 
 
L'ajuda de vi
  • vi té un sistema d'ajuda prou complert, malauradament està en anglès
  • Per accedir a l'ajuda en general premem en mode ordre :help
  • Per demanar ajuda sobre un comandament premem en mode ordre :help comandament
  • En una de les primeres pàgines de l'ajuda trobem un índex on les paraules temàtiques estan entre signes <,>.
  • Per "saltar" a l'ajuda sobre un tema situem el cursor sobre el tema i premem CTRL + ]
  • Per tornar enrere premem CTRL + t
  • Per sortir de l'ajuda premem :q



 Exercicis

  Pràctica: Introducció a vi


1. Crea en el teu directori personal un subdirectori docs per enmagatzemar fitxers de text. Situat dintre d'aquest subdirectori.
 
  2. Entra a l'editor sense especificar cap nom de fitxer. Introdueix el següent text, prement INTRO al final de cada línea:
L'editor estàndard d'UNIX es diu vi
L'editor vi és una evolució de l'editor ex
ex és un editor de líneas mentre que vi és un editor de pantalla
 
 
3. Guarda el fitxer al disc amb el nom primer.doc i surt del vi.
 
4. Comprova el contingut del text amb el comandament cat.
 
5. Torna a entrar en vi per modificar el fitxer primer.doc situant-te en l'ùltima línea. Afegeix el següent text després de l'ùltima línea:
vim és la versió Linux de l'editor estàndard vi
 
6. Sense sortir del vi, fes una còpia del fitxer primer.doc en el fitxer segon.doc
 
 
7. Salva el fitxer i surt del vi.
 
8. Comprova el contingut dels fitxer primer.doc i segon.doc . Són iguals? Perquè?

Pràctica: Edició bàsica en vi


1. Obre el fitxer docs/primer.doc
  2. Amb l'ordre corresponent, situat al final de la línia 3 del text
 
3. En la línia anterior i sense sortir del mode ordre, suprimeix la paraula pantalla
 
4. Copia el contingut de la línia 3 a la línia 1
 
5. Ves a la línia 4 i afegeix al final de la línia tres asteriscs "***"
 
6. Amb l'ordre corresponent, cerca totes les aparicions en el text de la paraula vi
 
7. Amb l'ordre corresponent, substitueix la paraula vi per la paraula vim en el text des de la
línia 1 fins la 3
 
8. Desfés els canvis realitzats en l'anterior exercici
 
9. Còpia les 3 primeres línies del fitxer al final del text
 
10. Guarda el text i surt del vi.
 
Pràctica: buffers i finestres de vi



1. Obre el vi per editar el fitxer primer.doc amb dues finestres
  2. Activa la segona finestra i obre en ella el fitxer segon.doc
 
3. Activa la primera finestra.
 
4. Còpia les línies primera i segona de primer.doc en el buffer alfabètic a
 
5. Activa la finestra de segon.doc
 
6. Ves a l'ùltima línia. Recupera el contingut del buffer alfabètic a
 
7. Ves a la primera línia de segon.doc i esborra-la.
 
8. Activa la finestra de primer.doc
 
9. Ves directament a la segona línia i recupera la línia que has esborrat en segon.doc
 
10. Guarda primer.doc i tanca la seva finestra
 
11. Surt de segon.doc sense guardar els canvis
 
 

Cap comentari:

Publica un comentari a l'entrada

Gestió d'usuaris i grups en Linux

Usuaris i grups Linux  Els comptes de Linux són com els comptes de Windows o MacOS; però els detalls no, així que cal explicar alguns detall...