O vi είναι ο βασικός επεξεργαστής κειμένου που δημιουργήθηκε για το UNIX και απευθυνόταν σε «θνητούς χρήστες». Πριν από τον vi, οι επεξεργαστές κειμένου δεν είχαν τη σημερινή μορφή και λειτουργία. Ο βασικός επεξεργαστής κειμένου (για UNIX αλλά και για DOS) ήταν ο ed (editor). Ο ed ανήκε στην κατηγορία που ονομάζεται “line editor”. Δεν υπήρχε προβολή του αρχείου, αλλά ο χρήστης πληκτρολογούσε το κείμενό του με εντολές, παράδειγμα: «πρόσθεσε τη γραμμή με κείμενο xyz». Προφανώς, τέτοιου τύπου επεξεργασία κειμένου ήταν βασανιστική για τους χρήστες. Ο vi ήταν από τις πρώτες εφαρμογές στην οποία ο χρήστης έβλεπε το κείμενο και μπορούσε να μετακινηθεί με τα βελάκια σε κάποιο σημείο του κειμένου και να κάνει αλλαγές/προσθήκες.
H αρχική έκδοση του vi δημιουργήθηκε το 1976, ενώ μέχρι σήμερα έχουν δημιουργηθεί πάρα πολλοί κλώνοι. Η έκδοση κλώνος που χρησιμοποιείται σήμερα περισσότερο είναι ο vIM (vi IMproved). Επίσης, εκτός από τις παραδοσιακές εκδόσεις που λειτουργούν σε τερματικό, έχουν δημιουργηθεί και γραφικές εφαρμογές όπως ο gvim, kvim κ.ά., οι οποίες εκτός από τις βασικές λειτουργίες του vi εμφανίζουν σε παράθυρο μενού επιλογών καθώς και toolbar με τις συχνότερες λειτουργίες.
Στο παρόν παρουσιάζουμε τη βασική έκδοση, όμως, όλα αυτά που αναφέρονται λειτουργούν σε όλους τους κλώνους και παραλλαγές του vi.
Ο vi έχει δυο κύριες καταστάσεις λειτουργίας:
Με την έναρξη του vi βρισκόμαστε σε Κατάσταση Εντολών. Στην «Κατάσταση Εντολών» οποιοδήποτε πλήκτρο και να πατήσουμε αντιστοιχεί σε «Εντολή». Φανταστείτε τις συντομεύσεις (shortcuts) σε μια εφαρμογή όπως στο Microsoft Word. Ενεργοποιούνται με το πλήκτρο Control. Παράδειγμα, στο Microsoft Word, το "Cntrl-S" κάνει αποθήκευση του αρχείου. Η "Κατάσταση Εντολών" του vi, είναι ΣΑΝ να έχουμε πατημένο το Cntrl και περιμένει να πατήσουμε και ακόμη ένα πλήκτρο για να εκτελέσει την αντίστοιχη συντόμευση.
Όταν βρισκόμαστε σε "Κατάσταση Εισαγωγής", τότε ό,τι πληκτρολογούμε προστίθεται στο αρχείο, όπως σε έναν επεξεργαστή κειμένου τύπου notepad.
Πως, όμως, μπαίνουμε σε «Κατάσταση Εισαγωγής»; Η απάντηση είναι: με την εντολή (συντόμευση) που μας μεταφέρει σε αυτήν την κατάσταση. Η περισσότερο συχνή εντολή για είσοδο σε «Κατάσταση Εισαγωγής» είναι η εντολή "i". Υπάρχουν και άλλες εντολές που μας μεταφέρουν σε «Κατάσταση Εισαγωγής», όπως φαίνονται στον .
Εντολή | Λειτουργία |
---|---|
i | Είσοδος σε "Κατάσταση Εισαγωγής" και ο κέρσορας παραμένει στη θέση του. |
a | Είσοδος σε "Κατάσταση Εισαγωγής" και ο κέρσορας μεταφέρεται αμέσως μετά από την τρέχουσα θέση. |
I | Είσοδος σε "Κατάσταση Εισαγωγής" και ο κέρσορας μεταφέρεται στην αρχή της τρέχουσας γραμμής. Αν υπάρχουν στηλοθέτες στην αρχή της γραμμής, ο κέρσορας θα μεταφερθεί πριν από την πρώτη λέξη της τρέχουσας γραμμής. |
A | Είσοδος σε "Κατάσταση Εισαγωγής" και ο κέρσορας μεταφέρεται στο τέλος της τρέχουσας γραμμής μετά από τον τελευταίο χαρακτήρα. |
o | Είσοδος σε "Κατάσταση Εισαγωγής" και νέα γραμμή. Γίνεται εισαγωγή νέας γραμμής μετά από την τρέχουσα και ο κέρσορας μεταφέρεται σε αυτήν τη γραμμή. |
Ο | Είσοδος σε "Κατάσταση Εισαγωγής" και νέα γραμμή. Γίνεται εισαγωγή νέας γραμμής πριν από την τρέχουσα και ο κέρσορας μεταφέρεται σε αυτήν τη γραμμή. |
Σκεφτείτε το γεγονός ότι όταν δημιουργήθηκε το vi, δεν υπήρχαν παραθυρικά περιβάλλοντα ούτε ποντίκια. Συνεπώς, για τη γρήγορη επεξεργασία κειμένων σε κατάσταση τερματικού και ιδίως αρχείων που περιέχουν κώδικα, δημιουργήθηκαν στον vi εκατοντάδες εντολές σχεδόν για όλες τις περιπτώσεις που χρειάζεται ένας προγραμματιστής. Για αυτόν τον λόγο βλέπουμε έξι εντολές που μας μεταφέρουν σε «Κατάσταση Εισαγωγής», αλλά με διαφορετικό τρόπο, ώστε να ελαχιστοποιηθεί το πλήθος πλήκτρων που χρειάζεται να πατήσει κάποιος.
Στον βλέπουμε τις περισσότερο συχνές εντολές για τον χειρισμό της επεξεργασίας, δηλαδή εντολές για αντιγραφή-επικόλληση, αναίρεση, επανάληψη κτλ.
Εδώ πρέπει να σημειωθεί πως για τις εντολές που αποτελούνται από περισσότερα του ενός πλήκτρα, δεν βλέπουμε τους χαρακτήρες που πληκτρολογούμε. Απλά θα δούμε το αποτέλεσμα της εντολής, όταν ολοκληρωθεί η πληκτρολόγησή της.
Εντολή | Λειτουργία |
---|---|
u | Αναίρεση (undo). |
. | Επανάληψη τελευταίας εντολής (redo). |
dd | Διαγραφή της τρέχουσας γραμμής και αντιγραφή της στην προσωρινή μνήμη (buffer ή clipboard). |
Ndd | Επανάληψη της εντολής Διαγραφής Ν φορές. Ουσιαστικά διαγραφή Ν γραμμών ξεκινώντας από την τρέχουσα. Οι γραμμές θα αντιγραφούν στην προσωρινή μνήμη (buffer ή clipboard). |
dw | Διαγραφή της τρέχουσας λέξης και αντιγραφή της στην προσωρινή μνήμη (buffer ή clipboard). |
Νdw | Διαγραφή Ν λέξεων ξεκινώντας από την τρέχουσα λέξη και αντιγραφή τους στην προσωρινή μνήμη (buffer ή clipboard). |
D | Διαγραφή από το σημείο του κέρσορα μέχρι το τέλος γραμμής και αντιγραφή αυτών που διαγράφηκαν στην προσωρινή μνήμη (buffer ή clipboard). |
ND | Διαγραφή από το σημείο του κέρσορα και των επόμενων Ν-1 γραμμών και αντιγραφή αυτών που διαγράφηκαν στην προσωρινή μνήμη (buffer ή clipboard). |
yy | Αντιγραφή της τρέχουσας γραμμής στην προσωρινή μνήμη (buffer ή clipboard). |
Νyy | Αντιγραφή Ν γραμμών (ξεκινώντας από την τρέχουσα γραμμή) στην προσωρινή μνήμη (buffer ή clipboard). |
yw | Αντιγραφή Ν γραμμών (ξεκινώντας από την τρέχουσα γραμμή) στην προσωρινή μνήμη (buffer ή clipboard). |
Νyw | Αντιγραφή Ν λέξεων ξεκινώντας από την τρέχουσα λέξη στην προσωρινή μνήμη (buffer ή clipboard). |
Υ | Αντιγραφή από το σημείο του κέρσορα μέχρι το τέλος γραμμής στην προσωρινή μνήμη (buffer ή clipboard). |
Υ | Αντιγραφή από το σημείο του κέρσορα και των επόμενων Ν-1 γραμμών στην προσωρινή μνήμη (buffer ή clipboard). |
P | Επικόλληση των περιεχομένων της προσωρινής μνήμης πριν τον κέρσορα. Αν η προσωρινή μνήμη περιέχει ολόκληρες γραμμές, τότε γίνεται εισαγωγή γραμμών πριν την τρέχουσα γραμμή. |
p | Επικόλληση των περιεχομένων της προσωρινής μνήμης μετά τον κέρσορα. Αν η προσωρινή μνήμη περιέχει ολόκληρες γραμμές, τότε γίνεται εισαγωγή γραμμών μετά την τρέχουσα γραμμή. |
x | Διαγραφή του χαρακτήρα που βρίσκεται κάτω από τον κέρσορα και αντιγραφή του στην προσωρινή μνήμη. |
Nx | Διαγραφή του χαρακτήρα που βρίσκεται κάτω από τον κέρσορα και των επόμενων Ν-1 (της τρέχουσας γραμμής) και αντιγραφή τους στην προσωρινή μνήμη. |
cw | Αντικατάσταση της τρέχουσας λέξης. Διαγράφεται η τρέχουσα λέξη και μπαίνουμε σε «Κατάσταση Εισαγωγής Κειμένου» για την πληκτρολόγηση. Θα πρέπει να πατηθεί το πλήκτρο Esc για τέλος αντικατάστασης. |
Ncw | Αντικατάσταση της τρέχουσας λέξης και των Ν-1 επόμενων λέξεων. Διαγράφονται οι Ν λέξεις και μπαίνουμε σε «Κατάσταση Εισαγωγής Κειμένου» για την πληκτρολόγηση. Θα πρέπει να πατηθεί το πλήκτρο Esc για τέλος αντικατάστασης. |
r | Αντικατάσταση του τρέχοντος χαρακτήρα (που βρίσκεται κάτω από τον κέρσορα). Αμέσως μετά το "r" θα πρέπει να πατήσουμε τον χαρακτήρα αντικαταστάτη. |
Νr | Αντικατάσταση του τρέχοντος χαρακτήρα (που βρίσκεται κάτω από τον κέρσορα) και των Ν-1 επόμενων. Αμέσως μετά το "r" θα πρέπει να πατήσουμε τον χαρακτήρα αντικαταστάτη. Θα γίνουν Ν αντικαταστάσεις. |
~ | Μετατροπή του τρέχοντος χαρακτήρα (που βρίσκεται κάτω από τον κέρσορα) από πεζό σε κεφαλαίο ή το αντίστροφο. |
Ν~ | Μετατροπή του τρέχοντος χαρακτήρα και των Ν-1 επόμενων από πεζούς σε κεφαλαίους ή το αντίστροφο. |
Όπως είναι σχεδόν προφανές από τον προηγούμενο πίνακα, η λειτουργία επανάληψης μπορεί να εφαρμοστεί σε οποιαδήποτε εντολή. Πληκτρολογούμε έναν αριθμό, μετά την εντολή και η εντολή επαναλαμβάνεται τόσες φορές, όσες και ο αριθμός που δόθηκε. Προφανώς, ο αριθμός μπορεί να είναι μονοψήφιος, διψήφιος ή οποιουδήποτε μεγέθους. Παράδειγμα, αν πατήσουμε "16p", θα γίνει 16 φορές η εντολή επικόλλησης, δηλαδή ό,τι υπάρχει στην προσωρινή μνήμη θα επικολληθεί 16 φορές. Αν πατήσουμε "12~", θα μετατραπούν 12 χαρακτήρες από πεζοί σε κεφαλαίους (ή το αντίστροφο).
Στην «Κατάσταση Εισαγωγής Εντολών», άλλες εντολές αντιστοιχούν σε πεζά γράμματα και άλλες σε κεφαλαία. Παράδειγμα, είναι διαφορετική η εντολή "i" από την εντολή "I". Για αυτό απαιτείται προσοχή στη χρήση του "Caps Lock" και καλό είναι να είναι πάντα απενεργοποιημένο.
Επίσης, ο vi, δεν καταλαβαίνει εντολές στα ελληνικά. Παράδειγμα, αν έχουμε επιλεγμένο το ελληνικό πληκτρολόγιο, τότε το πλήκτρο "i" σε κατάσταση Εντολών θα αντιστοιχεί στον χαρακτήρα "ι" (γιώτα μικρό), το οποίο για τον vi δεν είναι εντολή. Υπάρχει, βέβαια, η δυνατότητα να ρυθμιστεί ο vi, ώστε να καταλαβαίνει ως εντολές και τους ελληνικούς χαρακτήρες, απαιτεί, όμως, αρκετές ρυθμίσεις για την εποικοδομητική λειτουργία και δεν περιγράφονται στο παρόν.
Υπάρχουν πάρα πολλές εντολές μετακίνησης. Θυμηθείτε πως, όταν δημιουργήθηκε ο vi δεν υπήρχαν ποντίκια. Επίσης, όλα τα πληκτρολόγια δεν είχαν πλήκτρα μετακίνησης (βελάκια) ή και αν είχαν, δεν ήταν όλα συμβατά μεταξύ τους. Στον αναφέρουμε μερικές μόνο από τις εντολές μετακίνησης.
Εντολή | Λειτουργία |
---|---|
h,j,k,l | Μετακίνηση αριστερά (←), κάτω (↓), επάνω (↑), δεξιά (→). Είναι αντίστοιχα με τα πλήκτρα μετακίνησης τα οποία δουλεύουν και αυτά σε όλες τις νέες εκδόσεις του vi. |
^ | Μετακίνηση στην αρχή γραμμής. |
$ | Μετακίνηση στο τέλος γραμμής. |
G | Μετακίνηση στην τελευταία γραμμή του αρχείου. |
NG | Μετακίνηση στη N-οστή γραμμή του αρχείου (πχ 5G στην 5η γραμμή). |
w | Μετακίνηση στην επόμενη λέξη, συμπεριλαμβάνοντας ως λέξη και τα σημεία στίξης. |
W | Μετακίνηση στην επόμενη λέξη, αγνοώντας τα σημεία στίξης. |
e,Ε | Μετακίνηση το τέλος της λέξης, συμπεριλαμβάνοντας ή όχι τα σημεία στίξης. |
b,B | Μετακίνηση στην προηγούμενη λέξη συμπεριλαμβάνοντας ή όχι τα σημεία στίξης. |
Η | Μετακίνηση στην πρώτη γραμμή που φαίνεται στην οθόνη (μπορεί να είναι η πρώτη γραμμή του αρχείου ή όχι). |
% | Μετακίνηση στην παρένθεση ( "(", ")" ) ή αγκύλη( "[", "]" ) ή άγκιστρο ( "{", "}" ) που ταιριάζει. |
(, ) | Μετακίνηση στην προηγούμενη ή επόμενη πρόταση. |
{, } | Μετακίνηση στην αρχή της τρέχουσας ή της επόμενης παραγράφου. |
Όλα τα παραπάνω μπορούν να συνδυαστούν με την επανάληψη εντολής, πχ: "3}" θα μεταφέρει τον κέρσορα 3 παραγράφους μετά.
Επίσης, μπορούν να συνδυαστούν με τις εντολές διαγραφής ή αντιγραφής.
Παράδειγμα, έχοντας τον κέρσορα σε ένα άγκιστρο που ανοίγει ({), αν πατήσουμε "d%", θα διαγράψει μέχρι το άγκιστρο που κλείνει.
Αν σε μια παράγραφο πατήσουμε "3y}", θα αντιγράψει τις επόμενες 3 παραγράφους.
Εκτός από τις δυο βασικές καταστάσεις λειτουργίας που περιγράψαμε (Εισαγωγής και Εντολών), υπάρχουν και άλλες καταστάσεις λειτουργίας. Κάποιες εντολές είτε μπορεί να είναι περίπλοκες είτε πολύ σημαντικές, οπότε και πρέπει να τις βλέπουμε καθώς τις πληκτρολογούμε. Έτσι, υπάρχει η «Κατάσταση Γραμμής Εντολών». Σε αυτήν την κατάσταση μπορούμε να μεταβούμε πατώντας την εντολή ":" όταν βρισκόμαστε σε «Κατάσταση Εντολών». Τότε στην τελευταία γραμμή του τερματικού εμφανίζεται ο χαρακτήρας ":" και αναμένει να πληκτρολογηθεί εντολή. Οι εντολές σε «Κατάσταση Γραμμής Εντολών» είναι διαφορετικές από τις εντολές σε «Κατάσταση Εντολών».
Σε αυτήν την κατάσταση, οι δυο πολύ σημαντικές εντολές είναι η εντολή για αποθήκευση του αρχείου και για τερματισμό του προγράμματος.
Εντολή | Λειτουργία |
---|---|
:w | Αποθήκευση του αρχείου (write). |
:w filename | Αποθήκευση του αρχείου με νέο όνομα. Είναι αντίστοιχη της λειτουργίας "Αποθήκευση Ως" ή "Save As". Το όνομα αρχείου μπορεί να είναι μόνο όνομα, οπότε και θα αποθηκευτεί στον τρέχοντα φάκελο ή διαδρομή (απόλυτη ή σχετική) προς όνομα αρχείου. Παραδείγματα: :w file.txt ή :w /tmp/file2.txt ή :w ../file3.txt |
:q | Έξοδος από το πρόγραμμα (quit). Στην περίπτωση που δεν έχει αποθηκευτεί η τελευταία τροποποίηση του αρχείου, θα εμφανιστεί μήνυμα προειδοποίησης και δεν θα εκτελεστεί η λειτουργία εξόδου. |
:q! | Έξοδος από το πρόγραμμα αγνοώντας τυχόν προειδοποίηση. Θα τερματίσει τον vi ακόμη και αν δεν έχει αποθηκευτεί η τελευταία έκδοση του αρχείου. |
:w! | Αποθήκευση του αρχείου και αγνόηση προειδοποίησης. Συνήθως προκύπτει προειδοποίηση για μεταβολή ενός αρχείου που έχει οριστεί "μόνο για ανάγνωση" (read-only). |
:wq | Αποθήκευση του αρχείου και μετά έξοδος. |
Από την «Κατάσταση γραμμής εντολών» βγαίνουμε αυτόματα με την εκτέλεση της εντολής, δηλαδή μόλις πατήσουμε το πλήκτρο "Enter". Στην περίπτωση που έχουμε ξεκινήσει την πληκτρολόγηση μιας εντολής, αλλά τελικά δεν επιθυμούμε την εκτέλεσή της, μπορούμε να πατήσουμε "Esc", οπότε και ακυρώνεται η εντολή και επιστρέφουμε σε «Κατάσταση Εντολών».
Στην Κατάσταση Γραμμής Εντολών, ο vi δέχεται και όλες σχεδόν τις εντολές του προγράμματος sed.
Όντας σε «Κατάσταση Γραμμής Εντολών», μπορούμε να πληκτρολογήσουμε τον χαρακτήρα "!" και μετά μια εντολή του κελύφους. Παράδειγμα :!ls -l
. Ο vi θα εκτελέσει ένα κέλυφος και μέσα σε αυτό την εντολή που δόθηκε. Θα εμφανιστούν τα αποτελέσματα της εντολής και θα υπάρχει η προτροπή να πατήσουμε "Enter" για επιστροφή στον vi και στην «Κατάσταση Εντολών».
Από «Κατάσταση Εντολών» πατώντας το πλήκτρο «/» ή το "?" μπαίνουμε σε «Κατάσταση Αναζήτησης» (Search Mode). Εδώ, πρέπει να πληκτρολογήσουμε το κείμενο για αναζήτηση. Με την ολοκλήρωση της πληκτρολόγησης (πατώντας Enter) μεταφέρεται ο κέρσορας στην πρώτη εμφάνιση του κειμένου που αναζητήσαμε. Με την εντολή “n” μεταφερόμαστε στην επόμενη εμφάνιση. Με την εντολή «Ν» μεταφερόμαστε στην προηγούμενη εμφάνιση. Με το "/" η αναζήτηση γίνεται προς τα κάτω, με το "?" η αναζήτηση γίνεται προς τα πίσω.
Στην «Κατάσταση Αναζήτησης» ο vi δέχεται και το βασικό σύνολο κανονικών εκφράσεων, για το οποίο γίνεται λόγος στο .
Τέλος, σε αυτό το σημείο να παρατηρήσουμε ότι οι δυνατότητες και οι λειτουργίες του vi είναι πολύ περισσότερες από αυτές που αναφέρονται στο παρόν κεφάλαιο. Για περισσότερες πληροφορίες ανατρέξτε στο εγχειρίδιο χρήσης του vi.