💾 Archived View for magaz.hellug.gr › 27 › 02_vitips › index.gmi captured on 2024-02-05 at 09:36:08. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
Βούλα Σανίδα(mailto:voulariba@eeea.gr) Οκτ 2000
Tips στον vi (Μα δεν χρειάζονται, είναι τόσο απλός...)
Ποιός τόλμησε να πει πως το vi είναι δύσχρηστο; Μερικά απλά tips για να κάνετε την ζωή σας ευκολότερη...
1. Practical leaflet
2. crash course theory leaflet
tip 1: Για να βλέπετε στο κάτω μέρος της οθόνης την τρέχουσα γραμμή και στήλη:
:set ruler
(αν θέλετε τέτοιες ρυθμισεις να ισχύουν πάντα δημιουργείστε στο $HOME σας ένα αρχείο .vimrc και γράψτε εκεί την παραπάνω εντολή).
tip 2: Διαλέξτε κομμάτια κειμένου με τα πλήκτρα (σαν να χρηιμοποιείτε ποντίκι):
Πατήστε v για VISUAL MODE. Με τα πλήκτρα διαλέξτε τις γραμμές του κείμενο που θέλετε. Λειτουργεί το page-up, page-down για να διαλέξετε ολόκληρες οθόνη. Μπορείτε να χρησιμοποιείσετε regular expressions (π.χ. /test) για να επιλέξω το κείμενο μέχρι την πρώτη εμφάνιση της λέξης test.
Εναλλακτικά,. πατήστε Ctrl-v για VISUAL BLOCK και διαλέξτε το κείμενο που θέλετε κατά στήλες (κατακόρυφα).
tip 3: Πως αφαιρούμε ΟΛΑ τα html tags από μια html σελίδα και μένει μόνο plain text κείμενο:
:g/<[^>]*>/s///g
tip 4: Πώς σβήνουμε το mail header από ένα email, ώστε να μείνει μόνο το body του:
:1,/^$/d
(ουσιαστικά σβήνουμε από την 1η γραμμή μέχρι να βρούμε την πρώτη κενή γραμμή)
tip 5: Πως αντικαθιστούμε τη λέξη καλό με τη λέξη πολύ καλό σε όλο το κείμενο και σε όλες τις εμφανίσεις σε κάθε γραμμή, με χρήση του τελεστή &:
:%s/καλό/πολύ &/g (εναλλακτικά :%s/καλό/πολύ καλό/g, αν και δεν είναι και τόσο δυναμικό)
tip 6: Πως κλείνουμε σε /* ... */ την τρέχουσα γραμμή:
:s/.*/\/* & *\//
tip 7: Πως βάζουμε τις 5 πρώτες γραμμές σε σχόλια τύπου shell (#):
:1,5s/.*/# &/ (ή ισοδύναμα :1,5s/^/# /)
tip 8: Πως διαγράφουμε όλες τις κενές γραμμές του κειμένου:
:g/^$/d
tip 9: Πως σβήνουμε τα κενά πριν από κάθε γραμμή
:g/^ *\(.*\)/s//\1/g (ή ισοδύναμα :g/^ */s///g)
tip 10: Πως διπλασιάζουμε τον αριθμό των κενών μεταξύ των λέξεων
:%s/ */&&/g
tip 11: Ανταλλαγή μέρας-μήνα. Η ημερομηνία από τη μορφή 21-03-1999 θα γίνει 03-21-1999
:%s/\([0-9]\{1,2\}\)-\([0-9]\{1,2\}\)-\([0-9]\{4\}\)/\2-\1-\3/g
tip 12: Πώς αντιστρέφουμε 2 στήλες που διαχωρίζονται μεταξύ τους με άνω κάτω τελεία :
:%s/\(.*\):\(.*\)/\2:\1/g (ναι, με awk είναι πιο εύκολο, όντως!)
tip 13: Πως διαγράφουμε τους 4 πρώτους χαρακτήρες σε κάθε γραμμή του κειμένου
:%s/^....//g
tip 14: Σε περίπτωση που γράφουμε ένα βιβλίο με references της μορφής "Δείτε το κεφάλαιο ΧΧ.ΥΥ", όπου Χ και Y αριθμοί, και θέλουμε να βάλουμε τέτοιες εμφανίσεις σε παρενθέσεις:
:%s/Δείτε το Κεφάλαιο [1-9][0-9]*\.[1-9][0-9]*/(&)/g
tip 16: Βαρεθήκατε να χρησιμοποιείτε το \ σαν unescape χαρακτήρα για τον χαρακτήρα /; Αλλάξτε το διαχωριστή (delimiter) / της εντολής s (π.χ. με τον χαρακτήρα θαυμαστικό !).
Παράδειγμα: Θέλω να αντικαταστήσω το /usr/doc/HOWTO /usr1/doc2/HOWTO3:
:%s/\/usr\/doc\/HOWTO/\/usr1\/doc2\/HOWTO3 (ο παλιός δύσκολος τρόπος) :%s!/usr/doc/HOWTO!/usr1/doc2/HOWTO3! (ο νέος και εύκολος)
tip16: Α....εννοείτε πως για να ψάξουμε για μια έκφραση (π.χ. lalakis) η εντολή είναι:
/lalakis
Aντικαταστάσεις:
H εντολή αντικατάστασης έχει την μορφή: [address]s/oldregexp/newregexpr[/flags] όπου :
[..] = προεραιτικό μέρος της εντολής, μπορείτε να το παραλείψετε oldregexp = τι να αντικαταστήσουμε newregexp = με τι address = σε ποιο διάστημα (range) κειμένου θα γίνει η αντικατάσταση flags = αν θα ρωτάει για κάθε αντικατάσταση, αν θα το κάνει σε όλο το κείμενο, αν θα τα δείχνει κλπ...
Ετσι, το address μπορεί να είναι:
% = θα εφαρμοστεί σε όλο το κείμενο 1,5 = θα εφαρμοστεί από τη γραμμή 1 μέχρι την 5 1,$ = θα εφαρμοστεί από τη γραμμή 1 ως και την τελευταία (σε όλο δηλαδή το κείμενο) = (τίποτα), θα εφαρμοστεί στην τρέχουσα γραμμή
Μερικά flags μπορούν να είναι
g = θα εκτελεστεί η εντολή σε όλα τις εμφανίσεις τρέχουσας γραμμής (Μια καλή ερώτηση που θα περιμένα να έχετε: Αν έχω για address το % , δεν είναι ισοδύναμο; Μια καλή απάντηση είναι ΟΧΙ. Αν παραλείψετε το g στα flags τότε το vi θα ψάξει για την oldregexp σε όλο το κείμενο αλλά αντικατάσταση θα γίνει ΜΟΝΟ για την πρώτη εμφάνιση της oldregexp ΣΕ ΚΑΘΕ ΓΡΑΜΜΗ. Αρα αν μια γραμμή περιέχει δύο φορές την oldregexp χρειάζεστε το flag g.) gc = θα ρωτά για κάθε αντικατάσταση πριν την κάνει p = εμφάνιση στο κάτω μέρος του vi όλων των υποψήφιων αλλαγών (tips: 3, 5, 6, 7, 9, 10, 11, 12, 13, 14)
Μερικοί χαρακτήρες (με χαρακτήρα):
& = Αν εμφανιστεί οπουδήποτε στα δεξιά μιας εντολής αντικατάστασης s, αντικαθίσταται από οτιδήποτε συνέπεσε στην αριστερή πλευρά (tips: 5, 6, 7, 10, 14) . = Οποιοσδήποτε χαρακτήρας (tips: 6, 7, 9, 12, 13)
Regular Expressions
\(regexp\) = Ομαδοποιεί με βάση το regular expression εντός παρένθεσης. Οτι λοιπόν είναι μέσα στην παρένθεση θεωρείται ως ένα ενιαίο block. Μπορούμε πλέον να αναφερθούμε σε αυτό με βάση τον αριθμό του block αυτού. Αν είναι το πρώτο block που ομαδοποιήσαμε με αυτόν τον τρόπο, αναφερόμαστε σε αυτό με \1 (tips: 9, 11, 12) // = κενό regular expression ισοδυναμεί με το αμέσως προηγούμενο regular expression (tips: 9) /./ = μη κενή γραμμή, τουλάχιστον 1 χαρακτήρας /^$/ = κενή γραμμή, μόνο χαρακτήρας αλλαγής γραμμής /κάτι/ = το κάτι οπουδήποτε στη γραμμή /^κάτι/ = το κάτι στην αρχή της γραμμής /κάτι$/ = το κάτι στο τέλος της γραμμής /κάτι.$/ = το κάτι και ένας ακόμη οποιοσδήποτε χαρακτήρας στο τέλος της γραμμής /κάτι\.$/ = το κάτι. στο τέλος της γραμμής /κάτι[0-9]/ = το κάτι ακολουθούμενο από ψηφίο /κάτι[^0-9]/ = το κάτι ακολουθούμενο από μη ψηφίο