💾 Archived View for magaz.hellug.gr › 22 › 03_vi › index.gmi captured on 2024-08-25 at 00:08:43. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-02-05)
-=-=-=-=-=-=-
Ζανικόλας Σεραφείμ(mailto:serzan@it.teithe.gr) Μαρ 1999
Αυτό το έγγραφο φιλοδοξεί να παρουσιάσει με κατανοητό και γρήγορο τρόπο τις βασικές λειτουργίες του VI, ενός από τους καθιερωμένους επεξεργαστές κειμένου των UNIX λειτουργικών συστημάτων.
1. Σχετικά...
2. Εισαγωγή
3. Μετακίνηση
4. Επεξεργασία Κειμένου
5. Αναζήτηση
6. Διαχείρηση Αρχείων
7. Διαχείριση περιοχών μνήμης προσωρινής αποθήκευσης (buffers)
8. Διάφορες εντολές
9. Παραδείγματα
Όπως δηλώνει σαφώς και ο τίτλος, σε καμμία περίπτωση δεν αποτελεί πλήρη οδηγό του VI. Η ομαδοποίηση των εντολών έγινε αυθαίρετα έχοντας υπ'όψη την -όσο το δυνατόν- ευκολότερη εκμάθηση τους. Για παρατηρήσεις / προτάσεις, επικοινωνήστε στην παραπάνω διεύθυνση. Τέλος το έγγραφο θα το βρείτε στη διεύθυνση http://aetos.it.teithe.gr/%5C~serzan/vi/vi.html[1]
1: http://aetos.it.teithe.gr/%5C~serzan/vi/vi.html
Καταστάσεις Λειτουργίας, Εντολές
: Ο VI(sual editor) έχει δύο βασικές καταστάσεις λειτουργίας:
- κατάσταση εντολών (command mode) - κατάσταση εισαγωγής κειμένου (text entry mode) Κατά τη κατάσταση εντολών οτιδήποτε πληκτρολογείτε μεταφράζεται ως εντολή. Φροντίστε να είστε προσεκτικοί γιατί δε φαίνονται οι εντολές που δίνετε, βλέπετε μόνο τα αποτελέσματά τους. Εξαίρεση αποτελούν οι εντολές που αρχίζουν από ":" (άνω κάτω τελεία) οι οποίες εμφανίζονται στο κάτω μέρος της οθόνης και εκτελούνται αφού πατήσετε `<CR>` (enter). Σε κατάσταση εισαγωγής κειμένου -σχεδόν- ο,τιδήποτε πληκτρολογείτε εισάγεται στο κείμενο.
Εισαγωγή - Διαγραφή
: Πατώντας <ESC> ή ^[ (control-[) μπορείτε να είστε σίγουροι πως ο VI είναι σε κατάσταση εντολών. Βασικοί τρόποι για να περάσετε σε κατάσταση εισαγωγής κειμένου είναι: πατώντας i (insert - εισαγωγή κειμένου στη θέση του δρομέα), a (append - εισαγωγή κειμένου στην πρώτη θέση στα δεξιά του δρομέα) ή o (open(?) - εισαγωγή κειμένου σε νέα γραμμή κάτω από την ενεργή). Χρησιμοποιήστε το x για να διαγράψετε το χαρακτήρα στη θέση του δρομέα.
Μετακίνηση
: Για να κινηθείτε μέσα στο κείμενο, αφού βεβαιωθείτε πως είστε σε κατάσταση εντολών, χρησιμοποιήστε τα h j k l για αριστερά, κάτω, πάνω και δεξιά. Εναλλακτικά μπορείτε να χρησιμοποιήσετε τα βελάκια, κάτι που δε συνίσταται για λόγους ταχύτητας.
Χειρισμός Αρχείων, Εξοδος
: Οσο επεξεργάζεστε ένα αρχείο στον VI, ουσιαστικά δουλεύετε σε ένα αντίγραφο του αρχείου σε μία προσωρινή μνήμη (buffer). Οι αλλαγές που κάνετε στην προσωρινή μνήμη δεν αποθηκεύονται μέχρι τη στιγμή που θα δώσετε την εντολή :w<CR> (από το write). Εάν το αρχείο είναι read only μπορείτε να γράψετε μόνο με :w!<CR>, με την προυπόθεση φυσικά πως έχετε δικαίωμα εγγραφής στο αρχείο (write permission). Γράφοντας :e filename<CR> μπορείτε να ανοίξετε ένα νέο αρχείο για επεξεργ ασία, ενώ τερματίζετε τον VI με :q<CR>. Εφόσον δεν έχετε αποθηκεύσει τις αλλαγές που κάνατε ο VI θα διαμαρτυρηθεί και δε θα εκτελέσει την εντολή σας, σε αυτή την περίπτωση χρησιμοποιήστε :e! filename<CR> και :q!<CR> αντίστοιχα.
Αντιγραφή, Διαγραφή, Επικόλληση
: Οι εντολές c[E], y[E] και d[E] (change-αλλαγή, yank-copy-αντιγραφή σε προσωρινή μνήμη, delete-διαγραφή και αντιγραφή στην προσωρινή μνήμη), επιδρούν σε περιοχή κειμένου που προσδιορίζεται από το επίθεμά [E] πχ. yw (yank word to buffer). Η επανάληψη (cc, yy, dd) υποδηλώνει την επίδρασή τους στην τρέχουσα γραμμή πχ. το yy αντιγράφει το περιεχόμενο της τρέχουσας γραμμής στην προσωρινή μνήμη (yank line to buffer). Επικόλληση κειμένου από την προσωρινή μνήμη γίνεται μ ε το p.
Η Λογική Των Εντολών
: Οι περισσότερες εντολές του VI μπορούν να δεχτούν ένα αριθμητικό πρόθεμα, με το οποίο δηλώνουμε πόσες φορές επιθυμούμε την εκτέλεση τους. Ετσι λοιπόν εκεί που το dd θα έσβηνε την τρέχουσα γραμμή το 3dd σβήνει 3 γραμμές.
Ακολουθούν κάποια παραδείγματα. Είναι επιθυμητό ο αναγνώστης να εξοικειωθεί με όσα αναφέρθηκαν μέχρι στιγμής δεδομένου ότι οι εντολές των επόμενων κεφαλαίων ενδέχεται να προκαλέσουν σύγχιση.
Παραδείγματα
:
`14l` : μεταφορά του δρομέα 14 θέσεις προς τα δεξιά `10j` : μεταφορά του δρομέα 10 σειρές προς τα κάτω `10x` : διαγραφή 10 χαρακτήρων, ξεκινώντας από το δρομέα προς τα δεξιά `cwtext` : αλλαγή λέξης με το text `3cctext` : αλλαγή τριών γραμμών με το text `7yw` : αντιγραφή 7 λέξεων στην προσωρινή μνήμη `3yy` : αντιγραφή 3 γραμμών στην προσωρινή μνήμη `5dw` : διαγραφή 5 λέξεων (και αντιγραφή στην προσωρινή μνήμη) `2dd` : διαγραφή 2 γραμμών (και αντιγραφή στην προσωρινή μνήμη)
Οι εντολές που δέχονται αριθμητικό πρόθεμα φαίνονται με το χαρακτήρα [N] ενώ εκείνες που μπορούν να χρησιμοποιηθούν ως επίθεμα των εντολών y d c με [E]
[N][E] w b e
: μετακίνηση στην επόμενη λέξη, στην αρχή ή στο τέλος λέξης (οι λέξεις αποτελούνται από γράμματα και ψηφία, οτιδήποτε άλλο θεωρείται διαχωριστικό λέξης)
[N][E] W B E
: μετακίνηση στην επόμενη λέξη, στην αρχή ή στο τέλος λέξης (οι λέξεις αποτελούντα από οποιουσδήποτε χαρακτήρες εκτός από το κενό, που έιναι διαχωριστικό λέξης)
[E] 0
: μεταφορά του δρομέα στην πρώτη στήλη της ενεργής γραμμής
[E] n|
: μεταφορά του δρομέα στην νιοστή στήλη της ενεργής γραμμής ή στην πρώτη εάν δεν προσδιοριστεί το n
[E] $
: μετακίνηση του δρομέα στο τέλος της ενεργής γραμμής
[E] H
: μετακίνηση στην πρώτη γραμμή της οθόνης
[E] M
: μετακίνηση στη γραμμή στη μέση της οθόνης
[E] L
: μετακίνηση στην τελευταία γραμμή της οθόνης
^F
: μετακίνηση μία οθόνη προς τα κάτω
^B
: μετακίνηση μία οθόνη προς τα πάνω
[N] h j k l
: αριστερά, κάτω, πάνω, δεξιά (εναλλακτικά χρησιμοποιήστε τα βελάκια)
[E] nG
: μετακίνηση στη νιοστή γραμμή ή στο τέλος του αρχείου (χωρίς το n)
:n<CR>
: μετακίνηση στη νιοστή γραμμή
[E] 'a
: μετακίνηση στην πρώτη στήλη της γραμμής που σημειώθηκε ως a, αυτό γίνεται με την εντολή ma όπου a ένα οποιοδήποτε μικρό γράμμα του λατινικού αλφαβήτου
[E] `a
: μετακίνηση στη στήλη και στη γραμμή που σημειώθηκε ως a, αυτό γίνεται με την εντολή ma όπου a ένα οποιοδήποτε μικρό γράμμα του λατινικού αλφαβήτου
Οι εντολές που δέχονται αριθμητικό πρόθεμα φαίνονται με το χαρακτήρα [N] ενώ εκείνες που μπορούν να χρησιμοποιηθούν ως επίθεμα των εντολών y d c με [E]
atext
: γράφει το text στα δεξιά της θέσης του δρομέα (append)
Atext
: γράφει το text στο τέλος της ενεργής γραμμής
itext
: γράφει το text στη θέση του δρομέα (insert)
Itext
: γράφει το text στην αρχή της ενεργής γραμμής
otext
: γράφει το text στην αρχή μιας νέας γραμμής που ανοίγει κάτω από την ενεργή (open)
Otext
: γράφει το text στην αρχή μιας νέας γραμμής που ανοίγει πάνω από την ενεργή
Κάθε φορά που διαγράφετε κάτι, αυτό αντιγράφετε αυτόματα στη γενικής χρήσεως προσωρινή μνήμη (buffer).
[N] x
: διαγραφή του χαρακτήρα στον οποίο βρίσκεται ο δρομέας
[N] X
: διαγραφή του χαρακτήρα αριστερά του δρομέα
[N] d[E]
: διαγραφή από τη θέση του δρομέα εώς το σημείο που προσδιορίζει το [E]
[N] dd
: διαγραφή τρέχουσας γραμμής
D
: διαγραφή από τη θέση του δρομέα εώς το τέλος της γραμμής (ισοδύναμο με d$)
:d<CR>
: διαγραφή τρέχουσας γραμμής (ισοδύναμο με dd)
:nd<CR>
: διαγραφή νιοστής γραμμής, όπου n ακέραιος αριθμός που προσδιορίζει τον αριθμό γραμμής
:x,yd<CR>
: διαγραφή από την γραμμή x εώς και την y. Όπου x και y μπορεί να είναι: α) οποιοσδήποτε αριθμός γραμμής β). (τελεία - ενεργή γραμμή) γ) $ (τελευταία γραμμή) δ) τα (β) ή (γ) + - αριθμητική σταθερά
[N] c[E]text
: αλλαγή (change) του κειμένου, από το δρομέα εώς τη θέση που προσδιορίζει το [E], με το text
[N] cctext
: αλλαγή ενεργής γραμμής με το text
Ctext
: αλλαγή του κειμένου, από το δρομέα εώς το τέλος της γραμμής, με το text (ισοδύναμο με c$text)
:s/re1/re2/<CR>
: αντικατάσταση (subtitute), ΜΟΝΟ της πρώτης συμβολοσειράς re1 ή αυτής που προσδιορίζεται από την κανονική έκφραση re1 (relative expression), που θα βρεθεί στην ενεργή γραμμή, με τη συμβολοσειρά re2 ή αυτήν που προσδιορίζεται από την κανονική έκφραση re2
:s/re1/re2/g<CR>
: το ίδιο με τη διαφορά πως θα αντικαταστήσει ΟΛΑ τα re1, της ενεργής γραμμής, με το re2 και όχι μόνο το πρώτο
:s/re1/re2/c<CR>
: το ίδιο με τη διαφορά πως θα σας ζητήσει επιβεβαίωση για κάθε αλλαγή που θα κάνει. Οι επιλογές g (global) και c (confirm) είναι προαιρετικές και μπορούν να χρησιμοποιηθούν και ταυτόχρονα
:x,y s/re1/re2/<CR>
: αντικατάσταση, ΜΟΝΟ της πρώτης συμβολοσειράς re1 ή αυτής που προσδιορίζεται από την κανονική έκφραση re1 (relative expression), που θα βρεθεί στις γραμμές που προσδιορίζονται από τα x και y, με τη συμβολοσειρά re2 ή αυτήν που προσδιορίζεται από την κανονική έκφραση re2. Όπου x και y μπορεί να είναι: α) οποιοσδήποτε αριθμός γραμμής β). (τελεία - ενεργή γραμμή) γ) $ (τελευταία γραμμή) δ) τα (β) ή (γ) + - αριθμητική σταθε ρά
[N] ~
: αλλάζει το χαρακτήρα στη θέση του δρομέα, από μικρό σε κεφαλαίο ή αντίστροφα, και κινείται μία θέση δεξιά (μόνο για λατινικούς χαρακτήρες)
[N] u
: ακυρώνει μία ή περισσότερες ενέργεις (undo)
J
: ενώνει την ενεργή γραμμή με την επόμενη
Οι εντολές που δέχονται αριθμητικό πρόθεμα φαίνονται με το χαρακτήρα [N] ενώ εκείνες που μπορούν να χρησιμοποιηθούν ως επίθεμ�� των εντολών y d c με [E]
[N][E] fa Fa
: μεταφορά του δρομέα στο πρώτο a που θα βρεθεί στη γραμμή προς τα δεξιά (fa) ή προς τα αριστερά (Fa)
[N][E] , ;
: επανάληψη τελευταίας αναζήτησης προς τα αριστερά (,) ή προς τα δεξιά (;)
/re
: αναζήτηση, προς τα εμπρός, του re, όπου re μια οποιαδήποτε συμβολοσειρά ή κανονική έκφραση
?re
: αναζήτηση, προς τα πίσω, του re, όπου re μια οποιαδήποτε συμβολοσειρά ή κανονική έκφραση
n
: επανάληψη τελευταίας αναζήτησης προς τα κάτω
N
: επανάληψη τελευταίας αναζήτησης προς τα πάνω
:w<CR>
: αποθήκευση αλλαγών στο αρχικό αρχείο
:w filename<CR>
: αποθήκευση αλλαγών στο filename
:wq<CR>
: αποθήκευση αλλαγών στο αρχικό αρχείο και τερματισμός του VI
:e filename<CR>
: ανοίγει το filename (αν δεν υπάρχει δημιουργεί ένα άδειο), θα εμφανιστεί προειδοποίηση σε περίπτωση που δεν έχουν αποθηκευτεί οι αλλαγές του αρχικού αρχείου
:e! filename<CR>
: ανοίγει το filename ανεξάρτητα από το αν έχουν αποθηκευτεί οι αλλαγές του πρώτου ή όχι
:r filename<CR>
: προσθέτει τα περιεχόμενα του αρχείου filename στη θέση του δρομέα
:r <!unix_cmd><CR>
: προσθέτει την έξοδο της εντολής unix_cmd στη θέση του δρομέα
:q <CR>
: έξοδος από τον VI, θα εμφανιστεί προειδοποίηση σε περίπτωση που δεν έχουν αποθηκευτεί οι αλλαγές
:q! <CR>
: έξοδος από τον VI, ανεξάρτητα από το αν έχουν αποθηκευτεί οι αλλαγές του αρχείου
Εκτός από την γενικής χρήσης ή ανώνυμη μνήμη αποθήκευσης υπάρχουν και οι επώνυμες, μία για κάθε (μικρό) γράμμα του λατινικού αλφαβήτου.
y[E]
: αντιγραφή του κειμένου, από το δρομέα εώς το σημείο που προσδιορίζει το [E], στη γενικής χρήσης μνήμη
Y
: αντιγραφή της ενεργής γραμμής στη γενικής χρήσης μνήμη, ισοδύναμο του yy
"ay[E]
: αντιγραφή του κειμένου, από το δρομέα εώς το σημείο που προσδιορίζει το [E], στην επώνυμη μνήμη a, όπου a οποιοδήποτε μικρό γράμμα του λατινικού αλφαβήτου
p P
: επικόλληση του περιεχομένου της γενικής χρήσης προσωρινής μνήμης μετά ή πριν τη θέση του δρομέα ή την ενεργή γραμμή (ανάλογα με το αν η μνήμη έχει λέξεις ή γραμμές)
"ap "aP
: επικόλληση του περιεχομένου της προσωρινής μνήμης a μετά ή πριν τη θέση του δρομέα
:sh<CR>
: προσωρινή έξοδος στο κέλυφος (shell), επιστροφή με exit
:!unix_cmd<CR>
: εκτέλεση της εντολής unix_cmd
:cd dir_name<CR>
: αλλαγή ενεργού καταλόγου στον dir_name
^G
: εμφανίζει το όνομα του αρχείου, ένδειξη τροποποίησης ή όχι, αρ.γραμμής και θέση του δρομέα στο αρχείο σε ποσοστό %
^Z
: προσωρινή διακοπή του VI, επιστροφή με fg
c4Wtext
: αλλαγή των 4 επόμενων λέξεων με το text (όπου λέξη οποιαδήποτε σειρά χαρακτήρων δεν περιέχει το κενό)
d4wtext
: διαγραφή των 4 επόμενων λέξεων (όπου λέξη οποιαδήποτε σειρά γραμμάτων και ψηφίων)
d0
: διαγραφή του κειμένου από τη θέση του δρομέα εώς την αρχή της γραμμής
d$
: διαγραφή του κειμένου από τη θέση του δρομέα εώς το τέλος της γραμμής
dN|
: διαγραφή του κειμένου από τη θέση του δρομέα εώς τη στήλη N
:11d<CR>
: διαγραφή της 11ης γραμμής
:.,.+3d<CR>
: διαγραφή της ενεργής γραμμής και των τριών επόμενων
:.,$d<CR>
: διαγραφή από την ενεργή γραμμή εώς το τέλος του αρχείου
4~
: αλλαγή των κεφαλαίων γραμμάτων σε μικρών και αντίστροφα, για τους επόμενους τέσσερεις χαρακτήρες
3u
: ακυρώνει τις τρεις τελευταίες ενέργειες (undo)
f*
: μετακίνηση του δρομέα στο πρώτο *
3f*
: μετακίνηση του δρομέα στο τρίτο *
y2fB
: αντιγραφή του κειμένου από το δρομέα εώς το δεύτερο B, στη γενικής χρήσης (ανώνυμη) μνήμη
d5fa
: διαγραφή του κειμένου από το δρομέα εώς το πέμπτο a, αντιγραφή στη γενικής χρήσης (ανώνυμη) μνήμη
c5fatext
: αλλαγή του κειμένου από το δρομέα εώς το πέμπτο a με το text
:s/text1/text2/<CR>
: αντικατάσταση του πρώτου text1 που θα βρεθεί στην ενεργή γραμμή με το text2
:s/text1/text2/g<CR>
: αντικατάσταση όλων των text1 που θα βρεθούν στην ενεργή γραμμή με το text2
:s/text1/text2/gc<CR>
: αντικατάσταση όλων των text1 που θα βρεθούν στην ενεργή γραμμή, με το text2, μετά από επιβεβαίωση
:5,11 s/text1/text2/<CR>
: αντικατάσταση του πρώτου text1 που θα βρεθεί στις γραμμές 5 εώς και 11, με το text2
:.,.+3 s/text1/text2/gc<CR>
: αντικατάσταση όλων των text1 που θα βρεθούν στην ενεργή γραμμή και στις 3 επόμενες, με το text2, μετά από επιβεβαίωση
:.,$ s/text1/text2/gc<CR>
: αντικατάσταση όλων των text1 που θα βρεθούν από την ενεργή γραμμή εώς και το τέλος του αρχείου, με το text2, μετά από επιβεβαίωση
"ayf.
: αντιγραφή του κειμένου από το δρομέα εώς την πρώτη τελεία, στην επώνυμη μνήμη a
"ap
: επικόλληση του περιεχομένου της επώνυμης μνήμης a, στα δεξιά του δρομέα
"zy2f)
: αντιγραφή του κειμένου από το δρομέα εώς τη δεύτερη παρένθεση, στην επώνυμη μνήμη z
"zP
: επικόλληση του περιεχομένου της επώνυμης μνήμης z, στη θέση του δρομέα