Ο διορθωτής vi και απλός προγραμματισμός στο φλοιό

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Σύντομη λίστα εντολών του διορθωτή vi

Προσοχή όταν δίνετε μία εντολή έχει σημασία αν τα γράμματα είναι κεφαλαία ή μικρά.

Ανοίγοντας ένα αρχείο:
vi όνομα

Μετακίνηση μέσα στο αρχείο:
h (ή το αριστερό βελάκι) Μία θέση αριστερά
l (ή το δεξί βελάκι) Μία θέση δεξιά
k (ή το πάνω βελάκι) Μία γραμμή πάνω
j (ή το κάτω βελάκι) Μία γραμμή κάτω
w Στην επόμενη λέξη

Εισαγωγή και διαγραφή κειμένου:
Ο vi έχει δύο καταστάσεις, κατάσταση εντολών και κατάσταση εισαγωγής κειμένου.

Για να μπείτε στην κατάσταση εισαγωγής κειμένου δίνετε:
i Για να μπείτε στην κατάσταση εισαγωγής κειμένου χωρίς να μετακινηθεί ο δρομέας.
a Για να μπείτε στην κατάσταση εισαγωγής κειμένου μετακινούμενοι μία θέση δεξιά.
I Για να μπείτε στην κατάσταση εισαγωγής στην αρχή της γραμμής
A Για να μπείτε στην κατάσταση εισαγωγής στο τέλος της γραμμής

