Πρώτο commit
Αυτό το commit περιλαμβάνεται σε:
commit
8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές
40
content/articles/22/01_editorial.md
Κανονικό αρχείο
40
content/articles/22/01_editorial.md
Κανονικό αρχείο
|
@ -0,0 +1,40 @@
|
|||
+++
|
||||
title = 'Editorial'
|
||||
date = '2000-03-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
|
||||
issue = ['Magaz 22']
|
||||
issue_weight = 1
|
||||
+++
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Καλώς ορίσατε στο **Magaz**\...*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Κανονικά αυτό το τεύχος θα έπρεπε να είναι \"διπλό\" μια και τεύχος Φεβρουαρίου δεν βγήκε. Τελικά μάλλον πρέπει να δημιουργηθεί σενάριο failover για περιπτώσεις
|
||||
όπως αυτή, που από τέλος Ιανουαρίου μέχρι μέσα Φεβρουαρίου αδυνατούσα να ασχοληθώ με οτιδήποτε.
|
||||
|
||||
Στο προηγούμενο τεύχος, υπήρχε ένα άρθρο σχετικά με τους γιδοβοσκούς του Ιντερνέτ, άρθρο το οποίο δεν γέννησε τις αντιδράσεις που περίμενα, είχε όμως ως
|
||||
αποτέλεσμα κάποιοι άνθρωποι να επικοινωνήσουν μαζί μου για να πάρουν συγκεκριμένες οδηγίες. Προφανώς τους παρέπεμψα στα RFCs μια που δεν είναι δουλειά μου να
|
||||
δίνω τέτοιες οδηγίες\....
|
||||
|
||||
Το ότι κάποιος όμως, ενδιαφέρθηκε να διορθώσει τις σελίδες του, και να μάθει παραπάνω πράγματα, για μένα είναι σημαντικό.
|
||||
|
||||
Σε αυτό το τεύχος έχουμε ένα πολύ όμορφο άρθρο για το VI, από τον φίλο Σεραφείμ Ζανικόλα. Πραγματικά invaluable για τους αρχαρίους του vi, και πολύ χρήσιμο για
|
||||
όσους το ξέρουν σε κάποιο μέσο επίπεδο.
|
||||
|
||||
Έχουμε και το άρθρο του Μάνου Καραγιώργου που ασχολείται με το swapping (και λίγο με το paging). Πραγματικά χρήσιμο, για να ρυθμίσετε τα swap files και devices
|
||||
σας για να είναι αποδοτική η εργασία του συστήματός σας.
|
||||
|
||||
Ο Πολύβιος Πρατικάκης καταπιάνεται με το θέμα της ελευθερίας του Internet, και τους κινδύνους που αυτή θέτει, συγκρίνοντας τη σημερινή κατάσταση, με αυτήν που
|
||||
περιέγραψε ο Όργουελ στο βιβλίο του 1984.
|
||||
|
||||
Τέλος, ο The Reverant μας εξηγεί πόσο παραμετροποιήσιμος είναι ο FVWM2, ένας window manager με ιστορία στο Linux, και μας οδηγεί σε απλές (και όχι τόσο απλές)
|
||||
αλλαγές στο configuration file του.
|
||||
|
||||
Οι πιο παρατηρητικοί από εσάς θα προσέξουν νέα ονόματα σε αυτό το τεύχος. Μόνο νέα ονόματα, γεγονός το οποίο ενισχύει για μία ακόμα φορά τις προσπάθειες της
|
||||
συντακτικής ομάδας του Magaz να γίνει το περιοδικό ένας χώρος έκφρασης και brainstorming της ελληνικής linux κοινότητας, και όχι ένας χώρος μονολόγων των
|
||||
ολίγων.
|
||||
|
||||
Καλή ανάγνωση\...
|
449
content/articles/22/02_swapping.md
Κανονικό αρχείο
449
content/articles/22/02_swapping.md
Κανονικό αρχείο
|
@ -0,0 +1,449 @@
|
|||
+++
|
||||
title = 'Swapping'
|
||||
date = '2000-03-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Μάνος Καραγιώργος(mailto:mantis@pathfinder.gr)'
|
||||
issue = ['Magaz 22']
|
||||
issue_weight = 2
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Άξονας κίνησης του παρόντος άρθρου είναι η περιγραφή του σκοπού ύπαρξης swap αρχείων/κατατμήσεων, της λειτουργίας τους, της διαδικασίας ορισμού τους, κ.ά.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
**1. Let\'s swap\...**
|
||||
-------------------------------------------------
|
||||
|
||||
- [1.1 Σκοπός ύπαρξης swap κατάτμησης/αρχείου](#ss1.1)
|
||||
- [1.2 Εικονική μνήμη](#ss1.2)
|
||||
- [1.3 Λειτουργία](#ss1.3)
|
||||
- [1.4 Swapping/Paging](#ss1.4)
|
||||
- [1.5 Μέγεθος swap](#ss1.5)
|
||||
- [1.6 Όρια](#ss1.6)
|
||||
- [1.7 Συμβουλές για μέγιστη απόδοση](#ss1.7)
|
||||
|
||||
**2. Swap αρχεία**
|
||||
---------------------------------------------
|
||||
|
||||
- [2.1 Ορισμός swap αρχείου](#ss2.1)
|
||||
- [2.2 Ρόλος του /dev/zero](#ss2.2)
|
||||
|
||||
**3. Swap κατατμήσεις**
|
||||
--------------------------------------------------
|
||||
|
||||
- [3.1 Ορισμός swap κατάτμησης](#ss3.1)
|
||||
|
||||
**4. Ρύθμιση swap συσκευών**
|
||||
-------------------------------------------------------
|
||||
|
||||
**5. Συγχρονισμός\... ΤΩΡΑ**
|
||||
-------------------------------------------------------
|
||||
|
||||
- [5.1 Ρόλος της sync](#ss5.1)
|
||||
|
||||
**6. Χρησιμοποίηση swap συσκευών**
|
||||
-------------------------------------------------------------
|
||||
|
||||
- [6.1 Το αρχείο /etc/fstab](#ss6.1)
|
||||
- [6.2 Εξηγήσεις\...](#ss6.2)
|
||||
- [6.3 Παράμετροι στην swapon](#ss6.3)
|
||||
- [6.4 Αυτόματη χρησιμοποιήση swap συσκευών](#ss6.4)
|
||||
- [6.5 Μή χρησιμοποίηση swap συσκευών](#ss6.5)
|
||||
|
||||
**7. Έλεγχος χρήσης swap συσκευών**
|
||||
--------------------------------------------------------------
|
||||
|
||||
- [7.1 free](#ss7.1)
|
||||
- [7.2 cat /proc/meminfo](#ss7.2)
|
||||
- [7.3 cat /proc/swaps](#ss7.3)
|
||||
- [7.4 top](#ss7.4)
|
||||
- [7.5 procinfo](#ss7.5)
|
||||
|
||||
**8. Ιδέες\...**
|
||||
-------------------------------------------
|
||||
|
||||
- [8.1 Συνδυασμός swap και /tmp](#ss8.1)
|
||||
- [8.2 Swap κατ\' απαίτηση με loopback device](#ss8.2)
|
||||
|
||||
**9. Ίδιος χώρος swap με άλλα λειτουργικά συστήματα**
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
- [9.1 FreeBSD](#ss9.1)
|
||||
- [9.2 Microsoft Windows](#ss9.2)
|
||||
|
||||
**10. Σχετικά**
|
||||
--------------------------------------------
|
||||
|
||||
- [10.1 No time\...](#ss10.1)
|
||||
- [10.2 Πηγές](#ss10.2)
|
||||
|
||||
|
||||
### [1. Let\'s swap\...]{#s1}
|
||||
|
||||
### [1.1 Σκοπός ύπαρξης swap κατάτμησης/αρχείου]{#ss1.1}
|
||||
|
||||
To swap αρχείο/κατάτμηση χρησιμοποιείται ως εικονική μνήμη (virtual RAM) στο σύστημά σας. Η εικονική μνήμη είναι επέκταση της πραγματικής μνήμης του συστήματος.
|
||||
Η ύπαρξή του τις περισσότερες φορές είναι απαραίτητη.
|
||||
|
||||
### [1.2 Εικονική μνήμη]{#ss1.2}
|
||||
|
||||
Το Linux υποστηρίζει εικονική μνήμη, δήλαδη χρησιμοποιεί ένα δίσκο σαν επέκταση της RAM, έτσι ώστε το συνολικό μέγεθος της χρησιμοποιήσιμης μνήμης να αυξάνει
|
||||
αναλογικά. Ο πυρήνας γράφει τα περιεχόμενα ενός τρέχοντος αχρησιμοποίητου block μνήμης στο σκληρό δίσκο έτσι ώστε η μνήμη να μπορεί να χρησιμοποιηθεί για άλλο
|
||||
σκοπό. Όταν τα αρχικά περιέχομενα χρειάζονται ξανά, διαβάζονται πάλι από τη μνήμη.
|
||||
|
||||
Αυτά όλα γίνονται τελείως αδιαφανή από το χρήστη. Προγράμματα που τρέχουν κάτω από το Linux βλέπουν μόνο τη μεγαλύτερη ποσότητα της διαθέσιμης μνήμης και δεν
|
||||
προσέχουν πως κομμάτια αυτών μένουν στο δίσκο από στιγμή σε στιγμή. Το κομμάτι του σκληρού δίσκου που χρησιμοποιείται σαν εικονική μνήμη ονομάζεται χώρος swap
|
||||
(χώρος προσωρινής αποθήκευσης).
|
||||
|
||||
### [1.3 Λειτουργία]{#ss1.3}
|
||||
|
||||
Όταν χρησιμοποιείται swap χώρος, το Linux μετακινεί αχρησιμοποιήτες σελίδες μνήμης στο σκληρό δισκό, επιτρέποντας να τρέχετε περισσότερες εφαρμογές ταυτόχρονα
|
||||
στο σύστημά σας.
|
||||
|
||||
Όμως, επειδή αυτή η διαδικασία είναι σχετικά αργή (χίλιες φορές περίπου), ο χώρος swap δεν μπορεί να αντικαταστήσει την πραγματική φυσική μνήμη RAM, που είναι
|
||||
πιο γρήγορη. Έτσι τα προγράμματα δεν τρέχουν το ίδιο γρήγορα. Οι εφαρμογές του X Window System, κυρίως, έχουν ιδιαίτερες απαιτήσεις σε μνήμη και γι\'αυτό θα
|
||||
πρέπει να έχετε μια συσκευή (αρχείο/κατάτμηση) swap.
|
||||
|
||||
Μερικά προγράμματα καταλαμβάνουν στατικά σελίδες πραγματικής μνήμης (κλειδώνοντάς τες) για λόγους ασφαλείας ή για λόγους απόδοσης. Με αυτόν τον τρόπο οι
|
||||
\"κλειδωμένες\" σελίδες μειώνουν το μέγεθος της διαθέσιμης πραγματικής μνήμης, καθιστώντας απαραίτητη τη χρήση swap μνήμης.
|
||||
|
||||
### [1.4 Swapping/Paging]{#ss1.4}
|
||||
|
||||
Με απλά λόγια:
|
||||
|
||||
Υπάρχει διαχωρισμός μεταξύ του swapping (γράφοντας ολόκληρες τις διεργασίες (processes) σε χώρο swap) και του paging (γράφοντας μόνο καθορισμένου μεγέθους
|
||||
κομμάτια, συνήθως μερικά kilobytes τη φορά).
|
||||
|
||||
Το paging είναι συνήθως πιο αποτελεσματικό, και αυτό είναι που κάνει το Linux, αλλά μιλάμε για swapping έτσι κι αλλιώς.
|
||||
|
||||
### [1.5 Μέγεθος swap]{#ss1.5}
|
||||
|
||||
Ορισμένοι προτείνουν ότι η swap μνήμη πρέπει να έχει διπλάσιο μέγεθος από αυτό της πραγματικής μνήμης. Υπάρχουν αρκετές διαφοροποιήσεις σχετικά με το πόση swap
|
||||
μνήμη θα πρέπει να χρησιμοποιήσετε: όλες εξαρτώνται από το τι εφαρμογές θέλετε να τρέχετε\...
|
||||
|
||||
Το μέγεθος του χώρου swap εξαρτάται ακόμη από πόση μνήμη έχετε ήδη στο σύστημά σας.
|
||||
|
||||
Αν έχετε αρκετή φυσική μνήμη (\>128ΜΒ) και είστε ο μοναδικός χρήστης του συστήματος χωρίς ιδιαίτερες απαιτήσεις μπορεί να σκεφτείτε να μην χρησιμοποιήσετε μνήμη
|
||||
swap, έχοντας έτσι περισσότερο ελεύθερο αποθηκευτικό χώρο και μειώνοντας το χρόνο αναζήτησης στα δεδομένα σας.
|
||||
|
||||
Μπορεί να μην χρησιμοποιείτε μια swap κατάτμηση πολύ συχνά, όταν όμως τη χρειαστείτε η παρουσία της είναι ανεκτίμητη.
|
||||
|
||||
Πιθανότατα δεν έχει νόημα να έχετε swap μνήμη περισσότερη από τρεις φορές της φυσικής μνήμης.
|
||||
|
||||
Υπολογίστε τη συνολικη σας ανάγκη σε μνήμη. Αυτή είναι το μεγαλύτερο μέγεθος μνήμης που πιθανώς θα χρειαστείτε σε κάθε στιγμή, δηλαδή το άθροισμα των απαιτήσεων
|
||||
σε μνήμη όλων των προγραμμάτων που θέλετε να τρέχετε ταυτοχρόνως. Αυτό μπορεί να γίνει τρέχοντας την ίδια ώρα όλα τα προγράμματα που πιθανώς θα τρέξετε ποτέ
|
||||
ταυτοχρόνως. Για παράδειγμα, αν θέλετε να τρέχετε το X Window System, θα πρέπει να καταχωρίσετε περίπου 8-16 MB για αυτό, ο gcc θέλει αρκετά megabytes (μερικά
|
||||
αρχεία χρειάζονται μία ασυνήθιστα μεγάλη ποσότητα, μέχρι και δεκάδες megabytes, αλλά συνήθως περίπου 4-8 θα είναι αρκετά) κτλ. Ο πυρήνας θα χρησιμοποιήσει
|
||||
περίπου 1-2ΜΒ από μόνος του, και τα συνηθισμένα shells και άλλα μικρά βοηθητικά προγράμματα ίσως μερικές εκατοντάδες kilobytes (περίπου 1ΜΒ όλα μαζί). Δεν
|
||||
υπάρχει ανάγκη να προσπάθησετε να είστε ακριβείς, υπολογισμοί στο περίπου είναι μια χαρά, αλλά μπορεί να θέλετε να είστε στην απαισιόδοξη πλευρά.
|
||||
|
||||
Θυμηθείτε πως αν υπάρχουν αρκετά άτομα που χρησιμοποιούν το σύστημα ταυτοχρόνως, θα καταναλώνουν όλα μνήμη. Πάντως, αν δύο άτομα τρέχουν το ίδιο πρόγραμμα
|
||||
αταυτοχρόνως, η συνολική κατανάλωση μνήμης συνήθως δεν είναι διπλάσια, εφόσον οι σελίδες του κώδικα και οι shared βιβλιοθήκες υπάρχουν ήδη μια φορά.
|
||||
|
||||
### [1.6 Όρια]{#ss1.6}
|
||||
|
||||
Το μέγιστο χρήσιμο μέγεθος μιας περιοχής swap εξαρτάται πλέον από την αρχιτεκτονική του συστήματος.
|
||||
|
||||
Είναι περίπου:
|
||||
|
||||
- 2GB σε i386, PPC, m68k, ARM,
|
||||
- 1GB σε sparc,
|
||||
- 512MB σε mips,
|
||||
- 128GB σε alpha και
|
||||
- 3TB σε sparc64.
|
||||
|
||||
Υποστηρίζονται μέχρι και 8 συνολικά περιοχές swap.
|
||||
|
||||
### [1.7 Συμβουλές για μέγιστη απόδοση]{#ss1.7}
|
||||
|
||||
Συνιστάται η χρησιμοποιήση μιας swap κατάτμησης παρά ενός swap αρχείου. Έτσι σε πολλές εγκαταστάσεις του Linux θα συναντήσετε δύο τουλάχιστον κατατμήσεις. To
|
||||
swapping σε αρχείο επιφέρει σχετική μείωση της απόδοσης του συστήματος γιατί πηγαίνει μέσω του συστήματος αρχείων (ext2). Από την άλλη, μπορείτε να προσθέσετε
|
||||
swap αρχείο όποτε θέλετε χωρίς καμία ανάγκη για κατάτμηση των δίσκων σας.
|
||||
|
||||
Χρησιμοποποιείστε πρώτα αρχείο swap, δουλέψτε με το σύστημα σας για λίγο καιρό για να δείτε πόση μνήμη swap χρειάζεστε περίπου, και μετά φτιάξτε μια κατάτμηση
|
||||
swap. Μπορείτε βέβαια να χρησιμοποιείτε πολλές swap κατατμήσεις ή/και swap αρχεία, ταυτοχρόνως.
|
||||
|
||||
Αφήστε, πάντως, περιθώρια ασφαλείας γιατί πιθανότατα θα ξεχάσετε να τρέξετε μερικά προγράμματα που θα θέλετε να τρέχετε και βεβαιωθείτε ότι έχετε ελέυθερο χώρο
|
||||
σε κάθε περίπτωση. Είναι καλύτερα να καταχωρήσετε πάρα πολύ χώρο παρά πολύ λίγο (προσέξτε τους τόνους στο παρα\...), αλλά δεν υπάρχει ανάγκη να το παρακάνετε
|
||||
και να καταχωρήσετε ολόκληρο δίσκο, εφόσον αχρησιμοποιήτος χώρος swap είναι no doubt wasted χώρος.
|
||||
|
||||
Αν ο χώρος swap, που θα υπολογίσετε με την παραπάνω μέθοδο, είναι πάρα πολύ μεγαλύτερος από τη φυσική σας μνήμη (όχι τη δικιά σας, του συστήματος σας\...),
|
||||
καλύτερα να σκεφτείτε σοβαρά να επενδύσετε στην αγορά περισσότερης φυσικής μνήμης, αλλιώς η απόδοση θα είναι αρκετά χαμηλή.
|
||||
|
||||
Είναι καλή ιδέα να έχετε τουλάχιστον λίγο χώρο swap, ακόμη και αν οι υπολογισμοί σας δείχουν ότι δεν χρειάζεστε καθόλου. Το Linux χρησιμοποιεί το χώρο swap
|
||||
δυαναμικά, έτσι ώστε όση περισσότερη φυσική μνήμη το δυνατόν να μπορεί να παραμείνει ελεύθερη. Το Linux θα swap out σελίδες μνήμης που δεν έχουν χρησιμοποιηθεί,
|
||||
ακόμη και αν η μνήμη δεν χρειάζεται ακόμη για τίποτα. Αυτό αποφεύγει την αναμονή για swapping όταν χρειάζεται: το swapping μπορεί να γίνει νωρίτερα, όταν ο
|
||||
δίσκος είναι έτσι κι αλλιώς αδρανής.
|
||||
|
||||
Ο χώρος swap μπορεί να χωριστεί ανάμεσα σε αρκετούς δίσκους. Αυτό μερικές φορές βελτιώνει την απόδοση, ανάλογα με τις σχετικές ταχύτητες των δίσκων και το χρόνο
|
||||
προσπέλασης αυτών. Μπορεί να θέλετε να πειραματιστείτε με μερικά διαδεδομένα μοντέλα, αλλά κατανοήστε ότι κάνοντας τα πειράματα κανονικά είναι αρκετά δύσκολο.
|
||||
Δε θα πρέπει να πιστεύετε φήμες που λένε ότι ένα μοντέλο είναι ανώτερο από κάθε άλλο, εφόσον δε θα είναι πάντα αληθείς.
|
||||
|
||||
Μπορείτε να χρησιμoποιήσετε και περισσότερες από μία swap κατατμήσεις.
|
||||
|
||||
Μερικοί χρησιμοποιούν RAM disks για swapping, δεν κερδίζετε πολλά με αυτόν τον τρόπο αφού μειώνεται τη διαθέσιμη μνήμη για caching και buffering.
|
||||
|
||||
Συνιστάται να δημιουργείτε κατατμήσεις swap σε μεσαία tracks του σκληρού δίσκου (συνήθως /dev/?d?x, όπου xε{4,5,\...} ανάλογα με τον αριθμό των υπάρχοντων
|
||||
κατατμήσεων) , γιατί τότε η αναζήτηση είναι σχετικά γρήγορη (γρήγορη διαμεταγωγή και αναζήτηση αρχείων).
|
||||
|
||||
Αν χρησιμοποιείτε swap αρχείο συνιστάται να τοποθετείται σε ξεχωριστή κατάτμηση, αφού περιλαμβάνει λιγότερα ρίσκα. Αυτή η κατάτμηση δε θα μπορεί πλεόν να
|
||||
χρησιμοποιηθεί, ακόμη και αν φαίνεται να υπάρχει ελεύθερος χώρος σε αυτή.
|
||||
|
||||
|
||||
### [2. Swap αρχεία]{#s2}
|
||||
|
||||
Ένα swap αρχείο είναι ένα κανονικό αρχείο. Δεν είναι με κανένα τρόπο ειδικό προς τον πυρήνα. Το μόνο πράγμα που νοιάζει τον πυρήνα είναι να μην έχει καθόλου
|
||||
\"τρύπες\", και να είναι έτοιμο για χρήση με την εντολή mkswap.
|
||||
|
||||
Πρέπει, πάντως, να διαμένει σε έναν τοπικό δίσκο του συστήματος. Δεν μπορεί να διαμένει σε ένα σύστημα αρχείων που έχει προσαρτηθεί μέσω NFS για λόγους
|
||||
υλοποίησης.
|
||||
|
||||
Το κομμάτι σχετικά με τις \"τρύπες\" είναι σημαντικό. Το αρχείο swap κρατάει τον χώρο του δίσκου έτσι ώστε ο πυρήνας να μπορεί γρήγορα να swap out μια σελίδα
|
||||
χωρίς να χρειάζεται να παέι μέσω όλων των πραγμάτων που είναι χρήσιμα όταν καταχωρεί ένα sector δίσκου σε ένα αρχείο. Ο πυρήνας απλώς χρησιμοποιεί όποιους
|
||||
τομείς έχουν ήδη καταχωρηθεί στο αρχείο. Επειδή μια \"τρύπα\" σε ένα αρχείο σημαίνει πως δεν υπάρχουν καθόλου τομείς δίσκου καταχωρημένοι (για αυτό το μέρος
|
||||
μέσα στο αρχείο), δεν είναι καλό για τον πυρήνα να προσπαθεί να τους χρησιμοποιεί.
|
||||
|
||||
### [2.1 Ορισμός swap αρχείου]{#ss2.1}
|
||||
|
||||
Ένας καλός τρόπος για να δημιουργήσετε το swap αρχείο χωρίς \"τρύπες\" είναι μέσω της ακόλουθης εντολής:
|
||||
|
||||
dd if=/dev/zero of=<swap αρχείο> bs=<bytes> count=<blocks>
|
||||
|
||||
- if=/dev/zero : input file, διαβάζει από αυτό το αρχείο
|
||||
- of=\<swap αρχείο\> : output file, γράφει σε αυτό το αρχείο
|
||||
- bs=\<bytes\> : block size, διαβάζει και γράφει \<bytes\> bytes κάθε φορά
|
||||
- count=\<blocks\> : αντιγράφει μόνο \<blocks\> blocks από αυτά που διαβάζει
|
||||
|
||||
Θα εμφανιστεί το μήνυμα:
|
||||
|
||||
<blocks>+0 records in
|
||||
<blocks>+0 records out
|
||||
|
||||
Είναι καλύτερα το μέγεθος να είναι πολλαπλάσιο του 4, επειδή ο πυρήνας γράφει σελίδες μνήμης, που είναι 4ΚΒ σε μέγεθος. Αν το μέγεθος δεν είναι πολλαπλάσιο του
|
||||
4, το τελευταίο ζευγάρι των kilobytes μπορεί να είναι αχρησιμοποίητο. Ειδικότερα, για swap αρχείο το μέγεθος είναι καλό να είναι πολλαπλάσιο του inode μεγέθους,
|
||||
συνήθως 1024 ή 2048 (ή ακόμη και 4096), γιατί 1block=1KB=1024 bytes άρα τιμές πολλαπλάσιες του 1024.
|
||||
|
||||
### [2.2 Ρόλος του /dev/zero]{#ss2.2}
|
||||
|
||||
Το /dev/zero είναι ένα ειδικό αρχείο που κατά την ανάγνωσή του, επιστρέφει \\0 χαρακτήρες. Είναι μια συσκευή που όταν την διαβάζετε παίρνετε άπειρα ASCII 0.
|
||||
Είναι χρήσιμη ως πηγή \"κενών\" bytes, όπως ακριβώς και πολλοί επεξεργαστές RISC έχουν ένα zero καταχωρητή που είναι πάντα 0.
|
||||
|
||||
Δημιουργείται με:
|
||||
|
||||
mknod -m 666 /dev/zero c 1 5
|
||||
chown root.mem /dev/zero
|
||||
|
||||
|
||||
### [3. Swap κατατμήσεις]{#s3}
|
||||
|
||||
Μία swap κατάτμηση δεν είναι επίσης ειδική με κανέναν τρόπο. Τη δημιουργείτε όπως κάθε άλλη κατάτμηση. Η μόνη διαφορά είναι ότι χρησιμοποιείται σαν μια άδεια
|
||||
(raw) κατάτμηση, δηλαδή, δεν περιέχει κανένα σύστημα αρχείων. Είναι καλη ιδέα να σημειώνετε τις κατατμήσεις swap σαν τύπο 82 (Linux swap). Αυτό κάνει τα
|
||||
περιεχόμενα της κατάτμησης πιο σαφή, αν και δεν είναι αυστηρώς απαραίτητο στον πυρήνα.
|
||||
|
||||
Όπως αναφέραμε, οι κατατμήσεις swap είναι πιο γρήγορες ξεπερνούν το σύστημα αρχείων, διαβάζοντας κατευθείαν από τον σκληρό δίσκο.
|
||||
|
||||
### [3.1 Ορισμός swap κατάτμησης]{#ss3.1}
|
||||
|
||||
Η swap κατάτμηση δεν είναι ανάγκη να βρίσκεται στον ίδιο σκληρό δίσκο με την κατάτμηση που είναι εγκατεστημένο το Linux.
|
||||
|
||||
Τρέξτε το πρόγραμμα fdisk. Δώστε n (add a new partition), μετά p (primary partition), για hex code: 82 (αν γράψετε l θα δείτε ότι αυτός ο τύπος αντιστοιχεί σε
|
||||
κατάτμηση Linux swap).
|
||||
|
||||
Κάθε είδος κατάτμησης έχει έναν ξεχωριστό (identifier number) αριθμό ώστε να αναγνωρίζεται από το λειτουργικό σύστημα. (π.χ. για το Linux είναι 83).
|
||||
|
||||
Τελος, δώστε: w (write table to disk and exit).
|
||||
|
||||
|
||||
### [4. Ρύθμιση swap συσκευών]{#s4}
|
||||
|
||||
Εφόσον έχετε δημιουργήσει ένα swap αρχείο ή μια swap κατάτμηση, πρέπει να γράψετε μια υπογραφή στην αρχή του/της, αυτή περιέχει μερικές διευθυντικές πληροφορίες
|
||||
και χρησιμοποιείται από τον πυρήνα. Η εντολή για να το κάνετε αυτό είναι η mkswap. Τη χρησιμοποιείτε έτσι:
|
||||
|
||||
mkswap <swap συσκευή> <μέγεθος>
|
||||
|
||||
Συνηθισμένες παράμετροι:
|
||||
|
||||
- -c ελέγχει τη συσκευή (block device) για bad blocks
|
||||
- -v0 παλιά μέθοδος (μέχρι 128ΜΒ)
|
||||
- -v1 νέα μέθοδος (μέχρι 2GB)
|
||||
|
||||
Θα εμφανιστεί το μήνυμα:
|
||||
|
||||
Setting up swapspace, size = <μεγεθος> bytes
|
||||
|
||||
Ο swap χώρος δεν χρησιμοποιείται ακόμη. Υπάρχει, αλλά ο πυρήνας δεν τον χρησιμοποιεί για να παρέχει εικονική μνήμη.
|
||||
|
||||
Πρέπει να είστε πολύ προσεκτικοί στη χρησιμοποίηση της εντολής mkswap, εφόσον ΔΕΝ ελέγχει αν το αρχείο ή η κατάτμηση χρησιμοποιείται για άλλο σκοπό. Η
|
||||
χρησιμοποίησή της γίνεται συνήθως κατά την εγκατάσταση του συστήματος, την εκτελείτε μόνο ΜΙΑ φορά.
|
||||
|
||||
|
||||
### [5. Συγχρονισμός\... ΤΩΡΑ]{#s5}
|
||||
|
||||
H εντολή sync μέσω της συνάρτησης sync() δεσμεύει πρώτα τα inodes σε buffers, και μετά τα buffers στο σκληρό δίσκο. Εκτελείται, συνήθως, αμέσως μετά από την
|
||||
mkswap.
|
||||
|
||||
### [5.1 Ρόλος της sync]{#ss5.1}
|
||||
|
||||
Κάθε U\*ix έχει φορτωμένο στη μνήμη το super block και τον inode πίνακα και ό,τι δουλειά κάνει πάνω σε αυτά την κάνει στη MNHMH, για ταχύτητα. Περιοδικά τα
|
||||
\"κατεβάζει\" και στο δίσκο, για αποφυγή απρόσμενων γεγονότων. To sync είναι ακριβώς η εντολή που κάνει το \"κατέβασμα\". Με αυτόν τον τρόπο μπορεί κάποιος να
|
||||
βεβαιωθεί ότι ολά έχουν γραφτεί με ασφάλεια.
|
||||
|
||||
Στα περισσότερα UNIX συστήματα, υπάρχει ένα πρόγραμμα ου λέγεται update και τρέχει στο background κάνοντας ένα sync κάθε 30 δευτερόλεπτα, οπότε συνήθως δεν
|
||||
είναι απαραίτητο να χρησιμοποιήσετε την sync. Το Linux έχει έναν επιπρόσθετο δαίμονα (daemon), τον bdflush, ο οποίος κάνει ένα πιο ατελές sync πιο συχνά.
|
||||
|
||||
Κάτω από το Linux, ο bdflush εκκινείται από το update. Δεν υπάρχει συνήθως κανένας λόγος για να ανησυχείτε, αλλά αν ο bdflush πεθάνει για κάποιο λόγο, ο πυρήνας
|
||||
θα σας προειδοποιήσει γι\' αυτό, και θα πρέπει να τον ξεκίνησετε μόνοι σας (/sbin/update).
|
||||
|
||||
|
||||
### [6. Χρησιμοποίηση swap συσκευών]{#s6}
|
||||
|
||||
Εφόσον έχουν ακολουθηθεί τα παραπάνω βήματα για ρύθμιση swap αρχείων/κατατμήσεων, η χρησιμοποίηση αυτών από τον πυρήνα γίνεται με την εντολή swapon.
|
||||
|
||||
### [6.1 Το αρχείο /etc/fstab]{#ss6.1}
|
||||
|
||||
FileSystem TABle
|
||||
|
||||
Το αρχείο /etc/fstab δίνει πληροφορίες για τα διάφορα συστήματα αρχείων στα οποία μπορούμε να έχουμε πρόσβαση.
|
||||
|
||||
Για μια swap συσκευή θα δείτε μια γράμμη όπως η παρακάτω. Στο σύστημά μου (powered by SuSE) είναι:
|
||||
|
||||
/dev/hde3 swap swap defaults 0 0
|
||||
|
||||
### [6.2 Εξηγήσεις\...]{#ss6.2}
|
||||
|
||||
- Το πρώτο πεδίο περιγράφει τη block συσκευή ή το σύστημα αρχείων που θέλουμε να προσαρτήσουμε,
|
||||
- το δεύτερο περιγράφει το σημείο προσάρτησης (για swap κατάτμηση είναι swap),
|
||||
- το τρίτο περιγράφει τον τύπο του συστήματος αρχείων (δείτε cat /proc/filesystems για αυτά που υποστηρίζονται από τον τρέχοντα πυρήνα σας),
|
||||
- το τέταρτο περιγράφει τις παραμέτρους προσάρτησης,
|
||||
- το πέμπτο χρησιμοποιείται από την εντολή dump (στην περίπτωσή μας είναι 0, δεν χρειάζεται),
|
||||
- το έκτο καθορίζει τη σειρά προτεραιότητας με την οποία τα συστήματα αρχείων ελέγχονται κατά την εκκίνηση του Linux (στην περίπτωση μας είναι 0, δεν είναι
|
||||
απαραίτητο).
|
||||
|
||||
### [6.3 Παράμετροι στην swapon]{#ss6.3}
|
||||
|
||||
-a: διαβάζει το /etc/fstab και κάνει διαθέσιμες τις συσκευές/αρχεία που προορίζονται για swapping.
|
||||
|
||||
-p: θέτει προτεραίοτητα στο swapon, 0 \< p \< 32767 από το /etc/fstab, όπου pri=\"τιμή\".
|
||||
|
||||
### [6.4 Αυτόματη χρησιμοποιήση swap συσκευών]{#ss6.4}
|
||||
|
||||
Επεξεργαστείτε το αρχείο /etc/fstab και δημιουργήστε ένα νέο πεδίο για κάθε συσκευή που θέλετε να χρησιμοποιήσετε.
|
||||
|
||||
Τα script εκκίνησης θα τρέξουν την εντολή swapon -a χρησιμοποιώντας όσες swap συσκευές έχουν καταχωριθεί στο /etc/fstab. Επομένως, η εντολή swapon
|
||||
χρησιμοποιείται μόνο όταν χρειάζεται περισσότερος χώρος swap.
|
||||
|
||||
### [6.5 Μή χρησιμοποίηση swap συσκευών]{#ss6.5}
|
||||
|
||||
Μία περιοχή swap μπορεί να μην χρησιμοποιηθεί με χρήση της εντολής swapoff. Δεν είναι συνήθως απαραίτητο να το κάνετε, εκτός από προσωρινούς χώρους swap. Όλες
|
||||
οι σελίδες που χρησιμοποιούνται στο χώρο swap αντιγράφονται στη μνήμη πρώτα. Αν δεν υπάρχει αρκετή φυσική μνήμη να τις κρατήσει, Θα αντιγραφούν τότε σε κάποιον
|
||||
άλλο χώρο. Αν δεν υπάρχει αρκετή εικονική μνήμη να κρατήσει όλες τις σελίδες, το Linux θα αρχίσει να thrash (πιθανότατα, θα αρχίσει να παραπονιέται ο σκληρός,
|
||||
όσο σκληρός και αν είναι\...). Ύστερα από λίγο, θα πρέπει να γίνει recover, αλλά ενδιάμεσα το σύστημα θα είναι μη χρησιμοποιήσιμο. Θα πρέπει να ελέγξτε (π.χ.,
|
||||
με free) αν υπάρχει αρκετή ελεύθερη μνήμη πριν απομακρύνετε ένα χώρο swap από χρήση.
|
||||
|
||||
Όλες οι περιοχές swap που χρησιμοποιούνται αυτόματα με swapon -a μπορούν αν απομακρυνθούν με swapoff -a. Διαβάζει το αρχείο /etc/fstab για να βρει τί να
|
||||
απομακρύνει. Όσες περιοχές swap έχουν χρησιμοποιηθεί manually θα παραμείνουν σε χρήση.
|
||||
|
||||
Μερικές φορές πολύς χώρος swap μπορεί να χρησιμοποιείται ακόμη και αν υπάρχει αρκετή πραγματική μνήμη διαθέσιμη. Αυτό μπορεί να συμβεί για παράδειγμα αν σε
|
||||
κάποιο σημείο υπάρχει ανάγκη για swap, αλλά αργότερα μια μεγάλη διεργασία που καταλάμβανε μεγάλο μέρος της φυσικής μνήμης τερματίζεται και ελευθερώνει τη μνήμη.
|
||||
Τα swapped-out δεδομένα δεν αντιγράφονται αυτόματα στη μνήμη έως ότου χρειάζεται, έτσι η φυσική μνήμη μπορεί να παραμείνει ελεύθερη για ένα μεγάλο χρονικό
|
||||
διάστημα. Δεν υπάρχει καμία ανάγκη να ανησυχείτε γι\'αυτό, αλλά μπορεί να σας ανακουφίζει το γεγονός αν γνωρίζετε τι συμβαίνει.
|
||||
|
||||
|
||||
### [7. Έλεγχος χρήσης swap συσκευών]{#s7}
|
||||
|
||||
Έχοντας μια swap συσκευή μπορείτε να δείτε πόση από αυτή χρησιμοποιείται. Απλώς δώστε:
|
||||
|
||||
### [7.1 free]{#ss7.1}
|
||||
|
||||
total used free shared buffers cached
|
||||
Mem: 63092 61604 1488 12684 7664 43396
|
||||
-/+ buffers/cache: 10544 52548
|
||||
Swap: 136512 376 136136
|
||||
|
||||
Η πρώτη γραμμή Mem εμφανίζει τη φυσική μνήμη.
|
||||
|
||||
- Η στήλη total ΔΕΝ εμφανίζει τη φυσική μνήμη που χρησιμοποιείται από τον πυρήνα, που είναι περίπου 1-2MB.
|
||||
- Η στήλη used εμφανίζει το μέγεθος της μνήμης που χρησιμοποιείται (η δεύτερη γραμμή δεν μετράει buffers).
|
||||
- Η στήλη free εμφανίζει το μέγεθος της αχρησιμοποίητης μνήμης.
|
||||
- Η στήλη shared εμφανίζει το μέγεθος της μνήμης που μοιράζεται από διάφορες διεργασίες, όσο περισσότερη, τόσο καλύτερη.
|
||||
- Η στήλη buffers εμφανίζει το τρέχον μέγεθος buffer cache του δίσκου.
|
||||
|
||||
Η τελευταία γραμμή Swap εμφανίζει παρόμοιες πληροφορίες για τις περιοχές swap. Αν αυτή η γραμμή είναι όλο μηδενικά, ο swap χώρος σας δεν έχει ενεργοποιηθει.
|
||||
|
||||
### [7.2 cat /proc/meminfo]{#ss7.2}
|
||||
|
||||
total: used: free: shared: buffers: cached:
|
||||
Mem: 64606208 63078400 1527808 12877824 7847936 44437504
|
||||
Swap: 139788288 385024 139403264
|
||||
MemTotal: 63092 kB
|
||||
MemFree: 1492 kB
|
||||
MemShared: 12576 kB
|
||||
Buffers: 7664 kB
|
||||
Cached: 43396 kB
|
||||
BigTotal: 0 kB
|
||||
BigFree: 0 kB
|
||||
SwapTotal: 136512 kB
|
||||
SwapFree: 136136 kB
|
||||
|
||||
### [7.3 cat /proc/swaps]{#ss7.3}
|
||||
|
||||
Filename Type Size Used Priority
|
||||
/dev/hde4 partition 136512 376 -1
|
||||
|
||||
### [7.4 top]{#ss7.4}
|
||||
|
||||
Mem: 63092K av, 61544K used, 1548K free, 13116K shrd, 7516K buff
|
||||
Swap: 136512K av, 376K used, 136136K free 43372K cached
|
||||
|
||||
### [7.5 procinfo]{#ss7.5}
|
||||
|
||||
Memory: Total Used Free Shared Buffers Cached
|
||||
Mem: 63092 61488 1604 12796 7516 43372
|
||||
Swap: 136512 376 136136
|
||||
|
||||
|
||||
### [8. Ιδέες\...]{#s8}
|
||||
|
||||
### [8.1 Συνδυασμός swap και /tmp]{#ss8.1}
|
||||
|
||||
Η ιδέα υπάρχει από το tmpfs στα \*BSD και το Solaris, καθώς και από το swapfs σε NeXT συστήματα.
|
||||
|
||||
Η λογική είναι ότι αυτά χρησιμοποιούνται για προσωρινή αποθήκευση που υπό κανονικές συνθήκες δεν απαιτούν πάρα πολύ χωρό. Έτσι συνδυάζοντας τα swap και /tmp δε
|
||||
χρειάζεται να κρατάτε ξεχωριστό χώρο για αυτά τα δύο, όπως κανονικά θα έπρεπε. Αυτό το ειδικευμένο σύστημα αρχείων είναι ένας swappable RAM δίσκος, που
|
||||
τοποθετεί τα προσωρινά αρχεία στην swap κατάτμηση. Σημαντικό μειονέκτημα είναι ότι για να κερδίσετε αποθηκευτικό χώρο, χάνετε ταχύτητα (μειώνεται λίγο η απόδοση
|
||||
του συστήματος), αφού δεν μπορείτε να έχετε και τα δυο σε παραλληλία, γεγονός που ξεπερνιέται με χρήση πολλαπλών δίσκων (interleaving). Με αυτόν τον τρόπο
|
||||
μπορείτε να μοιράσετε σε διάφορους δίσκους το φόρτωμα του εν λόγω συστήματος αρχείων και να πετύχετε παραλληλία.
|
||||
|
||||
### [8.2 Swap κατ\' απαίτηση με loopback device]{#ss8.2}
|
||||
|
||||
Εφόσον έχετε υποστήριξη για loopback devices στον πυρήνα, γράψτε ένα shell script ώστε να εκχωρείται δυναμικά ο χώρος του swap σε αρχείο βέβαια, χωρίς ξεχωριστή
|
||||
κατάτμηση\.....κτλ, κτλ
|
||||
|
||||
|
||||
### [9. Ίδιος χώρος swap με άλλα λειτουργικά συστήματα]{#s9}
|
||||
|
||||
### [9.1 FreeBSD]{#ss9.1}
|
||||
|
||||
Δεν έχω (ακόμα\...) δεν έχω δοκιμάσει. Δείτε το Linux+FreeBSD mini HOWTO.
|
||||
|
||||
### [9.2 Microsoft Windows]{#ss9.2}
|
||||
|
||||
Έχω (ακόμα\...), δεν έχω δοκιμάσει. Δείτε το Tips-HOWTO και το Swap-Space mini HOWTO, που πλέον συντηρείται. Το ονομα είναι παραπλανητικό\... αναφέρεται σε
|
||||
ειδικό θέμα ενώ το όνομά του παραπέμπει αλλού.
|
||||
|
||||
|
||||
### [10. Σχετικά]{#s10}
|
||||
|
||||
### [10.1 No time\...]{#ss10.1}
|
||||
|
||||
Τα τρία τελευταία κομμάτια, για loopback και για μοίρασμα χώρου swap με άλλα OS θα μπορούσα να τα αναλύσω περισσότερο. Έδωσα, πάντως, κάποιους κατευθυντήριους
|
||||
άξονες για κάθε ενδιαφερόμενο. Ήθελα να δώσω το στοιχείο της πληρότητας αλλά αν το έκανα σε κάθε πιθανή γωνία του παρόντος θα κατέληγα σε πληρέστατο HOWTO, που
|
||||
θα απαιτούσε πολύ χρόνο\...
|
||||
|
||||
### [10.2 Πηγές]{#ss10.2}
|
||||
|
||||
Για τη σύνταξη του παραπάνω χρησιμοποιήθηκαν διάφορες πηγές, από HOWTOs, από το SAG, από ερωτήσεις/απαντήσεις διάφορων mailining lists/newsgroups, από σχετικές
|
||||
man pages, εγχειρίδια διανομών, βιβλία για το Linux κτλ, κτλ.
|
||||
|
569
content/articles/22/03_vi.md
Κανονικό αρχείο
569
content/articles/22/03_vi.md
Κανονικό αρχείο
|
@ -0,0 +1,569 @@
|
|||
+++
|
||||
title = 'Οι βασικές λειτουργίες του VI'
|
||||
date = '1999-03-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Ζανικόλας Σεραφείμ(mailto:serzan@it.teithe.gr)'
|
||||
issue = ['Magaz 22']
|
||||
issue_weight = 3
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Αυτό το έγγραφο φιλοδοξεί να παρουσιάσει με κατανοητό και γρήγορο τρόπο τις βασικές λειτουργίες του `VI`, ενός από τους καθιερωμένους επεξεργαστές κειμένου των
|
||||
UNIX λειτουργικών συστημάτων.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
**1. Σχετικά\...**
|
||||
---------------------------------------
|
||||
|
||||
**2. Εισαγωγή**
|
||||
------------------------------------
|
||||
|
||||
**3. Μετακίνηση**
|
||||
--------------------------------------
|
||||
|
||||
- [3.1 Στα όρια της ενεργής γραμμής](#ss3.1)
|
||||
- [3.2 Σε σχέση με την οθόνη](#ss3.2)
|
||||
- [3.3 Σε όλο το κείμενο](#ss3.3)
|
||||
|
||||
**4. Επεξεργασία Κειμένου**
|
||||
------------------------------------------------
|
||||
|
||||
- [4.1 Εισαγωγή](#ss4.1)
|
||||
- [4.2 Διαγραφή](#ss4.2)
|
||||
- [4.3 Αντικατάσταση](#ss4.3)
|
||||
- [4.4 Αλλες χρήσιμες εντολές επεξεργασίας](#ss4.4)
|
||||
|
||||
**5. Αναζήτηση**
|
||||
-------------------------------------
|
||||
|
||||
- [5.1 Στα όρια της ενεργής γραμμής](#ss5.1)
|
||||
- [5.2 Σε όλο το κείμενο](#ss5.2)
|
||||
|
||||
**6. Διαχείρηση Αρχείων**
|
||||
----------------------------------------------
|
||||
|
||||
**7. Διαχείριση περιοχών μνήμης προσωρινής αποθήκευσης (buffers)**
|
||||
---------------------------------------------------------------------------------------
|
||||
|
||||
**8. Διάφορες εντολές**
|
||||
--------------------------------------------
|
||||
|
||||
**9. Παραδείγματα**
|
||||
----------------------------------------
|
||||
|
||||
|
||||
### [1. Σχετικά\...]{#s1}
|
||||
|
||||
Όπως δηλώνει σαφώς και ο τίτλος, σε καμμία περίπτωση δεν αποτελεί πλήρη οδηγό του VI. Η ομαδοποίηση των εντολών έγινε αυθαίρετα έχοντας υπ\'όψη την -όσο το
|
||||
δυνατόν- ευκολότερη εκμάθηση τους. Για παρατηρήσεις / προτάσεις, επικοινωνήστε στην παραπάνω διεύθυνση. Τέλος το έγγραφο θα το βρείτε στη διεύθυνση
|
||||
http://aetos.it.teithe.gr/\~serzan/vi/vi.html
|
||||
|
||||
|
||||
### [2. Εισαγωγή]{#s2}
|
||||
|
||||
**Καταστάσεις Λειτουργίας, Εντολές**
|
||||
|
||||
: Ο `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 γραμμών (και αντιγραφή στην προσωρινή μνήμη)
|
||||
|
||||
|
||||
### [3. Μετακίνηση]{#s3}
|
||||
|
||||
Οι εντολές που δέχονται αριθμητικό πρόθεμα φαίνονται με το χαρακτήρα \[N\] ενώ εκείνες που μπορούν να χρησιμοποιηθούν ως επίθεμα των εντολών `y d c` με \[E\]
|
||||
|
||||
### [3.1 Στα όρια της ενεργής γραμμής]{#ss3.1}
|
||||
|
||||
**`[N][E] w b e`**
|
||||
|
||||
: μετακίνηση στην επόμενη λέξη, στην αρχή ή στο τέλος λέξης (οι λέξεις αποτελούνται από γράμματα και ψηφία, οτιδήποτε άλλο θεωρείται διαχωριστικό λέξης)
|
||||
|
||||
**`[N][E] W B E`**
|
||||
|
||||
: μετακίνηση στην επόμενη λέξη, στην αρχή ή στο τέλος λέξης (οι λέξεις αποτελούντα από οποιουσδήποτε χαρακτήρες εκτός από το κενό, που έιναι διαχωριστικό
|
||||
λέξης)
|
||||
|
||||
**`[E] 0`**
|
||||
|
||||
: μεταφορά του δρομέα στην πρώτη στήλη της ενεργής γραμμής
|
||||
|
||||
**`[E] n|`**
|
||||
|
||||
: μεταφορά του δρομέα στην νιοστή στήλη της ενεργής γραμμής ή στην πρώτη εάν δεν προσδιοριστεί το `n`
|
||||
|
||||
**`[E] $`**
|
||||
|
||||
: μετακίνηση του δρομέα στο τέλος της ενεργής γραμμής
|
||||
|
||||
### [3.2 Σε σχέση με την οθόνη]{#ss3.2}
|
||||
|
||||
**`[E] H`**
|
||||
|
||||
: μετακίνηση στην πρώτη γραμμή της οθόνης
|
||||
|
||||
**`[E] M`**
|
||||
|
||||
: μετακίνηση στη γραμμή στη μέση της οθόνης
|
||||
|
||||
**`[E] L`**
|
||||
|
||||
: μετακίνηση στην τελευταία γραμμή της οθόνης
|
||||
|
||||
**`^F`**
|
||||
|
||||
: μετακίνηση μία οθόνη προς τα κάτω
|
||||
|
||||
**`^B`**
|
||||
|
||||
: μετακίνηση μία οθόνη προς τα πάνω
|
||||
|
||||
### [3.3 Σε όλο το κείμενο]{#ss3.3}
|
||||
|
||||
**`[N] h j k l`**
|
||||
|
||||
: αριστερά, κάτω, πάνω, δεξιά (εναλλακτικά χρησιμοποιήστε τα βελάκια)
|
||||
|
||||
**`[E] nG`**
|
||||
|
||||
: μετακίνηση στη νιοστή γραμμή ή στο τέλος του αρχείου (χωρίς το `n`)
|
||||
|
||||
**`:n<CR>`**
|
||||
|
||||
: μετακίνηση στη νιοστή γραμμή
|
||||
|
||||
**`[E] 'a`**
|
||||
|
||||
: μετακίνηση στην πρώτη στήλη της γραμμής που σημειώθηκε ως `a`, αυτό γίνεται με την εντολή `ma` όπου `a` ένα οποιοδήποτε μικρό γράμμα του λατινικού αλφαβήτου
|
||||
|
||||
**`` [E] `a ``**
|
||||
|
||||
: μετακίνηση στη στήλη και στη γραμμή που σημειώθηκε ως `a`, αυτό γίνεται με την εντολή `ma` όπου `a` ένα οποιοδήποτε μικρό γράμμα του λατινικού αλφαβήτου
|
||||
|
||||
|
||||
### [4. Επεξεργασία Κειμένου]{#s4}
|
||||
|
||||
Οι εντολές που δέχονται αριθμητικό πρόθεμα φαίνονται με το χαρακτήρα \[N\] ενώ εκείνες που μπορούν να χρησιμοποιηθούν ως επίθεμα των εντολών `y d c` με \[E\]
|
||||
|
||||
### [4.1 Εισαγωγή]{#ss4.1}
|
||||
|
||||
**`atext`**
|
||||
|
||||
: γράφει το `text` στα δεξιά της θέσης του δρομέα (append)
|
||||
|
||||
**`A`text**
|
||||
|
||||
: γράφει το `text` στο τέλος της ενεργής γραμμής
|
||||
|
||||
**`itext`**
|
||||
|
||||
: γράφει το `text` στη θέση του δρομέα (insert)
|
||||
|
||||
**`Itext`**
|
||||
|
||||
: γράφει το `text` στην αρχή της ενεργής γραμμής
|
||||
|
||||
**`otext`**
|
||||
|
||||
: γράφει το `text` στην αρχή μιας νέας γραμμής που ανοίγει κάτω από την ενεργή (open)
|
||||
|
||||
**`Otext`**
|
||||
|
||||
: γράφει το `text` στην αρχή μιας νέας γραμμής που ανοίγει πάνω από την ενεργή
|
||||
|
||||
### [4.2 Διαγραφή]{#ss4.2}
|
||||
|
||||
Κάθε φορά που διαγράφετε κάτι, αυτό αντιγράφετε αυτόματα στη γενικής χρήσεως προσωρινή μνήμη (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` μπορεί να είναι: α) οποιοσδήποτε αριθμός γραμμής β). (τελεία - ενεργή γραμμή) γ) \$ (τελευταία
|
||||
γραμμή) δ) τα (β) ή (γ) + - αριθμητική σταθερά
|
||||
|
||||
### [4.3 Αντικατάσταση]{#ss4.3}
|
||||
|
||||
#### Στα όρια της ενεργής γραμμής
|
||||
|
||||
**`[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` μπορεί
|
||||
να είναι: α) οποιοσδήποτε αριθμός γραμμής β). (τελεία - ενεργή γραμμή) γ) \$ (τελευταία γραμμή) δ) τα (β) ή (γ) + - αριθμητική σταθε ρά
|
||||
|
||||
### [4.4 Αλλες χρήσιμες εντολές επεξεργασίας]{#ss4.4}
|
||||
|
||||
**`[N] ~`**
|
||||
|
||||
: αλλάζει το χαρακτήρα στη θέση του δρομέα, από μικρό σε κεφαλαίο ή αντίστροφα, και κινείται μία θέση δεξιά (μόνο για λατινικούς χαρακτήρες)
|
||||
|
||||
**`[N] u`**
|
||||
|
||||
: ακυρώνει μία ή περισσότερες ενέργεις (undo)
|
||||
|
||||
**`J`**
|
||||
|
||||
: ενώνει την ενεργή γραμμή με την επόμενη
|
||||
|
||||
|
||||
### [5. Αναζήτηση]{#s5}
|
||||
|
||||
Οι εντολές που δέχονται αριθμητικό πρόθεμα φαίνονται με το χαρακτήρα \[N\] ενώ εκείνες που μπορούν να χρησιμοποιηθούν ως επίθεμα των εντολών `y d c` με \[E\]
|
||||
|
||||
### [5.1 Στα όρια της ενεργής γραμμής]{#ss5.1}
|
||||
|
||||
**`[N][E] fa Fa`**
|
||||
|
||||
: μεταφορά του δρομέα στο πρώτο `a` που θα βρεθεί στη γραμμή προς τα δεξιά (`fa`) ή προς τα αριστερά (`Fa`)
|
||||
|
||||
**`[N][E] , ;`**
|
||||
|
||||
: επανάληψη τελευταίας αναζήτησης προς τα αριστερά (`,`) ή προς τα δεξιά (`;`)
|
||||
|
||||
### [5.2 Σε όλο το κείμενο]{#ss5.2}
|
||||
|
||||
**`/re`**
|
||||
|
||||
: αναζήτηση, προς τα εμπρός, του `re`, όπου `re` μια οποιαδήποτε συμβολοσειρά ή κανονική έκφραση
|
||||
|
||||
**`?re`**
|
||||
|
||||
: αναζήτηση, προς τα πίσω, του `re`, όπου `re` μια οποιαδήποτε συμβολοσειρά ή κανονική έκφραση
|
||||
|
||||
**`n`**
|
||||
|
||||
: επανάληψη τελευταίας αναζήτησης προς τα κάτω
|
||||
|
||||
**`N`**
|
||||
|
||||
: επανάληψη τελευταίας αναζήτησης προς τα πάνω
|
||||
|
||||
|
||||
### [6. Διαχείρηση Αρχείων]{#s6}
|
||||
|
||||
**`: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`, ανεξάρτητα από το αν έχουν αποθηκευτεί οι αλλαγές του αρχείου
|
||||
|
||||
|
||||
### [7. Διαχείριση περιοχών μνήμης προσωρινής αποθήκευσης (buffers)]{#s7}
|
||||
|
||||
Εκτός από την γενικής χρήσης ή ανώνυμη μνήμη αποθήκευσης υπάρχουν και οι επώνυμες, μία για κάθε (μικρό) γράμμα του λατινικού αλφαβήτου.
|
||||
|
||||
**`y[E]`**
|
||||
|
||||
: αντιγραφή του κειμένου, από το δρομέα εώς το σημείο που προσδιορίζει το `[E]`, στη γενικής χρήσης μνήμη
|
||||
|
||||
**`Y`**
|
||||
|
||||
: αντιγραφή της ενεργής γραμμής στη γενικής χρήσης μνήμη, ισοδύναμο του `yy`
|
||||
|
||||
**`"ay[E]`**
|
||||
|
||||
: αντιγραφή του κειμένου, από το δρομέα εώς το σημείο που προσδιορίζει το `[E]`, στην επώνυμη μνήμη `a`, όπου `a` οποιοδήποτε μικρό γράμμα του λατινικού
|
||||
αλφαβήτου
|
||||
|
||||
**`p P`**
|
||||
|
||||
: επικόλληση του περιεχομένου της γενικής χρήσης προσωρινής μνήμης μετά ή πριν τη θέση του δρομέα ή την ενεργή γραμμή (ανάλογα με το αν η μνήμη έχει λέξεις ή
|
||||
γραμμές)
|
||||
|
||||
**`"ap "aP`**
|
||||
|
||||
: επικόλληση του περιεχομένου της προσωρινής μνήμης `a` μετά ή πριν τη θέση του δρομέα
|
||||
|
||||
|
||||
### [8. Διάφορες εντολές]{#s8}
|
||||
|
||||
**`:sh`\<CR\>**
|
||||
|
||||
: προσωρινή έξοδος στο κέλυφος (shell), επιστροφή με `exit`
|
||||
|
||||
**`:!unix_cmd`\<CR\>**
|
||||
|
||||
: εκτέλεση της εντολής `unix_cmd`
|
||||
|
||||
**`:cd dir_name`\<CR\>**
|
||||
|
||||
: αλλαγή ενεργού καταλόγου στον `dir_name`
|
||||
|
||||
**`^G`**
|
||||
|
||||
: εμφανίζει το όνομα του αρχείου, ένδειξη τροποποίησης ή όχι, αρ.γραμμής και θέση του δρομέα στο αρχείο σε ποσοστό %
|
||||
|
||||
**`^Z`**
|
||||
|
||||
: προσωρινή διακοπή του `VI`, επιστροφή με fg
|
||||
|
||||
|
||||
### [9. Παραδείγματα]{#s9}
|
||||
|
||||
**`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`, στη θέση του δρομέα
|
||||
|
78
content/articles/22/04_internet.md
Κανονικό αρχείο
78
content/articles/22/04_internet.md
Κανονικό αρχείο
|
@ -0,0 +1,78 @@
|
|||
+++
|
||||
title = 'Οι κίνδυνοι του Internet'
|
||||
date = '2000-03-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Πρατικάκης Πολύβιος(mailto:el97649@central.ntua.gr)'
|
||||
issue = ['Magaz 22']
|
||||
issue_weight = 4
|
||||
+++
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Οι κίνδυνοι του Internet και του κυβερνοχώρου, 16 χρόνια μετά το 1984.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Έχετε αναρωτηθεί πόσο ελεύθερο είναι το Internet;
|
||||
|
||||
Όλοι ακούμε συνεχώς για την υπερλεωφόρο των πληροφοριών, και πώς πρόκειται να επηρεάσει τη ζωή μας, να μας δώσει ελευθερία, απελευθέρωση του λόγου, και καλύτερη
|
||||
δια-προσωπική επικοινωνία. Όμως, υπάρχει και μία άλλη άποψη, όχι τόσο διαδεδομένη και ακουστή, \"η άλλη πλευρά\", η οποία μεταβάλλει τις παραπάνω αισιόδοξες
|
||||
δηλώσεις, μόνο με το να προσθέσει τη λέξη \"δυνητικά\". Φυσικά, η τεχνολογία είναι καλή, η γνώση είναι για όλους, και η πληροφορία θέλει να είναι ελεύθερη.
|
||||
Αλλά, από την άλλη, τι να την κάνουμε την τεχνολογία και την ελευθερία που μπορεί να προσφέρει, αν όλοι χάσουμε το ενδιαφέρον μας για ελευθερία;
|
||||
|
||||
Το Internet τελευταία έχει αρχίσει να μεταμορφώνεται σε ένα άλλο είδος τηλεόρασης, υιοθετώντας όλο και περισσότερο το είδος σχέσης πομπού-δέκτη, με τη
|
||||
δικαιολογία ότι \"πάντα υπάρχει η δυνατότητα αμφίδρομης επίδρασης\". Κανείς δεν αρνείται ότι υπάρχει η δυνατότητα αλληλεπίδρασης, αλλα φαίνεται ότι συγχέουμε τη
|
||||
δυνατότητα με την πραγματοποίηση. Διαπράτουμε το ίδιο λάθος με αυτούς που υποστηρίζουν ότι οι τηλεθεατές έχουν πάντα την επιλογή να κλείσουν την τηλεόραση.
|
||||
|
||||
Όλο και πιό πολλοί άνθρωποι, μην έχοντας τη δυνατότητα να ψάξουν και να αναζητήσουν ανάμεσα στις τεράστιες -και συνεχώς διογκούμενες- ποσότητες πληροφορίας, οι
|
||||
περισσότερες από τις οποίες αποτελούν κυρίως \"θόρυβο\", εξαρτώνται από μηχανές αναζήτησης για να εντοπίσουν τις πληροφορίες που θέλουν. Οι περισσότεροι από
|
||||
τους \"καινουριοφερμένους\" στο Internet, συγχέουν το Internet με τα portals και τις μηχανές αναζήτησης, αλλά σχεδόν κανείς δεν αναρωτιέται ποτέ ποιός διοικεί
|
||||
αυτές τις μηχανές. Ποιός δηλαδή λίγο πολύ \"φιλτράρει\" τις πληροφορίες στις οποίες έχουν πρόσβαση, ή ακόμα πιο πέρα, από ποιόν εξαρτώνται αυτές οι μηχανές.
|
||||
Γιατί λ.χ. \"τυχαίνει\" κάθε φορά οι σελίδες που αποτελούν απάντησεις σε ένα ερώτημα να είναι ταξινομημένες, σε φθίνουσα σειρά, ανάλογα με το πόσα χρήματα
|
||||
δαπανά η εταιρία που έχει την σελίδα για διαφήμηση στο εν λόγω ψαχτήρι.
|
||||
|
||||
Ένα άλλο ανησυχητικό θέμα που έχει προκύψει είναι η ιδιωτική ζωή. Το λάθος εδώ έγκειται στο γεγονός ότι οι περισσότεροι άνθρωποι νιώθουν ότι ο κυβερνοχώρος
|
||||
είναι μια ζώνη \"παιχνιδιού\", ένας χώρος όπου όλοι είναι αυτό που θέλουν να είναι, ένα μέρος χωρίς σύνορα ούτε νόμους. Αυτό φυσικά δεν είναι αλήθεια, αλλά και
|
||||
ακόμη κι άν ήταν, σίγουρα δεν είναι επιθυμητό, όσο παράξενο κι αν ακούγεται. Φαίνεται να ξεχνάμε ότι τα κράτη και οι νόμοι -ειδικά στο δυτικό κόσμο- υπάρχουν
|
||||
για να προστατεύουν τους πολίτες και τη δημοκρατία, και έχουν κερδηθεί και πληρωθεί πολύ ακριβά. Ξεχνάμε επίσης ότι είτε θέλουμε είτε όχι, ο κυβερνοχώρος είναι
|
||||
μια προέκταση της κοινωνίας, είναι άλλο ένα ανθρώπινο δημιούργημα. Είναι φυσιολογικό επομένως να επηρεάζεται -και να επηρεάζει- από την \"υλική\" κοινωνία.
|
||||
Είναι αδύνατον οι ίδιοι άνθρωποι να ζούν στον ένα κόσμο σε ένα σύστημα δημοκρατίας (η μη\...), και ταυτόχρονα στον άλλο μέσα σε μια ιδεαλιστική αναρχία. Αυτά τα
|
||||
δύο δέν συμβιβάζονται, γιατί απαιτούν ένα εντελώς διαφορετικό σύστημα αξιών. Όταν λέμε αναρχία στον κυβερνοχώρο, δεν εννοούμε την ουτοπιστική έννοια όπου δεν
|
||||
υπάρχει αρχή, γιατί δεν χρειάζεται να υπάρχει, αφού όλοι συνειδητοποιούν την αξία της ελευθερίας και υποχωρούν όπου πρέπει οικιοθελώς. Δυστυχώς η αναρχία, αν
|
||||
τελικά επικρατήσει, στον κυβερνοχώρο, θα εκφράζεται ως η απουσία οποιασδήποτε αρχής θα μπορούσε να ελέγξει ποιος καταπιέζει ποιον.
|
||||
|
||||
Στις σύγχρονες δημοκρατίες (εντός ή εκτός εισαγωγικών) οι αρχές και οι νόμοι θέτουν τα όρια και τις δικλείδες ώστε να μην παραβιάζονται οι αρχές της δημοκρατίας
|
||||
και της ισότητας. Αυτό μπορεί να ακούγεται εξίσου ουτοπικό με την ιδανική αναρχία, αλλά έστω και αν η πραγματικότητα απέχει στις περισσότερες των περιπτώσεων,
|
||||
τουλάχιστον είναι καλύτερα απ\' ότι παλιότερα. Δεν μπορούμε να δούμε ότι από τον κυβερνοχώρο λείπουν όλες αυτές οι προστασίες -μερικοί τις λένε
|
||||
\"περιορισμούς\"- και όλο αυτό γιατί οι άνθρωποι θεωρούν δεδομένο ότι τα δικαιώματά τους είναι ασφαλή και δεν επηρρεάζονται.
|
||||
|
||||
Αντιθέτως, αυτοί οι \"περιορισμοί\" που τραβούν τη διαχωριστική γραμμή εκεί που τελειώνει η ελευθερία του ενός και αρχίζει η ελευθερία του άλλου, δεν είναι
|
||||
ενεργοί στον κυβερνοχώρο. Το γεγονός αυτό επιτρέπει την καταπάτηση της ιδιωτικής ζωής, η οποία θεωρείται απόρθητη στον πραγματικό κόσμο. Δεν φαινόμαστε να
|
||||
συνειδητοποιούμε ότι εμείς, τα γούστα μας, τα ενδιαφέροντά μας, οι σκέψεις μας εμπορευματοποιούνται και πωλούνται από τον ένα διαφημιστή στον άλλο, και το
|
||||
χειρότερο, αυτό γίνεται \"ελεύθερα\". Στον \"έξω\" κόσμο, η παραβίαση του απορρήτου της αλληλογραφίας είναι ακατανόητη, και θα προκαλούσε σκάνδαλο, αν και οι
|
||||
περισσότερες εταιρίες που έχουν δίκτυα, αλλά και οι ISP και mail-providers γενικότερα, ψάχνουν στην ηλεκτρονική αλληλογραφία των πελατών τους, για να
|
||||
\"προστατέψουν\" τα συστήματά τους.
|
||||
|
||||
\"Και τι σχέση έχει το Linux;\" θα ρωτούσε κανεις. Μπορεί να μη φαίνεται με την πρώτη, αλλά η σχέση είναι μεγάλη, και όχι μόνο για το Linux, αλλά για τη
|
||||
φιλοσοφία OpenSource γενικότερα. Η σχέση βασίζεται στην σημασία του λογισμικού για τον κυβερνοχώρο. Το λογισμικό είναι ουσιαστικά αυτό που καθιστά τον
|
||||
κυβερνοχώρο αυτό που είναι. Κανείς δεν σκέφτεται τον κυβερνοχώρο ως τα καλώδια και τα κομμάτια πυρίτιο που αποτελούν το υλικό. Επιπλέον, το υλικό δεν είναι καν
|
||||
ελεύθερο, αφού πολύ μικρό ποσοστό των γραμμών που υλοποιούν τις συνδέσεις είναι δημόσιο. Και όμως το Internet δεν είναι ιδιωτικό. Αυτό συμβαίνει γιατί ο
|
||||
κυβερνοχώρος έγκειται στο χώρο του ιδεατού, είναι δηλαδή ως ιδέα πολύ πιο κοντά στο λογισμικό. Ο έλεγχος δηλαδή της βιομηχανίας του λογισμικού συνεπάγεται
|
||||
έλεγχο σε ένα μεγάλο βαθμό και του κυβερνοχώρου. Δεν είναι δυνατόν να μιλάμε για δημοκρατία, ισότητα και ελευθερία, όταν ο έλεγχος αυτός δεν γίνεται από μια
|
||||
πλειοψηφία τουλάχιστον, και στην καλύτερη περίπτωση από όλους.
|
||||
|
||||
Σήμερα, η συντριπτική πλειοψηφία των χρηστών δεν έχουν τη δυνατότητα του παραμικρού ελέγχου και κριτικής πάνω στο λογισμικό που χρησιμοποιούν. Οι ιδέες, γιατί η
|
||||
έννοια του λογισμικού είναι κοντά σ\' αυτό που λέμε ιδέα, έχουν γίνει ιδιοκτησία, και το να μάθει κάποιος την ιδιοκτησία του άλλου είναι έγκλημα. Αλήθεια, τι
|
||||
άλλο θα μπορούσε να ονομαστεί \"έγκλημα σκέψης\";
|
||||
|
||||
Το Linux και η όλη φιλοσοφία που εισάγεται με το Open Source Software, είναι ουσιαστικά μια μεταβίβαση της δυνατότητας ελέγχου του λογισμικού, από αυτούς που το
|
||||
γράφουν, σε όλους. Είναι δηλαδή η βασική προϋπόθεση για τον \"εκδημοκρατισμό\" του κυβερνοχώρου, και μια ελπίδα ώστε να μην καταλήξουμε σε μια ασύδοτη
|
||||
\"αναρχία\", αλλά σε μια καλύτερη έκδοση της υπάρχουσας κοινωνίας. Ο καθένας μπορεί να ελέγξει τον κώδικα, να καταλάβει τις σκέψεις του άλλου, να τις βελτιώσει.
|
||||
Και βέβαια αυτό δεν είναι κλοπή, αλλά αναγνώριση της αξίας του δημιουργού. Το Linux εισάγει στον κυβερνοχώρο το αυτονόητο: τη δυνατότητα όλων να κρίνουν, να
|
||||
ελέγχουν και να προστατεύουν τους εαυτούς τους, αλλά και τη δυνατότητα του κάθε δημιουργού να εισπράξει την αναγνώριση για το έργο του. Αυτός είναι ένας άλλος
|
||||
μεγάλος τομέας προόδου, αφού μέχρι τώρα, την \"ιδιοκτησία\" του λογισμικού δεν την είχαν αυτοί που το δημιουργούσαν αλλά δικηγόροι και managers. (Αλήθεια, ο
|
||||
Gates προγραμμάτισε τα Windows;)
|
||||
|
||||
Ας ελπίσουμε ότι κάποια στιγμή οι άνθρωποι θα συνειδητοποιήσουν ότι τα δικαιώματά τους στον κυβερνοχώρο είναι ακριβώς όσο πολύτιμα όσο και στον υλικό κόσμο, και
|
||||
ότι η ελευθερία πρέπει να προστατευθεί για τους αδύνατους. Ας μη μιλάμε μόνο για ελευθερία στον κυβερνοχώρο, ενάντια σε κάθε νόμο και έλεγχο, μόνο γιατί
|
||||
νιώθουμε ότι περιοριζόμαστε από το να \"εξαπλώσουμε\" την ελευθερία μας ενάντια σ\'αυτή κάποιου άλλου. Μπορεί όλοι να νιώθουμε δυνατοί, αλλά πάντα υπάρχει ο πιο
|
||||
δυνατός, και αν τους κανόνες του παιχνιδού δεν τους θέτουν αυτοί που θα έπρεπε, θα τους θέσουν αυτοί που δεν πρέπει.
|
449
content/articles/22/05_fvwm2.md
Κανονικό αρχείο
449
content/articles/22/05_fvwm2.md
Κανονικό αρχείο
|
@ -0,0 +1,449 @@
|
|||
+++
|
||||
title = 'Πώς να κάνετε τον FVWM2 πιο Στυλάτο'
|
||||
date = '2000-01-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'The Reverant(mailto:reverant@x-treme.gr)'
|
||||
issue = ['Magaz 22']
|
||||
issue_weight = 5
|
||||
+++
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Ο FVWM2 είναι ένας Window Manager (WM) που λόγω ηλικίας είναι πλέον αρκετά \"ώριμος\" και σταθερός. Δυστυχώς όμως, είναι περισσότερο \"ώριμος\" από όσο θα
|
||||
έπρεπε όσον αφορά την εμφάνισή του, και είναι αναμφισβήτητο γεγονός το ότι η λειτουργικότητά του χρήζει παραιτέρω βελτίωσης.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Αυτός είναι και ο σκοπός αυτού του άρθρου. Πρωτίστως να βελτιώσει το εντελώς ανιαρό και συντηρητικό standard look του FVWM2, και να βελτιώσει στα σημεία τη
|
||||
λειτουργικότητά του. Αρχίζουμε λοιπόν\... :-)
|
||||
|
||||
ΣΗΜΕΙΩΣΗ: Αυτό το άρθρο προϋποθέτει κάποια εξοικείωση με τον FVWM2. Αν αυτή δεν υπάρχει, προτείνεται η χρήση του μέχρι κάποιου σημείου εξοικείωσης, καθώς και η
|
||||
ανάγνωση της man σελίδας (man fvwm2 μόνο για όποιον έχει πραγματικά **ΓΑΙΔΟΥΡΙΝΗ** υπομονή. Ο υπογράφων μερικές φορές δεν φάνηκε αρκετά \"ζώον\" και η υπομονή
|
||||
του δοκιμάστηκε πέραν ανθρωπίνων ορίων :-) )
|
||||
|
||||
Πρώτο βήμα είναι να βρούμε το config αρχείο του FVWM2. Αυτό είναι το .fvwm2rc το οποίο αναζητείται στο home directory του χρήστη. Εαν δεν βρεθεί εκεί, τότε
|
||||
χρησιμοποιείται το system-wide που συνήθως βόσκει στο λιβάδι /usr/X11R6/lib/X11/fvwm2/.fvwm2rc. Δεν προτείνεται να πειράξετε το system-wide αρχείο, αντιθέτως,
|
||||
πειράξτε το αντίστοιχο ενός απλού χρήστη. Και φυσικά, πριν κάνετε οποιαδήποτε παρέμβαση, κάντε ένα **τριπλό** backup του αρχείου αυτού, για κάθε ενδεχόμενο.
|
||||
|
||||
Κατόπιν, ανοίγουμε το αρχείο .fvwm2rc με έναν editor και αρχίζουμε:
|
||||
|
||||
1. Window buttons - Μπορούμε να ορίσουμε την εμφάνιση των window control buttons. Τα standard κρίνονται ικανοποιητικά, οπότε αφήνονται ως εχουν.
|
||||
|
||||
2. General Configuration - Διάφορες γενικοί παράμετροι του FVWM2. Αυτό που θα πειραχθεί από εδώ είναι το DeskTopSize. Αυτή η παράμετρος ορίζει πόσα virtual
|
||||
desktops θα εμφανίζονται στον pager. Η default τιμη 3x2 μέχρι τώρα δεν μου έχει χρησιμεύσει προσωπικά. Τουναντίον μάλιστα :-). Για αυτό και βάζουμε τιμή
|
||||
2x2:
|
||||
|
||||
DeskTopSize 2x2
|
||||
|
||||
3. Colors and fonts - Μπορούμε να ορίσουμε τα χρώματα των selected windows και των διαφόρων menu. Με τη δήλωση:
|
||||
|
||||
HilightColors TextColor BackColor
|
||||
|
||||
το selected window θα έχει ως font color το \"TextColor\" και ως background color το \"backColor\". Αυτά τα χρώματα μπορεί να είναι οποιαδήποτε χρώματα που
|
||||
αναφέρονται στο αρχείο: /usr/X11R6/lib/X11/rgb.txt\
|
||||
Για τα sticky παράθυρα:
|
||||
|
||||
StickyColors TextColor BackColor
|
||||
|
||||
Για τα ανενεργά παράθυρα, καθώς και για συγκεκριμένα παράθυρα, θα χρησιμοποιήσουμε τη Style δήλωση, της οποίας η χρήση αναλύεται αργότερα. Κατόπιν, για το
|
||||
χρώμα & το font των menus:
|
||||
|
||||
Menustyle TextColor BackColor OtherColor -misc-fixed-medium-r-normal-*-15-*-75-75-c-90-iso8859-1 fvwm
|
||||
|
||||
Το \"OtherColor\" δεν έχει διαπιστωθεί που χρησιμεύει (κανείς;). Κατόπιν, η standard δήλωση του font που θέλουμε.
|
||||
|
||||
4. Functions για Initialization, Restart & Exit.\
|
||||
Functions είναι δηλώσεις που εκτελούνται κατόπιν κάποιας πράξης του χρήστη, π.χ. πατάει ένα button στο FvwmButtons, ή κάνει κλικ στο desktop, κ.τ.λ. Αυτές
|
||||
εκτελούνται κατόπιν αναλόγου σήματος του WM. Για initialization (οι παρακάτω δηλώσεις θα εκτελούνται όταν ο FVWM2 γίνεται initialized):\
|
||||
Δήλωση της function \"InitFunction\":
|
||||
|
||||
AddToFunc InitFunction
|
||||
|
||||
Και μετά έχουμε:
|
||||
|
||||
- Το module \"FvwmBanner\" δεν χρησιμεύει πουθενά, οπότε κερδίζει ένα comment-out σύμβολο (\#) με την αξία του! :-)
|
||||
|
||||
#+ "I" Module Fvwmbanner
|
||||
|
||||
- Τα xmessages προτιμώ προσωπικά να εμφανίζονται σε ενα xterm με background χρώμα το μαύρο και text χρώμα το πράσινο (Old-schoοl terminal), με τίτλο
|
||||
\"Xmessages\", και ένα συγκεκριμένο geometry (δηλαδή μέγεθος και σημείο τοποθέτησης του παραθύρου πάνω στο desktop) που βολεύει. Αυτό γίνεται με την
|
||||
εξής δήλωση:
|
||||
|
||||
+ "I" Exec xterm -geometry 83x10+0+1120 -bg black -fg green -T "XMessages" -e tail -f /root/.X.err
|
||||
|
||||
Η original δήλωση αφαιρείται όπως έχει.
|
||||
|
||||
- Το default xterm που εμφανίζεται με το initialization του fvwm2 έχει χάλια χρώματα, οπότε:
|
||||
|
||||
+ "I" Exec xterm -geometry +0+88 -bg black -fg green
|
||||
|
||||
- Ένα όμορφο background πάντα βοηθάει την κατάσταση :-)
|
||||
|
||||
+ "I" Exec xpmroot /root/pics/skull.xpm
|
||||
|
||||
ΣΗΜΕΙΩΣΗ: Για όποιον ενδιαφέρεται, οι εικόνες και τα εικονίδια που χρησιμοποιώ, θα είναι διαθέσιμα από 5-6 Ιανουαρίου στο:
|
||||
<http://reverant.fortunecity.com/linux-icons.tar.gz>. Τα κάνετε extract με:
|
||||
|
||||
$: tar zxfv linux-icons.tar.gz
|
||||
|
||||
και ύστερα τα αντιγράφετε στο: /usr/X11R6/include/X11/pixmaps
|
||||
|
||||
- Με ενδιαφέρει επίσης να μπορώ να βλέπω τα διάφορα log messages χωρίς να αλλάζω consoles συνεχώς, οπότε:
|
||||
|
||||
+ "I" Exec xterm -ls -geometry 100x10+513+1120 -T "Messages" -bg black -fg green -e tail -f /var/log/messages
|
||||
|
||||
- Μια **ΜΕΓΑΛΗ** έλλειψη του FVWM2 όπως έρχεται το config του, είναι ένα είδος taskbar, η οποία να δείχνει ποια παράθυρα υπάρχουν, και να βοηθάει στην
|
||||
μεταξύ τους εναλλαγή. Αυτό το πρόβλημα λύνεται με τη χρήση του module \"FvwmTaskBar\":
|
||||
|
||||
+ "I" Module FvwmTaskBar
|
||||
|
||||
Για Restart (Οι παρακάτω δηλώσεις θα εκτελούνται όταν κάνουμε restart τον FVWM2). Τα βήματα 2, 4 και 5 επαναλαμβάνονται σε αυτήν τη δήλωση:
|
||||
|
||||
AddToFunc RestartFunction
|
||||
+ "I" Exec xterm -geometry 83x10+0+1120 -bg black -fg green -T "XMessages" -e tail -f /root/.X.err
|
||||
+ "I" Exec xpmroot /root/pics/skull.xpm
|
||||
+ "I" Exec xterm -ls -geometry 100x10+513+1120 -T "Messages" -bg black -fg green -e tail -f /var/log/messages
|
||||
|
||||
Εννοείται ότι οι original δηλώσεις για xmessages, xpmroot αφήνουν το μάταιο τούτο config file :-)\
|
||||
Η Exit function αφήνεται όπως έχει.
|
||||
|
||||
5. Functions - Το ψωμί της υπόθεσης, ή αλλιώς, \"όλα τα λεφτά!\". Εδώ δηλώνουμε τις functions, κοινώς δηλαδή τι γίνεται όταν λαμβάνει χώρα κάποιο γεγονός
|
||||
(μπερδευτήκατε;), π.χ. κάνουμε κλικ σε ενα button του FvwmButtons. Μια function, προκειμένου να δηλώσουμε την εμφάνιση ενός menu με επιλογές, έχει την εξής
|
||||
μορφή:
|
||||
|
||||
AddToMenu OnomaTisFunctionPopUp "Onoma Tis Function" Title
|
||||
...Εδώ μέσα δηλώσεις για το τι περιλαμβάνει η function...
|
||||
# end popup OnomaTisFunction
|
||||
|
||||
Εξηγήσεις:\
|
||||
Με την λέξη \"AddToMenu\" δηλώνουμε μια function η οποία θα κάνει PopUp μια λίστα με εντολές. Μετά δηλώνεται το όνομα της function. Στην περίπτωσή μας, αυτό
|
||||
είναι \"OnomaTisFunctionPopUp\". Δηλαδή, όποτε θέλουμε να αναφερθούμε στη function αυτή, θα χρησιμοποιούμε το όνομα αυτό. Προσοχή, το όνομα της function δεν
|
||||
μπορεί να έχει κενά ανάμεσα στα γράμματα, ούτε κάποιους ειδικούς χαρακτήρες.\
|
||||
ΣΗΜΕΙΩΣΗ: Στην πραγματικότητα, με τη δήλωση \"AddToMenu\" δεν δηλώνουμε μια function, αλλά ένα menu, που είναι κατά κάποιο τρόπο μια function, απλά το μόνο
|
||||
που μπορεί να κάνει είναι να εμφανίζει μια λίστα. Για λόγους απλούστευσης όμως, θα θεωρούμε και τα menus ως functions. Κατόπιν, δηλώνεται το όνομα που
|
||||
θέλουμε να εμφανίζεται στην ανώτερη θέση της λίστας, δηλαδή ένα όνομα που περιγράφει τι εντολές περιέχονται στη λίστα, και μετά την ειδική λέξη \"Title\".
|
||||
Ένα παράδειγμα είναι π.χ. \"Shells\", ή \"My Programs\". Εδώ επιτρέπονται και κενά, και ειδικοί χαρακτήρες (Για περισσότερες πληροφορίες, κοιτάξτε το manual
|
||||
page του fvwm2). Εάν κάποιος δεν θέλει να εμφανίζεται καθόλου τίτλος, απλά δεν γράφει έναν και ΔΕΝ βάζει την λέξη Title μετά το όνομα της Function.\
|
||||
\... Μετά οι δηλώσεις για τα περιεχόμενα της λίστας (εξηγούνται παρακάτω, υπομονή παρακαλώ :ο) )\...\
|
||||
Τέλος, **εάν** θέλει κανείς μπορεί για λόγους ευκολίας ανάγνωσης και μόνο να βάλει ένα comment-out και μετά να δηλώσει \"end popup onomatisfunction\". Αυτό
|
||||
είτε το βάλει κανείς είτε δεν το βάλει, ένα και το αυτό. Απλά, για να είναι ξεκάθαρο που τελειώνει η δήλωση της function καλό θα ήταν να το δηλώνετε.\
|
||||
Και τώρα οι δηλώσεις για το τι θα περιλαμβάνει η PopUp λίστα που θα εμφανίζεται. Γενικά, μια δήλωση έχει ως εξής:
|
||||
|
||||
+ "Onoma entolis%onomaicon.xpm" Kanekati
|
||||
|
||||
Όπου:
|
||||
|
||||
- Onoma entolis είναι το όνομα της εντολής που θα εμφανίζεται σε μία PopUp λίστα, π.χ. StarOffice, ή BitchX. Προσοχή στο ότι αυτό το όνομα δεν είναι η
|
||||
\"πραγματική\" εντολή που θα εκτελεστεί από τον WM. Είναι απλά ένα όνομα, ένα \"alias\". Κατόπιν, τοποθετούμε το σύμβολο \"%\" για να διαχωρίσουμε το
|
||||
alias από το filename του icon που θέλουμε να χρησιμοποιήσουμε για το alias αυτό, και ταυτόχρονα να δηλώσουμε ότι το icon θέλουμε να εμφανιστεί δίπλα
|
||||
στο alias (χρησιμοποιώντας το σύμβολο \"\$\" αντί του \"%\" δηλώνουμε ότι θέλουμε το icon να εμφανιστεί πάνω από το alias). Προσοχή στο ότι η συνένωση
|
||||
αυτών των δύο δηλώσεων πρέπει να είναι μέσα σε εισαγωγικά (double quotes: \").
|
||||
|
||||
- Ακολουθεί η εντολή που θέλουμε να πραγματοποιηθεί. Αυτή μπορεί να είναι είτε μια κανονική εντολή που θα εκτελοέσαμε εμείς στο shell, είτε μια εντολή
|
||||
προς τον WM να εμφανίσει μια άλλη PopUp λίστα. Για να εκτελέσει ο WM ένα πρόγραμμα, δηλώνουμε:
|
||||
|
||||
+ "Onoma entolis%onomaicon.xpm" Exec enaprogramma
|
||||
|
||||
π.χ., για να εκτελέσουμε ένα bash shell, δηλώνουμε:
|
||||
|
||||
+ "Bash shell%bash.xpm" Exec bash
|
||||
|
||||
Άλλο παράδειγμα, για το XISP:
|
||||
|
||||
+ "XISP%xisp.xpm" Exec xisp
|
||||
|
||||
Αν θέλουμε, μπορεί αντί να εκτελεστεί μια εντολή, να εμφανιστεί μια άλλη PopUp λίστα. Για να το κάνουμε αυτό, δηλώνουμε:
|
||||
|
||||
+ "List of programs%programs.xpm" PopUp ProgramsPopUp
|
||||
|
||||
όπου ProgramsPopUp μια function με το όνομα αυτό.\
|
||||
Γνωρίζοντας τα παραπάνω ας αρχίσουμε λοιπόν να γράφουμε/τροποποιούμε τις functions που θα χρειαστούμε, αφού σκεφτούμε πρώτα τι χρειαζόμαστε από ένα WM.
|
||||
Χρειαζόμαστε λοιπόν:
|
||||
|
||||
1. Μια function για να χειριζόμαστε διάφορες παραμέτρους του WM (modules, exit/restart, start another WM), βοήθεια για τον WM και τα modules του, καθώς και
|
||||
για reboot/halt του συστήματος.
|
||||
2. Μια function για ανεύρεση αρχείων.
|
||||
3. Μια function για βοήθεια
|
||||
4. Μια function για να ξεκινάμε ένα shell (Το γιατί πρέπει να είναι ξεχωριστή αυτή η function από τις άλλες είναι θέμα εργονομίας: Ένα shell συνήθως
|
||||
εκτελείται αρκετές φορές παραπάνω από οποιοδήποτε άλλο πρόγραμμα.)
|
||||
5. Μια function για γενικό configuration του συστήματος
|
||||
6. Μια function για να τρέχουμε κάποια συχνά χρησιμοποιούμενα προγράμματα μας.
|
||||
7. Μια function για άμεση πρόσβαση σε δισκους, CD-ROM, Floppy, κ.τ.λ.
|
||||
|
||||
Για την πρώτη function, θα χρησιμοποιήσουμε μια υπάρχουσα. Αυτή είναι η thiswmpopup:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# thiswmpopup
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
AddToMenu thiswmpopup "Fvwm2" Title
|
||||
|
||||
+ "Other window managers%small.icon_warning_3d.xpm%" Popup otherwmpopup
|
||||
+ "Fvwm2 Modules%small.install_3d.xpm%" Popup modulepopup
|
||||
+ "Configuration%small.checklist2_3d.xpm%" Popup susewmpopup
|
||||
+ "Fvwm2 Man Pages%small.xman3d.xpm%" Popup wmmanpopup
|
||||
+ "" Nop
|
||||
+ "Restart Fvwm2%small.restart_suse_3d.xpm%" Restart fvwm2
|
||||
+ "Exit Fvwm2 and X%small.exit.xpm%" Function QuitSave
|
||||
|
||||
# end popup thiswmpopup
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
στην οποία θα προσθέσουμε τις εξής 2 γραμμές:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
+ "Reboot System" Exec Reboot
|
||||
+ "Halt System" Exec Halt
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
για να κάνουμε reboot & halt αντίστοιχα όλο το σύστημα.
|
||||
|
||||
Δεύτερη function είναι η function που μας βοηθά στο να βρούμε κάποιο αρχείο γρήγορα, χωρις να θυμόμαστε πολύπλοκες συντάξεις εντολών, π.χ. της find:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
############################################################
|
||||
#
|
||||
# findpopup
|
||||
#
|
||||
############################################################
|
||||
|
||||
AddToMenu findpopup "Find" Title
|
||||
+ "Find a file*find.xpm*" Exec xterm -bg black -fg green -e findfile
|
||||
|
||||
# end popup findpopup
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
To findfile είναι ένα shell script που έχει γραφεί με σκοπό τον προαναφερθέντα, και είναι το εξής:
|
||||
|
||||
echo "Filename?"
|
||||
read filename
|
||||
echo "Search where?"
|
||||
read pathname
|
||||
find $pathname -name $filename
|
||||
echo "Done, press enter to exit"
|
||||
read anykey
|
||||
exit
|
||||
|
||||
Η τρίτη function είναι η function που θα μας εμφανίζει τα σχετικά με help, documentation, κ.τ.λ. Συγκεκριμένα, θα τρέχει το xman για να διαβάσουμε κάποια
|
||||
man page, μας ανοίγει τον xfilemanager στο /usr/doc/howto/en/ ή στο /usr/doc/howto/el/ :
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
############################################################
|
||||
#
|
||||
# helpmepopup
|
||||
#
|
||||
############################################################
|
||||
|
||||
AddToMenu helpmepopup "Help" Title
|
||||
+ "Manual Pages%small.xman3d.xpm%" Exec xman
|
||||
+ "Greek HOWTO's%help1.xpm%" Exec xfilemanager -rootDir /usr/doc/howto/el -singleWindow
|
||||
+ "English HOWTO's%help1.xpm%" Exec xfilemanager -rootDir /usr/doc/howto/en -singleWindow
|
||||
|
||||
# end popup findpopup
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Με την τέταρτη function θα εμφανίζεται ένα xterm, στοιχείο πολύ βασικό στο Πραγματικό Λειτουργικό :-)
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
############################################################
|
||||
#
|
||||
# runmepopup
|
||||
#
|
||||
############################################################
|
||||
|
||||
AddToMenu runpopup "Shells" Title
|
||||
+ "Old-school Xterm%small.greenterm.xpm%" Exec xterm -bg black -fg green
|
||||
|
||||
# end popup findpopup
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Με την πέμπτη function θα εμφανίζεται μια λίστα με διάφορες επιλογές για configuration, π.χ. για kernel configuration, εκτέλεση του yast (Για S.u.S.E.
|
||||
μόνο!), καθώς και για configuration των Χ:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
############################################################
|
||||
#
|
||||
# mesettingspopup
|
||||
#
|
||||
############################################################
|
||||
|
||||
AddToMenu mesettingspopup "Settings" Title
|
||||
+ "Yast%small.yast_suse_3d.xpm%" Exec xterm -bg balck -fg green -e yast
|
||||
+ "Kernel Configuration" Exec xterm -bg black -fg green -e mkmc
|
||||
+ "X configuration" Exec xterm -bg black -fg green -e Xconfig
|
||||
|
||||
# end popup mesettingspopup
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Με την έκτη function θα εμφανίζεται μία λίστα με διάφορα προγράμματα που θα χρησιμοποιούνται συχνά - για αυτό και η ανάγκη για μια δικιά τους function.
|
||||
Κόφτε και ράφτε κατά τα μέτρα σας :-) :
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
############################################################
|
||||
#
|
||||
# meprogramspopup
|
||||
#
|
||||
############################################################
|
||||
|
||||
AddToMenu meprogramspopup "Programs" Title
|
||||
+ "Netscape%netscape1.xpm%" Exec netscape
|
||||
+ "X11Amp%x11amp.xpm%" Exec x11amp
|
||||
+ "The Gimp%gimp.xpm%" Exec gimp
|
||||
+ "GRio%grio.xpm%" Exec grio
|
||||
+ "KEdit%kedit.xpm%" Exec kedit
|
||||
+ "Bitchx%bitchx.xpm%" Exec bitchx
|
||||
+ "Kmix%kmix.xpm%" Exec kmix
|
||||
+ "XIsp%xisp.xpm%" Exec xisp -nohints
|
||||
+ "Acrobat Reader%acrobat.xpm" Exec xpdf
|
||||
|
||||
# end popup findpopup
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Τέλος, η function για πρόσβαση στα διάφορα drives:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
############################################################
|
||||
#
|
||||
# medrivespopup
|
||||
#
|
||||
############################################################
|
||||
|
||||
AddToMenu medrivespopup "Drive I/O" Title
|
||||
+ "Root filesystem%hdd.xpm" Exec xfilemanager -rootDir / -singleWindow
|
||||
+ "CD-ROM%cdrom.xpm" Exec xfilemanager -rootDir /cdrom -singleWindow
|
||||
+ "Floppy%floppy.xpm" Exec xfilemanager -rootDir /floppy -singleWindow
|
||||
|
||||
# end popup medrivespopup
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Σημείωση: Αν χρησιμοποίησετε τις functions αυτές, θα παρατηρήσετε ότι πρέπει να κρατάτε πατημένο το πλήκτρο του πόντικα σας ή του πληκτρολογίου σας για να
|
||||
παραμείνει η λίστα στην οθόνη. Για να το αποφύγετε αυτό, κάντε το εξής: Γράφτε μια function σαν την παρακάτω, για κάθε function που θέλετε να συμβαίνει
|
||||
αυτό, και στη συνέχεια αντί να καλείτε την πρωτότυπη, καλέστε την καινούργια. Π.χ., για την medrivespopup, γράφουμε την εξής function:
|
||||
|
||||
AddToFunc medrivespopupfunc
|
||||
+ "I" Popup medrivespopup
|
||||
# end function medrivespopupfunc
|
||||
|
||||
6. Η δήλωση \"Style\" - Με αυτήν μπορούμε να δηλώσουμε συγκεκριμένες ιδιότητες που θα έχει κάποιο ή όλα τα παράθυρα. Αυτή η δήλωση δεν γίνεται μόνο μια φορά
|
||||
αλλά πολλές - τόσες ώστε να αποδώσουμε όλες τις επιθυμητές ιδιότητες στα παράθυρά μας. Μια δήλωση style έχει ως εξής:
|
||||
|
||||
style "titleparathirou" idiotita1, idiotita2, idiotia3, κ.τ.λ.
|
||||
|
||||
όπου titleparathirou ο τίτλος του παραθύρου στο οποίο θέλουμε να δώσουμε τις ιδιότητες idiotita1, idiotita2, idiotita3, κ.τ.λ. Αν αυτές τις ιδιότητες
|
||||
θέλουμε να τις αποδώσουμε σε όλα τα παράθυρα, τότε δηλώνουμε:
|
||||
|
||||
style "*" idiotita1, idiotita2, idiotia3, κ.τ.λ.
|
||||
|
||||
Άν ακόμα έχουμε ένα παράθυρο του οποίου ο τίτλος δεν είναι απολύτως σταθερός, όπως π.χ. το xosview, του οποίου ο τίτλος εξαρτάται από το όνομα του
|
||||
μηχανήματος (Hostname), τότε μπορούμε να δηλώσουμε:
|
||||
|
||||
style "katistathero*" idiotita1, idiotita2, idiotia3, κ.τ.λ.
|
||||
|
||||
όπου katistathero είναι το μέρος του τίτλου τού παραθύρου που μένει σταθερό. Ας αρχίσουμε λοιπόν τις style δηλώσεις που μας ενδιαφέρουν:
|
||||
|
||||
- Το module FvwmTaskbar είναι μια Taskbar η οποία έχει κουμπιά με τα προγράμματα που τρέχουν. Επειδή είναι αρκετά χαζό να συμπεριλαμβάνεται ο εαυτός της,
|
||||
θα της δώσουμε την ιδιότητα WindowListSkip, η οποία εξαιρεί την εμφάνιση του προγράμματος στο οποίο αποδίδουμε την ιδιότητα, στην Taskbar. Ακόμα, δεν
|
||||
θέλουμε η Taskbar να έχει τίτλο και \"decorations\", για αυτό της δίνουμε την ιδιότητα NoTitle. Ακόμα, θέλουμε να είναι συνεχώς ορατό, οπότε του δίνουμε
|
||||
την ιδιότητα StaysOnTop. Έτσι έχουμε:
|
||||
|
||||
Style "FvwmWinList" NoTitle, WindowListSkip, StaysOnTop
|
||||
|
||||
- Το εικονίδιο του xterm είναι **επειικώς** απαράδεκτο, οπότε:
|
||||
|
||||
Style *xterm* Icon greenterm.xpm
|
||||
|
||||
Με τη δήλωση αυτή, δηλώνουμε ότι θέλουμε όταν το xterm γίνεται iconified, το εικονίδιό του να είναι το greenterm.xpm
|
||||
|
||||
- Εμένα μου αρέσουν αυτά τα χρώματα στα inactive παράθυρά μου:
|
||||
|
||||
Style "*" BackColor Purple4
|
||||
Style "*" ForeColor Red
|
||||
|
||||
BackColor to background χρώμα του παραθύρου, ForeColor το χρώμα των γραμμάτων του τίτλου του παραθύρου. Αν δεν σας αρέσουν, ξέρετε τι να κάνετε :-P
|
||||
|
||||
7. FvwmButtons - Το FvwmButtons είναι ένα Module του FVWM, το οποίο είναι ουσιαστικά μια μπάρα με κουμπιά, και εμείς διαλέγουμε πόσα κουμπιά θα έχει, τι θα
|
||||
κάνει το καθένα, κ.τ.λ. Αρχίζουμε με τα χρώματα, τών οποιων η δήλωση είναι αρκετά απλή:
|
||||
|
||||
*FvwmButtonsFore Green
|
||||
*FvwmButtonsBack Purple4
|
||||
|
||||
και ύστερα η θέση του στο desktop, η οποία είναι ελαφρώς μετατοπισμένη προς τα κάτω, γιατί επάνω από το FvwmButtons θα τοποθετηθεί η TaskBar:
|
||||
|
||||
*FvwmButtonsGeometry +0+31
|
||||
|
||||
Άν θέλετε, μπορείτε όπως εγώ να βγάλετε τις δηλώσεις των xclock, xeyes, και asclock, γιατί καταλαμβάνουν πολύτιμο χώρο. Εξ άλλου, η Taskbar διαθέτει ρολόι
|
||||
στο δεξί άκρο της. Έχουμε λοιπόν:
|
||||
|
||||
#*FvwmButtons - - Swallow "FvwmXeyes" Exec xeyes -name "FvwmXeyes" -geometry +0+0 -bg grey67 &
|
||||
#*FvwmButtons - - Swallow "FvwmXclock" Exec xclock -name "FvwmXclock" -geometry +0+0 -padding 1 -bg grey67 &
|
||||
#*FvwmButtons - - Swallow "asclock" Exec asclock -position +0+0 -shape -led green &
|
||||
|
||||
Για το αν το coolmail αξίζει το χώρο που πιάνει, εγώ προσωπικά νομίζω πως όχι, οπότε\... Αν βέβαια εσείς θέλετε να το έχετε, ε, τι να κάνουμε\... :-) Και
|
||||
τώρα οι ζουμερές δηλώσεις ;-)
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*FvwmButtons "" shutdown.xpm Function barthiswmpopupfunc
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Με την παραπάνω δηλώνουμε ότι θέλουμε να προσθέσουμε ένα button στο FvwmButtons, το οποίο δεν έχει καθόλου κείμενο πάνω του (Τα εισαγωγικά είναι κενά. Ο
|
||||
λόγος είναι ότι στη συγκεκριμένη περίπτωση, το εικονίδιο έχει πάνω του το περιγραφικό κείμενο, π.χ. \"I/O Access\", ή \"Help\".), ενώ όταν κάνουμε αριστερό
|
||||
κλικ πάνω εκτελείται η function barthiswmpopupfunc, η οποία με τη σειρά της εμφανίζει και κρατάει σταθερό στην οθόνη το thiswmpopup menu.\
|
||||
Ομοίως λοιπόν για τις άλλες δηλώσεις:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*FvwmButtons "" cfind.xpm Function findpopupfunc
|
||||
*FvwmButtons "" help.xpm Function helpmepopupfunc
|
||||
*FvwmButtons "" run.xpm Function runpopupfunc
|
||||
*FvwmButtons "" settings.xpm Function mesettingspopupfunc
|
||||
*FvwmButtons "" programs.xpm Function meprogramspopupfunc
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Τα άλλα buttons (SuSE, Graphics, Tools, Shells) μας αποχαιρέτησαν (\#).
|
||||
|
||||
8. FvwmTaskBar - Όπως αναφέρθηκε και προηγουμένως, η TaskBar είναι μια μπάρα, πάνω στην οποία υπάρχουν buttons τα οποία χρησιμοποιεί κανείς για να κάνει
|
||||
iconify/maximise ένα πρόγραμμα. Εκτός αυτών, η Taskbar έχει και ένα button στο οποίο μπορούμε να αναθέσουμε κάποια function ή menu, παρόμοιο με το \"Start\"
|
||||
button ακατανόμαστου αλειτούργητου συστήματος που άρχισε να κυκλοφορεί το 1995 ;-) Οι δηλώσεις που έχω εγώ για την TaskBar είναι:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
###############################################################################
|
||||
# #
|
||||
# Task Bar #
|
||||
# #
|
||||
###############################################################################
|
||||
*FvwmTaskBarGeometry +0+0
|
||||
*FvwmTaskBarFore Green
|
||||
*FvwmTaskBarBack Purple4
|
||||
*FvwmTaskBarUseSkipList
|
||||
*FvwmTaskBarShowTips
|
||||
*FvwmTaskBarStartName Main()
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Επεξηγήσεις: Οι τρεις πρώτες δηλώσεις είναι αρκετά απλές. Η τέταρτη (\*FvwmTaskBarUseSkipList) δίνει εντολή στην TaskBar να \"δίνει σημασία\" στην ιδιότητα
|
||||
WinListSkip ενός παραθύρου. Αν αυτή η δήλωση παραλειφθεί, παράθυρα στα οποία έχει δωθεί η ιδιότητα WinListSkip θα φαίνονται κανονικά και με το Νόμο στην
|
||||
TaskBar.
|
||||
|
||||
Φυσικά δεν είναι αναγκαστικό να κάνετε ότι έκανα και εγώ. Πειραματιστείτε, ψάξτε, και όλο και κάτι πιο καλό θα βρείτε.
|
Φόρτωση…
Προσθήκη πίνακα
Προσθήκη υπερσυνδέσμου
Παράθεση σε νέο ζήτημα