Για να μπείτε στην κατάσταση εντολών δίνετε:
ESC ή ctrl-[

Για να κάνετε αλλαγές στο κείμενό σας:
x διαγράφει τον χαρακτήρα όπου είναι ο δρομέας
dd διαγράφει την γραμμή που είναι ο δρομέας
u ακυρώνει την τελευταία αλλαγή

Αναζήτηση χαρακτήρων/λέξεων μέσα στο κείμενο:
/χαρακτήρες Βρίσκει την επόμενη γραμμή όπου εμφανίζεται το "χαρακτήρες".
?χαρακτήρες Βρίσκει την προηγούμενη γραμμή όπου εμφανίζεται το "χαρακτήρες".
n Επαναλαμβάνει την αναζήτηση στις επόμενες γραμμές.

Σώζοντας και βγαίνοντας από ένα αρχείο:
:w Σώζει τις τελευταίες αλλαγές και παραμένει μέσα στο αρχείο.
:x Σώζει τις τελευταίες αλλαγές και βγαίνει από το αρχείο
:q! Βγαίνει από το αρχείο χωρίς να σώσει τις αλλαγές

Βασισμένο σε κείμενο του Αντώνη Δανάλη <danalis@edu.physics.uch.gr (http://www.edu.physics.uch.gr/~danalis/index3.html)>

Ο διορθωτής vi: εντολές ανά κατηγορία

Η εντολές που ακολουθούν είναι χωρισμένες σε κατηγορίες ανάλογα με τη λειτουργία που κάνουν.

Εντολές που σβήνουν ή αντιγράφουν κομμάτια του κειμένου

" Ορίζει ένα ενταμιευτή ο οποίος μπορεί να χρησιμοποιηθεί από όλες τις εντολές που χρησιμοποιούν ενταμιευτές. Αν το " ακολουθείται από ένα γράμμα ή ένα νούμερο τότε αυτό είναι το όνομα του ενταμιευτή.
D Σβήνει από εκεί που βρίσκεται ο δρομέας μέχρι το τέλος της γραμμής
p Αντιγράφει τον ενταμιευτή που του ορίζουμε μετά την θέση ή την γραμμή που βρίσκεται ο δρομέας. Αν δεν ορίσουμε κάποιον συγκεκριμένο ενταμιευτή τότε η εντολή p χρησιμοποιεί τον γενικό.(Δείτε το παράδειγμα της εντολής ")
P Αντιγράφει τον ενταμιευτή που του ορίζουμε πριν την θέση ή την γραμμή που βρίσκεται ο δρομέας. Αν δεν ορίσουμε κάποιον συγκεκριμένο ενταμιευτή τότε η εντολή P χρησιμοποιεί τον γενικό.(Δείτε το παράδειγμα της εντολής ")
x Σβήνει τον χαρακτήρα πάνω στον οποίο βρίσκεται ο δρομέας. Αν πριν το x δώσουμε ένα αριθμό τότε θα σβηστούν τόσοι χαρακτήρες μετά το δρομέα.
X Σβήνει τον χαρακτήρα που βρίσκεται πριν το δρομέα.
d Σβήνει μέχρι εκεί που του ορίζουμε.Αν δώσουμε dd σβήνει όλη την γραμμή. Ό,τι σβήνεται τοποθετείται στον ενταμιευτή που του ορίζουμε με την εντολή " , αν δεν ορισθεί ενταμιευτής τότε χρησιμοποιείται ο γενικός.
Y Καταχωρεί την γραμμή στον ενταμιευτή που ορίζουμε, αν δεν ορίσουμε ενταμιευτή χρησιμοποιεί τον γενικό.
y Καταχωρεί στον ενταμιευτή που του ορίζουμε (ή στον γενικό) το κομμάτι του κειμένου που του ορίζουμε. Οι κανόνες που ακολουθεί είναι αυτοί που ακολουθεί και η d εκτός από την καταχώρηση μίας γραμμής που γίνεται δίνοντας
yy

Εντολές εισαγωγής κειμένου

A Ξεκινάει την εισαγωγή του κειμένου από το τέλος της γραμμής
I Ξεκινάει την εισαγωγή του κειμένου από την αρχή της γραμμής
o Ξεκινάει την εισαγωγή του κειμένου στην από κάτω γραμμή από αυτή που βρίσκεται ο δρομέας.
O Το κεφαλαίο γράμμα Ο ξεκινάει την εισαγωγή του κειμένου στην από πάνω γραμμή από αυτή που βρίσκεται ο δρομέας.
a Ξεκινάει την εισαγωγή κειμένου μία θέση μετά από εκεί που βρίσκεται ο δρομέας. Συνδυάζοντας την εντολή a με έναν αριθμό n πετυχαίνουμε εισαγωγή κειμένου n φορές.
i Ξεκινάει την εισαγωγή κειμένου μία θέση πριν από εκεί που βρίσκεται ο δρομέας. Συνδυάζοντας την εντολή i με έναν αριθμό n πετυχαίνουμε εισαγωγή κειμένου n φορές.

Μετακίνηση του δρομέα μέσα σε ένα αρχείο

^B Πάει πίσω μία σελίδα. Μαζί με ένα νούμερο n γυρνάει n σελίδες πίσω.
^F Πάει μπροστά μία σελίδα. Μαζί με ένα νούμερο n πάει n σελίδες μπροστά.
^D Πάει μπροστά μισό παράθυρο. Μαζί με ένα νούμερο n πάει n παράθυρα μπροστά
^H Μετακινεί το δρομέα μία θέση αριστερά. Μαζί με ένα νούμερο n πάει n θέσεις δεξιά
^J Μετακινεί το δρομέα μία γραμμή κάτω στην ίδια γραμμή. Μαζί με ένα νούμερο n πάει n γραμμές κάτω.
^M Πηγαίνει στον πρώτο χαρακτήρα της επόμενης γραμμής.
^N Ό,τι και το ^J
^P Μετακινεί το δρομέα μία γραμμή κάτω στην ίδια γραμμή. Μαζί με ένα νούμερο n πάει n γραμμές κάτω.
^U Πάει πίσω μισό παράθυρο. Μαζί με ένα νούμερο n πάει n παράθυρα πίσω
$ Μετακινεί το δρομέα στο τέλος της γραμμής. Μαζί με ένα νούμερο n πάει στο τέλος της γραμμής που είναι n γραμμές κάτω από το δρομέα.
% Αν ο δρομέας είναι πάνω σε παρένθεση ή αγκύλη τότε τον μετακινεί σε αυτήν που της ταιριάζει
( Μετακινεί το δρομέα στην αρχή της περιόδου
) Μετακινεί το δρομέα στην αρχή της επόμενης περιόδου
{ Μετακινεί το δρομέα στην αρχή της παραγράφου
} Μετακινεί το δρομέα στην επόμενη παράγραφο
| n| Μετακινει το δρομέα στην στήλη n
+ Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα της επόμενης γραμμής
- Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα της προηγούμενης γραμμής
^ Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα της γραμμής
_ Ό,τι και το ^
0 Ο χαρακτήρας μηδέν μετακινεί το δρομέα στην πρώτη στήλη της γραμμής
B Μετακινεί το δρομέα μία λέξη πίσω
E Μετακινεί το δρομέα μία λέξη μπροστά
nG Μετακινεί το δρομέα στην γραμμή n. Αν δε δώσετε n, τότε πάει στο τέλος του κειμένου.
H Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα στην κορυφή της οθόνης
L Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα στο κάτω μέρος της οθόνης
M Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα στο κέντρο της οθόνης
W Μετακινεί το δρομέα μία λέξη πίσω
b Μετακινεί το δρομέα μία λέξη πίσω. Αν ο δρομέας είναι μέσα σε λέξη τότε τον πάει στο πρώτο της γράμμα
e Μετακινεί το δρομέα μία λέξη μπροστά. Αν ο δρομέας είναι μέσα σε λέξη τότε τον πάει στο τελευταίο της γράμμα
w Ό,τι και το e
h Μετακινεί το δρομέα μία θέση αριστερά
j Μετακινεί το δρομέα μία γραμμή κάτω
k Μετακινεί το δρομέα μία γραμμή πάνω
l Μετακινεί το δρομέα μία θέση δεξιά

Μετακίνηση του δρομέα στην οθόνη

n^E Μετακινεί την οθόνη n γραμμές πάνω, χωρίς να την μετακινεί μία γραμμή.
n^Y Μετακινεί την οθόνη n γραμμές κάτω, χωρίς να την μετακινεί μία γραμμή.
z Αλλάζει την οθόνη ως εξής: z τοποθετεί την γραμμή στην κορυφή της οθόνης. z. τοποθετεί την γραμμή στο κέντρο της οθόνης. z- τοποθετεί την γραμμή στο κάτω μέρος της οθόνης. Αν πριν το z υπάρχει ένα νούμερο n, τότε κάνει αυτές τις αλλαγές για την γραμμή n. Για παράδειγμα 16z τοποθετεί στην κορυφή της οθόνης την γραμμή 16

Αντικατάσταση κειμένου

C Αλλάζει την γραμμή από την θέση του δρομέα μέχρι το τέλος της
R Αλλάζει τόσους χαρακτήρες όσους δίνουμε και αφήνει άθικτους τους υπόλοιπους
S Αλλάζει ολόκληρη την γραμμή
c Αλλάζει την γραμμή μέχρι να βρει μία τελεία. Το cc αλλάζει ολόκληρη την γραμμή
r Αλλάζει τον χαρακτήρα που βρίσκεται ο δρομέας
s Αλλάζει τον χαρακτηρα που είναι ο δρομέας και μπαίνει σε insert mode. Με έναν αριθμό n αλλάζει n χαρακτήρες. Ο τελευταίος χαρακτήρας που είναι να αλλάξει αντικαθίσταται προσωρινά με ένα $

Εντολές για να ψάχνετε μέσα σε ένα κείμενο

/ Ψάχνει προς τα κάτω το κείμενο για τη συμβολοσειρά (κανονική έκφραση) που ορίζουμε μετά το /
? Ψάχνει προς τα επάνω το κείμενο για τη συμβολοσειρά (κανονική έκφραση) που ορίζουμε μετά το ?
n Επαναλαμβάνει την τελευταία εντολή / ή ?
N Ό,τι και το n αλλά στην αντίθετη κατεύθυνση
f Ψάχνει μέσα στην γραμμή για τον χαρακτήρα που δίνουμε μετά το f και μετακινεί το δρομέα εκεί.
F Ψάχνει προς τα πίσω μέσα στην γραμμή για τον χαρακτήρα που δίνουμε μετά το f και μετακινεί το δρομέα εκεί.
T Ό,τι και το T αλλά πάει το δρομέα στην επόμενη θέση από τον χαρακτήρα.
t Ό,τι και το f αλλά πάει το δρομέα στην προηγούμενη θέση από τον χαρακτήρα
; Επαναλαμβάνει την τελευταία εντολή f ή F ή t ή T
, Επαναλαμβάνει την τελευταία εντολή f ή F ή t ή T αλλά στην αντίθετη κατεύθυνση

Εντολές μορφοποίησης χαρακτήρων και γραμμών

~ Αλλάζει από κεφαλαίο σε μικρό και από μικρό σε κεφαλαίο το γράμμα που είναι ο δρομέας
<< Μετακινεί την γραμμή προς τα αριστερά. Η τιμή του είναι μεταβλητή και μπορεί να ορισθεί από την set shiftwidth
>> Μετακινεί την γραμμή προς τα δεξιά. Η τιμή του είναι μεταβλητή και μπορεί να ορισθεί από την set shiftwidth
J Ενώνει την γραμμή που βρίσκεται ο δρομέας με την επόμενη. Με ένα νούμερο n μπροστά ενώνει n γραμμές

Εντολές για να σώσετε και να βγείτε από ένα αρχείο

^\ Μπαίνει σε ΕΧ mode. Ο EX editor είναι αυτός πάνω στον οποίο "χτίστηκε" ο VI. Για να επιστρέψετε σε vi mode δίνετε :vi
Q Ό,τι και η ^\
ZZ Βγαίνει από το αρχείο σώζοντας τις αλλαγές

Μερικές ακόμα εντολές

^G Δείχνει το όνομα του αρχείου τον συνολικό αριθμό γραμμών που έχει και τον αριθμό της γραμμής που βρίσκεται ο δρομέας
^L Καθαρίζει την οθόνη.
^R Ξανασχεδιάζει την οθόνη και διορθώνει τα λάθη
^[ Το σύμβολο <ctrl>-[ είναι ουσιαστικά το <ESC>
! Η εντολή ! ξεκινάει ένα shell. Αμα ορίσετε κάποιες συγκεκριμένες γραμμές τότε χρησιμοποιεί αυτές σαν input και τις αντικαθιστά με το output. Η !! χρησιμοποιεί σαν input την γραμμή που είναι ο δρομέας.
& Επαναλαμβάνει την τελευταία εντολή αλλαγής :s
. Επαναλαμβάνει την τελευταία εντολή
: Δίνει την δυνατότητα να εκτελεστεί μια εντολή του ex.
U Φέρνει την γραμμή που είναι ο δρομέας στην γραμμή που ήταν πριν την αλλάξετε
m "Σημαδεύει" την θέση με τον χαρακτήρα που ακολουθεί το m
u Ακυρώνει την τελευταία αλλαγή. Δύο συνεχόμενα u αφήνουν το αρχείο όπως ήταν πριν από αυτά

Εντολές του EX

Ο vi editor είναι βασισμένος πάνω σε έναν διορθωτή γραμμών, τον ex. Ετσι ο vi δίνει την δυνατότητα να εκτελεστούν οι εντολές του ex.
:ab string strings Κάνει συντομογραφία μιας συμβολοσειράς σε μια άλλη. Ετσι αν δώσετε:
:ab usa United States of America
τότε κάθε φορά που θα γράφετε usa θα εμφανίζεται το
United States of America
:map keys new_seq Με την μέθοδο του mapping μπορείτε να κάνετε συντομογραφίες σε εντολες.
:q Βγαίνει από το αρχείο. Αν έχετε κάνει αλλαγές που δεν έχετε σώσει τότε εμφανίζεται ένα μήνυμα και δεν βγαίνει από το αρχείο
:q! Βγαίνει από το αρχείο χωρίς να σώσει τις τελευταίες αλλαγές
:s/from/to/options Αντικαθιστά την λέξη from στην λέξη to.
:set [all] Ορίζει της μεταβλητές του vi. Η εντολή set all δείχνει όλες τις μεταβλητές και για όσες υπάρχει, την τιμή τους.
:una string κάνει το ανάποδο από την ab, δηλαδή αφαιρεί από μια συμβολοσειρά την ιδιότητά του να είναι συντομογραφία κάποιας άλλης.
:unm keys Το αντίστοιχο του una αλλά για την εντολή map
:vi filename Ξεκινάει την επεξεργασία ενός άλλου αρχείου.
:w Σώζει το αρχείο και παραμένει μέσα σε αυτό
:w new_file Σώζει τα περιεχόμενα του αρχείου σε ένα άλλο με όνομα new_file
:w >> filename Προσθέτει το αρχείο, κάτω από το αρχείο filename
:wq Σώζει τις τελευταίές αλλαγές και βγαίνει από το αρχείο
:x Ότι και το x

Βασισμένο σε κείμενο του Αντώνη Δανάλη <danalis@edu.physics.uch.gr (http://www.edu.physics.uch.gr/~danalis/index3.html)>

Προγραμματισμός στο φλοιό