Προς το περιεχόμενο

Notepad++ + Plugins + MinGW = IDE


migf1

Προτεινόμενες αναρτήσεις

Αφού εγκατέστησα το language help, κάθε φορά που ανοίγω το notepad++, μου εμφανίζει μήνυμα για ασυμβατότητα του εν λόγω ANSI plug-in Με την Unicode έκδοση του notepad++ μου..

Έχεις δίκιο, είναι δική μου παράλειψη να το διευκρινίσω.

 

Σβήσε από τον φάκελο Notepad++\plugins\ το LanguageHelpA.dll (δλδ άσε μονάχα το LanguageHelpU.dll)

 

EDIT:

 

Με την ευκαιρία το συμπλήρωσα και στο 1ο μέρος. Ευχαριστώ φίλε gon1332.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 79
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Ok, :)

Μία άλλη απορία. επιθυμώ να εγκαταστήσω την allegro library. Κατέβασα από εδώ το αρχείο dx70_mgw.zip. Διάβασα εδώ ότι πρέπει να το κάνουμε extract και στη συνέχεια overwrite τα ήδη υπάρχοντα αρχεία. Δηλαδή οι κατάλογοι include και lib της εγκατάστασης του minGW θα αντικατασταθούν από αυτούς του αρχείου που κατέβασα. Εμένα δε μου φαίνεται και πολύ καλή ιδέα. Μάλλον για κάποιο merge το βλέπω. Τι λες;

 

Και πάλι πολλά thnx για το μεράκι σου :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ok, :)

Μία άλλη απορία. επιθυμώ να εγκαταστήσω την allegro library. Κατέβασα από εδώ το αρχείο dx70_mgw.zip. Διάβασα εδώ ότι πρέπει να το κάνουμε extract και στη συνέχεια overwrite τα ήδη υπάρχοντα αρχεία. Δηλαδή οι κατάλογοι include και lib της εγκατάστασης του minGW θα αντικατασταθούν από αυτούς του αρχείου που κατέβασα. Εμένα δε μου φαίνεται και πολύ καλή ιδέα. Μάλλον για κάποιο merge το βλέπω. Τι λες;

 

Και πάλι πολλά thnx για το μεράκι σου :)

Ούτε εμένα μου φαίνεται καλή ιδέα, κυρίως επειδή δεν θυμάμαι ποια έκδοση του DirectX υποστηρίζει ο mingw. Πάντως η έκδοση 7.0 (και η 8.0) του Allegro είναι παμπάλαιες... έχει φτάσει ήδη στην 11.00 αν δεν απατώμαι το DirectX.

 

Μια ιδέα είναι να κρατήσεις backup του mingw φακέλου και να κάνεις το merge με τον κανονικό φάκελο. Αν κάτι στραβώσει, απλά θα σβήσεις τον κανονικό φάκελο του mingw και θα αντιγράψεις στη θέση του εκείνον που είχες κρατήσει backup.

 

Μια άλλη ιδέα είναι να ανοίξεις το zip του Allegro και πριν κάνεις το merge να κρατήσεις backup όλων των αρχείων που είναι κοινά με αυτά του mingw φακέλου σου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλημέρα, καλή βδομάδα!

 

migf1 κι απο μένα ένα μεγάλο ευχαριστώ για το χρόνο που αφιέρωσες σ' αυτό τον πολύ χρήσιμο οδηγό. :)

Ευχαριστώ κι εγώ φίλε defacer!

 

------------------------------------------------------------------------------------------------------------------------------

1ο Μέρος: Κατέβασμα & Εγκατάσταση

2ο Μέρος: Μερικές χρήσιμες ρυθμίσεις του ίδιου του Notepad++

3ο Μέρος: NppExec (plugin) - Build & Run script

4ο Μέρος: NppExec (plugin) - Μετάβαση σε γραμμή σφάλματος

------------------------------------------------------------------------------------------------------------------------------

 

Η αλήθεια είναι πως ψιλο-κουράστηκα, οπότε λέω να μην το συνεχίσω άλλο προς το παρόν. Νομίζω όμως πως δίνει βάσεις για να το φτιάξει ο καθένας στα μέτρα του, σε όποια γλώσσα επιθυμεί.

 

Βασικά, για την κάθε γλώσσα, χρειάζεται κανείς να την στήσει πρώτα για χρήση σε γραμμή εντολών. που σε γενικές γραμμές σημαίνει απλά να κατεβάσει τα binaries του compiler και να διαβάσει στην τεκμηρίωσή της ποιες μεταβλητές περιβάλλοντος πρέπει να προσθέσει στο PATH των Windows.

 

Για παράδειγμα στην Java προσθέτουμε τη μεταβλητή JAVA_HOME να δείχνει στον κεντρικό της φάκελο, και κατόπιν προσθέτουμε το %JAVA_HOME%\bin στην τιμή της PATH ... α, προσθέτουμε και την CLASSPATH με ελάχιστη τιμή μια τελεία, που σημαίνει ο εκάστοτε τρέχων φάκελος).

 

Από εκεί και πέρα βάζει προαιρετικά και στο LangugeHelp την τεκμηρίωση της γλώσσας (είτε ως .chm/.hlp είτε ως .pdf) ή αν προτιμάει on line-documentation φτιάχνει ένα run-command στο μενού Run->Run. Όλα τα υπόλοιπα μένουν ίδια όπως τα περιγράψαμε, κοινά για όλες τις γλώσσες.

 

Προφανώς θα φτιάξει κι ένα σκριπτ για Build & Run προγραμμάτων σε Java... π.χ...

 

>
// JAVA SCRIPT
npp_save
cd $(CURRENT_DIRECTORY)
javac $(FILE_NAME)
npp_run java $(NAME_PART)

 

Το αντίστοιχο για C# μπορεί να είναι κάπως έτσι....

 

>
// C# SCRIPT
npp_save
cd $(CURRENT_DIRECTORY)
cmd /c del *.pdb $(NAME_PART).exe
csc /out:$(NAME_PART).exe /debug $(FILE_NAME)
npp_run $(NAME_PART).exe

 

Ακόμα κι αν έχει ήδη στημένο ένα compiler, ενδεχομένως ενσωματωμένο σε κάποιο IDE (όπως π.χ. το VS) μπορεί να διαβάσει ποιες μεταβλητές περιβάλλοντος χρειάζονται για να δουλευτεί από γραμμή εντολών, ποιοι φάκελοι χρειάζεται να προστεθούν στο PATH, να τις προσθέσει και να χρησιμοποιεί τον compiler ΚΑΙ μέσα από το Notepad++.

 

Για παράδειγμα, με στημένη την Pelles C στον φάκελο C:\Program Files\PellesC, για να δουλευτεί από γραμμή εντολών χρειάζονται οι μεταβλητές περιβάλλοντος:

 

LIB=C:\Program Files\PellesC\Lib;C:\Program Files\PellesC\Lib\Win64;

INCLUDE=C:\Program Files\PellesC\Include;C:\Program Files\PellesC\Include\Win;

και να προστεθεί ο φάκελος: C:\Program Files\PellesC\Bin στο PATH

 

Πρέπει να βρει βέβαια και ποια flags δέχεται σε γραμμή εντολή ο cc driver της Pelles-C (το αντίστοιχο δλδ του gcc) και μετά γράφει ένα NppExec σκριπτάκι...

 

>
// Pelles C SCRIPT
npp_save
cd $(CURRENT_DIRECTORY)
cmd /c del $(NAME_PART).exe
C:\Program Files\PellesC\Bin\cc.exe -Tamd64-coff -Ot -Ox -Ob1 -Ze -fp:precise -W1 -Gr $(FILE_NAME)
cmd /c del *.obj
npp_run $(NAME_PART).exe

(επειδή cc driver ενδέχεται να έχει και ο mingw, το έκανα explicit ότι θέλω της Pelles C... αν το άφηνα σκέτο cc και ο bin του mingw προηγείται του bin της Pelles C στο PATH, τότε θα μου έτρεχε ο cc του mingw).

 

Τα flags και τα environment variables του Visual C++ δεν τα ξέρω, αλλά είναι πλέον πολύ εύκολο (πιστεύω) να φτιαχτεί κι ένα VC++ script για όποιον το έχει στημένο. Αν υποθέσουμε πως ο κεντρικός φάκελος είναι στο C:\Program Files\VC και ο compiler-driver του ονομάζεται επίσης cc, τότε...

 

>
// VC++ Script
npp_save
cd $(CURRENT_DIRECTORY)
cmd /c del $(NAME_PART).exe
C:\Program Files\VC\Bin\cc.exe -- εδώ τα command line flags του VC++ -- $(FILE_NAME)
cmd /c del *.obj
npp_run $(NAME_PART).exe

(η Pelles C και ο VC++ παράγουν τα object αρχεία με κατάληξη .obj, αντί για .o του mingw)

 

Οπότε για παράδειγμα μπορεί κανείς χωρίς να αλλάξει περιβάλλον, να τεστάρει τον κώδικά του σε 3 διαφορετικούς compilers μέσα από το Notepad++, κάνοντάς τον compile και με τα 3 διαφορετικά σκριπτάκια :)

 

Επειδή δεν με βλέπω να γράφω 5ο μέρος σύντομα, να πω εν τάχει πως όταν το project περιέχει πολλά πηγαία αρχεία, μπορείτε να τα βάλετε όλα στη γραμμή εντολών του gcc (ή όποιου άλλου compiler).

 

Για παράδειγμα, φτιάχνουμε ξεχωριστό φάκελο για το project μας, που θα περιέχει μονάχα τα δικά του αρχεία κι έχουμε κι ένα σκριπτάκι αποκλειστικά για το project πολλών πηγαίων αρχείων, του στυλ...

 

>
npp_saveall
cd $(CURRENT_DIRECTORY)
rm -f *.exe *.o
gcc -g3 -std=c11 -Wall -Wextra *.c -o myproject.exe
npp_run myproject.exe

 

Ουσιαστικά αντί για μεταβλητές τρέχοντος εγγράφου (μιας κι έχουμε πολλά και όχι μόνο ένα) έβαλα το wildcard * για όλα τα .c και όλα τα .o αρχεία που υπάρχουν στον τρέχοντα φάκελο. Επίσης έδωσα explicit όνομα στο τελικό εκτελέσιμο. Οπότε αυτό το σκριπτ κάθε φορά που το καλούμε κάνει compile ΟΛΑ τα .c αρχεία που υπάρχουν στον τρέχοντα φάκελο, παράγει το εκτελέσιμο αρχείο myproject.exe και το τρέχει ;)

 

Το Notepad++ υποστηρίζει και τα λεγόμενα sessions (π.χ. για να ανοίγουν μονομιάς όλα τα πηγαία αρχεία στον editor) ενώ εδώ και 3-4 εκδόσεις παρέχει και υποστήριξη projects. Με αυτά μπορείτε να δομήσετε πολύ καλύτερα τις ανάγκες των project σας, αλλά για απλές διαδικασίες το παραπάνω σκριπτάκι νομίζω είναι πολύ βολικό.

 

Προσωπικά χρησιμοποιώ είτε το σκριπτάκι για πιο απλά projects, είτε makefiles για πιο σύνθετα (αλλά αυτό νομίζω δεν θα σας πολυ-αρέσει, γιατί προϋποθέτει να μάθει κανείς και το πως δουλεύει το make... ή για να είμαστε πιο ακριβείς, το gnu-make που χρησιμοποιεί ο mingw).

 

Σε ότι αφορά το LanguageHelp plugin, τελικά δεν νομίζω πως χρειάζεται κάποια ιδιαίτερη εξήγηση. Απλώς συνδέετε καταλήξεις πηγαίων αρχείων με κάποιο .chm ή .pdf έγγραφο τεκμηρίωσης, κι έχετε context-sensitive offline help.

 

Τέλος σε ότι αφορά το debugging, το παράδοξο είναι πως τα Win32 apps (και γενικότερα τα GUI apps) γίνονται πιο εύκολα debug με τον gdb μέσα από την κονσόλα του NppExec, γιατί τρέχουν σε ξεχωριστό παράθυρο, άρα δεν υποφέρει το output τους από τον περιορισμό του output redirection που εξηγήσαμε στο 3ο μέρος, αν θυμάμαι καλά).

 

Οπότε για GUI apps, ένα gdb σκριπτάκι του στυλ..

 

>
// GDB GUI SCRIPT
cd $(CURRENT_DIRECTORY)
gdb  "$(NAME_PART)".exe

κάνει μια χαρά δουλειά, δείχνοντας το output του gdb απευθείας μέσα στην κονσόλα του NppExec. Αυτό με τη σειρά του, μας δίνει την ευκαιρία να φτιάξουμε Console Output Filters ειδικά για τον gdb, οπότε με διπλό-κλικ στην κονσόλα του NppExec να μας πηγαίνει απευθείας στην γραμμή του κώδικα (μπορείτε να ενεργοποιήσετε και το verbose mode του gdb, ώστε αυξηθούν οι δυνατότητες αξιοποίησης των Console Output Filters).

 

Αντίθετα, για προγράμματα κονσόλας, είναι προτιμότερο (λόγω του θέματος με το καθυστερημένο output redirection) να τρέχετε τον gdb ως εξωτερικό process, με την εντολή npp_run...

 

>
// GDB CONSOLE SCRIPT
cd $(CURRENT_DIRECTORY)
npp_run gdb  "$(NAME_PART)".exe

αυτό στην πράξη σημαίνει πως ο gdb θα τρέχει σε ξεχωριστό cmd.exe, που με τη σειρά του σημαίνει πως χάνουμε την δυνατότητα αξιοποίησης των Console Output Filters. Από την άλλη μεριά, έτσι τον τρέχουμε στο φυσικό του περιβάλλον με όσες ευκολίες ή δυσκολίες συνεπάγεται αυτό.

 

Τέλος, έχω αναφέρει ήδη πως για απλά Win32 apps, προσθέτουμε το flag -Wl,--subsystem,windows στο τέλος της γραμμής εντολών του gcc. Στη θεωρία μπορούμε να χρησιμοποιήσουμε εναλλακτικά το flag -mwindows που είναι υπερσύνολο του -Wl,--subsystem,windows. Το -mwindows μεταξύ άλλων προσδιορίζει αυτόματα βασικές win32 βιβλιοθήκες στον linker (π.χ. -lgdi32, -lkernel32, κλπ). Χωρίς το -mwindows το default είναι το -mconsole το οποίο ανοίγει παράθυρο κονσόλας cmd.exe.

 

Αν δεν δώσουμε -mwindows, αλλά προσθέσουμε χειροκίνητα τις win32 βιβλιοθήκες που χρησιμοποιούμε στο τέλος της γραμμής εντολών του gcc, τότε θα ανοίξουν 2 παράθυρα όταν τρέξουμε το πρόγραμμα. Ένα το κανονικό, το GUI δηλαδή, κι ένα cmd.exe... αυτό μπορεί να μας φανεί χρήσιμο αν θέλουμε π.χ για debug purposes να έχουμε printf() statements μέσα στο γραφικό μας πρόγραμμα :)

 

Για πιο σύνθετα Win32 apps, π.χ. που χρησιμοποιούν resources, μπορούμε να έχουμε άλλο σκριπτ, του στυλ...

 

>
// WIN32 ADVANCED
npp_saveall
cd $(CURRENT_DIRECTORY)
rm -f $(NAME_PART).exe *.o
gcc -g3 -Wall -Wextra -std=c99 -c $(FILE_NAME) -o $(NAME_PART).o
windres -i  resource.rc -o resource.o
gcc -std=c99 -Wall -Wextra -o  $(NAME_PART).exe $(NAME_PART).o resource.o -s -lkernel32 -luser32 -lcomdlg32 -lgdi32 -lcomctl32 -Wl,--subsystem,windows
rm -f *.o
npp_run "$(NAME_PART)".exe

Το windres είναι ο resource compiler που χρησιμοποιεί ο mingw. Παρατηρήστε επίσης πως αναγράφω χειροκίνητα, μια-μια τις win32 βιβλιοθήκες που χρησιμοποιώ, ενώ έχω προσθέσει και το -Wl,--subsystem,windows για να μην ανοίγει παράθυρο cmd.exe.

 

Επίσης, το παραπάνω σκριπτ αναφέρεται σε ένα μονάχα πηγαίο αρχείο. Συνήθως έχουμε περισσότερα του ενός, οπότε μπορούμε να χρησιμοποιήσουμε το wildcard * (όπως είπαμε παραπάνω)... με ή χωρίς χρήση των λειτουργιών sessions ή/και projects του Notepad++.

 

Όσοι έχετε περιέργεια πως μπορεί να γίνει compile ένα Win32 app με πολλά πηγαία αρχεία, μέσω makefile, ορίστε ένα απλουστευμένο παράδειγμα...

 

>
// NppExec Script

npp_saveall
cd $(CURRENT_DIRECTORY)
rm -f gui_win32.exe *.o
make OUTEXE=gui_win32.exe -f make_gcc.mak

το οποίο προϋποθέτει την ύπαρξη του makefile αρχείου make_gcc.mak στον τρέχοντα φάκελο...

 

>
#OUTEXE = gui_win32.exe
OUTLANG = LANG_EL
INCFLAGS = -Ilang
CC = gcc
DBGFLAGS = -D__DEBUG__ -g3 -Wall -Wextra
W32CFLAGS = -lkernel32 -luser32 -lcomdlg32 -lgdi32 -lcomctl32 -lwinmm -Wl,--subsystem,windows
CFLAGS = -D$(OUTLANG) $(INCFLAGS) $(DBGFLAGS) -std=c99 -finput-charset=cp1253 #-fexec-charset=cp1253
RCOBJ = resource.o
OBJ = gui_win32.o widgets.o w32util.o dialog_tadata.o util.o

$(OUTEXE): $(OBJ) $(RCOBJ)
$(CC) $(CFLAGS) $(OBJ) $(RCOBJ) -o $(OUTEXE) $(W32CFLAGS)
rm -f *.o *.obj
./$(OUTEXE)

%.o : %.c
$(CC) $(CFLAGS) -c {:content:}lt;

$(RCOBJ): resource.rc
windres -i resource.rc --input-format=rc -o resource.o -O coff 

clean:
rm -f *.o gui_win32.exe $(OBJ) $(RCOBJ)

 

Κλείνοντας κι αυτό το ποστ, παραθέτω μερικά χρήσιμα flags του gcc, για Release builds:

 

, -Ο2, -Ο3

επίπεδα βελτιστοποίησης

-s

Remove all symbol table and relocation information from the executable

 

-fexec-charset=charset

Set the execution character set, used for string and character constants. The default is UTF-8. charset can be any encoding supported by the system's iconv library routine.

 

-fwide-exec-charset=charset

Set the wide execution character set, used for wide string and character constants. The default is UTF-32 or UTF-16, whichever corresponds to the width of wchar_t. As with -fexec-charset, charset can be any encoding supported by the system's iconv library routine; however, you will have problems with encodings that do not fit exactly in wchar_t.

 

-finput-charset=charset<a name="index-character-set_002c-input-180">

Set the input character set, used for translation from the character set of the input file to the source character set used by GCC. If the locale does not specify, or GCC cannot get this information from the locale, the default is UTF-8. This can be overridden by either the locale or this command line option. Currently the command line option takes precedence if there's a conflict. charset can be any encoding supported by the system's iconv library routine.

 

Ας πούμε για παράδειγμα πως έχετε κώδικα με Eλληνικό output από την εποχή του DOS, και πως τα τωρινά σας Windows είναι Ελληνικά, άρα υποστηρίζουν την κωδικοσελίδα OEM 737 στην κονσόλα. Μπορείτε να δοκιμάστε να τα κάνετε compile με τον mingw-gcc ως εξής...

 

>
gcc  -finput-charset=cp737 -fexec-charset=cp737 dosprog.c -o dosprog.exe

 

Ένα άλλο παράδειγμα, αν γράψουμε ένα πηγαίο αρχείο .c και το σώσουμε σε κωδικοποίηση ANSI (Windows 1253) και θέλουμε να βγάλει στην κονσόλα Ελληνική έξοδο σε κωδικοποίηση 737, δίνουμε...

 

>
gcc -finput-charset=cp1253 -fexec-charset=cp737 myprog.c -o myprog.exe

 

Δοκιμάστε το π.χ. με αυτό το πηγαίο...

 

>
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
puts( "Καλημέρα κόσμε" );

system( "pause" );
exit(0);
}

 

Δοκιμάστε ξανά, αυτή τη φορά σώζοντας το πηγαίο σε κωδικοποίηση UTF-8 (μενού Encoding - > Convert to UTF-8) και κάντε compile με...

 

>
gcc -finput-charset=utf-8 -fexec-charset=cp737 myprog.c -o myprog.exe

Ως default αν δεν ορίσουμε τα flags -finput-charset= και -fexec-charset=, θεωρείται η κωδικοποίηση UTF-8. Οπότε το παραπάνω μπορεί να γραφτεί και ως...

 

>
gcc -fexec-charset=cp737 myprog.c -o myprog.exe

 

Σημειώστε όμως πως δεν είναι πάντα εφικτές οι μετατροπές από και προς όλες τις πιθανές κωδικοποιήσεις.

 

Τέλος, όσοι έχετε όρεξη μπορείτε να ξεκινήσετε σιγά-σιγά να μαθαίνεται τα unix-οειδή εργαλεία που παρέχει η MSYS του mingw. Είναι μεν για γραμμή εντολών, αλλά ενίοτε μπορούν να φανούν ιδιαίτερα χρήσιμα.

 

Για παράδειγμα στην πιο απλή του μορφή του το grep -i text *.c *.h ψάχνει για το κείμενο "text" μέσα σε όλα τα αρχεία με κατάληξη .c και .h στον τρέχοντα φάκελο. Χρήσιμο σε project με πολλά πηγαία, μέσα στην κονσόλα του NppExec...

 

post-38307-0-96363200-1340623558_thumb.jpg

 

Στην εικόνα αυτή έγραψα: grep -i SetDlgItemText *.c στην κονσόλα του NppExec και μου επέστρεψε σε ποια αρχεία .c βρέθηκε αναφορά της συνάρτησης SetDlgItemText. Βάζοντας το grep να μου τυπώνει και τις γραμμές, μπορώ να φτιάξω κι ένα Console Output Filter όπου με διπλό-κλικ στην σειρά της κονσόλας θα μου ανοίγει το αρχείο στη συγκεκριμένη γραμμή.

 

Πολλά από αυτά τα εργαλεία παρέχονται ήδη από το Notepad++, άλλα όχι. Το συγκεκριμένο παρέχεται από το μενού Search->Find in Files και δίνει το ακόλουθο αποτέλεσμα...

 

post-38307-0-13644300-1340624280_thumb.jpg

 

Αλλά μερικές φορές είναι πιο γρήγορο από την γραμμή εντολών. Η γραμμή εντολών έχει και το πλεονέκτημα του piping, το οποίο συνδυασμένο καλά εργαλεία και σωστή χρήση κάνει παπάδες.

 

EDIT:

 

Ξέχασα! Σε όλον τον μίνι-οδηγό δεν χρησιμοποιήσαμε κανέναν installer (πλην του mingw) οπότε δεν υπάρχουν ιδιαίτερες οδηγίες απεγκατάστασης. Απλώς σβήνετε τον φακέλο του Notepad++ και μαζί του σβήνονται και όλα του τα plugins.

 

Για τον mingw-installer υπάρχει ειδική εγγραφή στην Προσθαφαίρεση Προγραμμάτων στον Πίνακα Ελέγχου. Αν και βασικά νομίζω ότι το μόνο που κάνει έξτρα είναι να σβήνει την συντόμευση της MSYS, καθώς και την εγγραφή του MinGW από το Έναρξη->Προγράμματα.

 

Με λίγα λόγια, δεν υπάρχουν (κρυφές ή μη) εγγραφές στο μητρώο ή και στον %AppData% φάκελο των Windows.

 

Είναι χρήσιμο όμως να ξέρετε πως μπορείτε να κάνετε upgrade νέες εκδόσεις του mingw-toolchain. Το κακό είναι πως πρέπει να έχετε πάντα τον πιο πρόσφατο mingw-installer. Το καλό είναι πως αν τον έχετε, ανοίγετε ένα cmd.exe και με cd πάτε στον κεντρικό φάκελο του mingw και κατόπιν στον υποφάκελο bin, π.χ..

 

cd c:\programs\mingw\bin

 

Κατόπιν πληκτρολογείτε με τις σειρά τις ακόλουθες εντολές...

 

mingw-get update

mingw-get upgrade gcc

mingw-get upgrade gcc-c++ (optional)

mingw-get upgrade gcc-fortran (optional)

mingw-get upgrade gcc-objc (optional)

 

η 1η κατεβάζει τους νεότερους καταλόγους, και οι επόμενες ενημερώνουν τα εργαλεία που του λέτε. Αν το ψάξετε θα βρείτε κι άλλες λειτουργίες του mingw-get μέσω παραμέτρων γραμμής εντολών (π.χ. mingw-get ) αλλά ας το κρατήσουμε απλό εδώ πέρα.

 

Btw, τα περισσότερα από τα εργαλεία της MSYS, με παράμετρο --help παρουσιάζουν σύντομες οδηγίες χρήσης τους (αυτή είναι σύμβαση της GNU), π.χ...

 

mingw-get --help

grep --help

κλπ

 

Τέλος, το επίσημο FAQ του mingw: http://www.mingw.org/wiki/FAQ

 

EDIT 2:

 

Στα σκριπτάκια που αναφέρονται σε πρότζεκτ πολλών πηγαίων, αντικατέστησα την npp_save σε npp_saveall η οποία αποθηκεύει μονομιάς ΟΛΑ τα ανοιχτά έγγραφα του Notepad++ (επειδή είναι πιο συνηθισμένο να έχουμε ανοιχτά πολλά πηγαία του ίδιου πρότζεκτ)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πωπω!!! Έγραψες φίλε migf1!

Πολύ ωραίος. Σου προτείνω να τα πάρεις όλα και να τα βάλεις

σε κανένα block για υποστήριξη του notepad++ ή και στο site σου.

Είναι πολύ χρήσιμα. Συγχαρητήρια και πάλι για τον κόπο σου.

Τώρα πλέον έχω αυτό το linux feeling και στο windows. ;)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πωπω!!! Έγραψες φίλε migf1!

Πολύ ωραίος. Σου προτείνω να τα πάρεις όλα και να τα βάλεις

σε κανένα block για υποστήριξη του notepad++ ή και στο site σου.

Είναι πολύ χρήσιμα. Συγχαρητήρια και πάλι για τον κόπο σου.

Ευχαριστώ :)

 

Μάλλον θα βάλω στη σελίδα μου link προς αυτό το νήμα.

 

Τώρα πλέον έχω αυτό το linux feeling και στο windows. ;)

Η γραμμή εντολών των Windows είναι αρκετά πιο δυνατή από ότι ενδεχομένως πιστεύει ο περισσότερος κόσμος. Αλλά έχει και σημαντικούς περιορισμούς (και ιδιαιτερότητες). Μεγάλο πρόβλημα αποτελεί η ελλιπής (και ουσιαστικά άχρηστη) υποστήριξη UTF-8, καθώς και η μη υποστήριξη του χαρακτήρα backquote ` (που χρησιμοποιείται κατά κόρον στα build και config tools στο τερματικό των Unix\Linux).

 

Η κονσόλα της MSYS επιλύει το 2ο από τα παραπάνω προβλήματα, και ουσιαστικά είναι σχεδόν σαν να βρίσκεσαι σε τερματικό Unix/Linux. Στον υποφάκελο mingw\msys\1.0\home\username θα βρεις αρχεία παραμετροποίησης της λειτουργίας της εν λόγω κονσόλας (.bash_history, .inputrc, κλπ) όπως τα ξέρεις κι από το Linux, ενώ μπορείς π.χ να προσθέσεις κι ένα δικό σου .profile με περαιτέρω παραμετροποιήσεις. Αν θες να ψαχτείς ειδικά για την MingW MSYS, ένα καλό μέρος να ξεκινήσεις είναι από το Wiki της: http://www.mingw.org/wiki/MSYS.

 

Δεν το θυμάμαι ακριβώς αλλά νομίζω πως χρησιμοποιεί το rxvt ως default τερματικό, αλλά έχει και το mintty, ως εναλλακτικό (δες π.χ. σε έναν editor το αρχείο: mingw\msys\1.0\msys.bat τι ακριβώς κάνει... btw, αυτό είναι το αρχείο που αντιστοιχεί στην συντόμευση MinGW Shell που βγάζει στο desktop ο installer του mingw ;) )

 

Τώρα που το βλέπω κι εγώ, δείχνει να έχει 3 επιλογές: sh.exe, rxvt.exe και mintty.exe και φαίνεται πως "παίζεις" με κάποια command-line parameters για το ποιο θες να χρησιμοποιήσεις, αλλά δεν τα έχω χρησιμοποιήσει οπότε πρέπει να διαβάσω κι εγώ για να δω ακριβώς τι και πως. Βασικά εγώ έχω κατεβάσει ξεχωριστά το mintty από το παραπάνω link και του έχω φτιάξει δικιά του συντόμευση (και .profile) για να το τρέχω όποτε θέλω (δεν ήξερα πως υποστηρίζει διαφορετικά terminal emulations η MSYS).

 

Αυτό που έχει ως default δεν υποστηρίζει UTF-8, για αυτό είχα κατεβάσει το mintty (έχει δικά του Options, από το μενού στην πάνω αριστερή γωνία του παραθύρου του).

 

Το ζουμί είναι πως σε αντίθεση με την cmd.exe αυτά υποστηρίζουν τον backquote χαρακτήρα, με τον οποίον απλοποιείται δραματικά η διαδικασία της κατασκευής open source προγραμμάτων από τα sources (επίσης σου επιτρέπουν να χρησιμοποιήσεις κι εσύ στα δικά σου projects linux-οειδείςδιαδικασίες config ή/και build που στηρίζονται στον χαρακτήρα backquote, όπως για παράδειγμα. του pkg-config, που το παρέχει το mingw toolchain.

 

Σε γενικές γραμμές, με το MSYS Basic System έχεις στημένο ένα basic linux toolchain, που σε μεγάλο βαθμό μπορείς να το διαχειριστείς από την γραμμή εντολών των Windows (cmd.exe) αλλά για μεγαλύτερη Linux συμβατότητα (και feeling) το διαχειρίζεσαι από το MingW Shelll (την κονσόλα του MSYS δηλαδή).

 

ΥΓ. Αν θες όσο το δυνατόν μεγαλύτερη συμβατότητα με τα πρότυπα του Posix σε όλα τα επίπεδα, δες το Cygwin project (btw, το mingw είναι fork του cygwin). Εκεί πλέον είναι σαν να είσαι κανονικά σε Linux (μέχρι και Linux desktops μπορείς να στήσεις) αλλά ίσως για αυτές τις δουλειές να είναι καλύτερα ένα virtual-pc.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Αυτό που έχει ως default δεν υποστηρίζει UTF-8, για αυτό είχα κατεβάσει το mintty (έχει δικά του Options, από το μενού στην πάνω αριστερή γωνία του παραθύρου του).

...

Ως ένα μικρό δείγμα της χρησιμότητας του mintty έγραψα ένα πολύ μικρό προγραμματάκι με τα νέα UTF-8 string literals της C11, το οποίο το έκανα compile με το flag std=c11 και το έτρεξα μέσα από το mintty.

 

Όπως βλέπουμε στην εικόνα, λειτουργεί πολύ καλά... τυπώνει μια χαρά το string literal u8"Καλημέρα άπονε & ματαιε κόσμε" μέσα στο mintty (δείχνω και τις ρυθμίσεις του)... παρατηρήστε επίσης πως στο Notepad++ έχω σώσει το πηγαίο ως UTF-8 (δείτε κάτω δεξιά, στη γραμμή κατάστασης του Notepad++)...

 

post-38307-0-78930800-1340705559_thumb.jpg

 

Η μουτζούρα που βλέπετε προκαλείται από τη γραμμή system( "pause" ); του κώδικα, επειδή τα Windows δεν τυπώνουν σε UTF-8 (εκεί κανονικά γράφει: "Πιέστε ένα πλήκτρο για συνέχεια..."). Μια άλλη σημείωση είναι πως ειδικά για το mintty χρειάζεται και η fflush( stdout ) στον κώδικα (αλλιώς θα τυπώσει πρώτα το μήνυμα της system( "pause" ) κι όταν πατήσουμε ένα πλήκτρο θα τυπώσει το "καλημέρα άπονε & ματαιε κόσμε.

 

Ο ίδιος κώδικας εκτελεσμένος μέσα στην cmd.exe δίνει "κινέζικα" αντί για ελληνικά με codepage 1254, ενώ τυπώνει άγνωστα κουτάκια με codepage 65001 (το ανάπηρο UTF-8 της cmd.exe) και για λόγους που αδυνατώ να κατανοήσω τυπώνει το μήνυμα της system("pause") στα αγγλικά...

 

post-38307-0-92813200-1340706508_thumb.jpg

 

Ομοίως συμπεριφέρεται και η default MSYS (MinGW Shell) ... πρέπει να ψαχτώ λιγάκι με τις ρυθμίσεις μπας και την κάνω να έχει το mintty ως default ...

 

post-38307-0-36214600-1340706280_thumb.jpg

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τελικά το mintty χρησιμοποιεί ως default και η MSYS, αλλά δεν το έχει γυρισμένο σε UTF-8. Από ότι είδα στο msys.bat το τρέχει μέσω της εντολής start, που σημαίνει πως τρέχει πρώτα ένα νέο instance της cmd.exe και μέσα από εκεί τρέχει κατόπιν το mintty.exe (αν δεν το βρει, δοκιμάζει το rvxt κι αν δεν βρει ούτε αυτό δοκιμάζει το sh).

 

Προσπάθησα μερικά πράγματα και δεν μου δούλεψαν, οπότε ένας τρόπος που δουλεύει είναι ξεχωριστή, απευθείας συντόμευση του εκτελέσιμου mintty.exe που υπάρχει στον mingw\msys\1.0\bin. Έτσι θα ανοίγει απευθείας το mintty (όχι δηλαδή μέσα από cmd.exe) που σημαίνει πως στο μενού της πάνω-αριστερής γωνίας του παραθύρου του θα έχει την επιλογή Options από όπου το ρυθμίζουμε άμεσα, με τις ρυθμίσεις να αποθηκεύονται στο αρχείο: mingw\msys\1.0\home\user_name\.minttyrc.

 

Εναλλακτικά μπορούμε να περάσουμε ως παραμέτρους γραμμής εντολών όποιες από αυτές τις ρυθμίσεις θέλουμε, στις Ιδιότητες της συντόμευσης,

π.χ. στο πεδίο Προορισμός. c:\programs\mingw\msys\1.0\bin\mintty.exe -o Charset=UTF-8 (περισσότερα αναγράφονται στην τεκμηρίωση του mintty, από το link που έδωσα σε προηγούμενο ποστ).

 

Όσοι θέλετε να "παίξετε" κατεβάστε την MSYS έκδοσή του mintty και αποσυμπιέστε το εκτελέσιμό του μέσα στον mingw\msys\1.0\bin (κρατήστε αντίγραφο του παλιού mintty.exe αν επιθυμείτε). Είναι πιο πρόσφατη έκδοση (1.1 έναντι της 1.0.3 που έχει κατεβάσει ο mingw installer).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έκανα μερικές δοκιμές ακόμα, σε Win7 x64 που είμαι τώρα (κι εννοείται με στημένο το mingw) αντικαθιστώντας στα script του NppExec την τελευταία εντολή, από...

 

>
...
npp_run "$(NAME_PART)".exe

σε...

 

>
...
npp_run mintty -o Charset=UTF-8 -e "$(NAME_PART)".exe

αντί για cmd.exe ανοίγει απευθείας mintty με υποστήριξη UTF-8 και τρέχει μέσα του κανονικά το "$(NAME_PART)".exe. Με αποθηκευμένο το πηγαίο αρχείο είτε σε UTF-8 είτε σε UTF-8 NoBOM οποιοδήποτε ελληνικό string-literal εμφανίζεται σωστά στο runtime μέσα στο mintty. Με αποθηκευμένο το πηγαίο αρχείο σε ANSI, τότε χρειάζεται το gcc flag -finput-charset=cp1253 για να κάνει ο compiler την μετατροπή σε utf-8 στην έξοδο (μέσα στο mintty δηλαδή).

 

Χρήσιμη αυτοματοποίηση.

 

Ο παρακάτω κώδικας είναι ένα ελληνικό UTF-8 hello-world που ανάλογα με το αν το USE_GUI στην αρχή του κώδικα είναι 1 ή 0, τυπώνει "Καλημέρα κόσμε" σε GTK+2 ή σε κονσόλα, αντίστοιχα...

 

 

 

>
#define USE_GUI			0

#if USE_GUI
#include <gtk/gtk.h>
#define WINDOW		GtkWindow
#define CHAR		gchar

#else
#include <stdio.h>
#define WINDOW		void
#define CHAR		char
#endif

#include <stdlib.h>

/*********************************************//**
*
*************************************************
*/
void handle_event( void )
{
#if USE_GUI
gtk_main();
#else
system( "pause" );
#endif
}

/*********************************************//**
*
*************************************************
*/
void print_string( WINDOW **window, const CHAR *outstr )
{
if ( !outstr )
	return;
#if USE_GUI
static GtkWidget *label = NULL;
if ( !window || !*window || !outstr)
	return;

if ( !label )
	gtk_container_add( GTK_CONTAINER(*window), (label = gtk_label_new(outstr)) );
else
	gtk_label_set_text( (GtkLabel *)label, outstr );
gtk_widget_show_all( (GtkWidget *) *window );
#else
puts( outstr );
fflush( stdout );
#endif
}

/*********************************************//**
*
*************************************************
*/
void init( int argc, char *argv[], WINDOW **window )
{
#if USE_GUI
gtk_init(&argc, &argv);

*window = (WINDOW *) gtk_window_new( GTK_WINDOW_TOPLEVEL );
g_signal_connect(
	*window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
#else
/* init here any console related stuff */
#endif
}
/*********************************************//**
*
*************************************************
*/
int main( int argc, char *argv[] )
{
WINDOW	*mainWindow = NULL;
CHAR	outstr[] = "Καλημέρα κόσμε";

init( argc, argv, &mainWindow );
print_string( &mainWindow, outstr );
handle_event();

exit( 0 );
}

 

 

Είναι compiled με ένα generic NppExec script που χρησιμοποιώ για GTK+2 (απλώς εδώ του έχω αλλαγμένη την τελευταία γραμμή, να τρέχει το mintty στο npp_run)....

 

>
npp_save
cd  $(CURRENT_DIRECTORY)
rm -f *.o $(NAME_PART).exe
gcc -g3 -Wextra -Wall $(FILE_NAME) -o "$(NAME_PART)".exe $(SYS.GTK2_CFLAGS) $(SYS.GTK2_LIBS)
npp_run mintty -o Charset=UTF-8 -e "$(NAME_PART)".exe

Με την ευκαιρία, αυτό το script δείχνει και πως μπορούμε να χρησιμοποιήσουμε μεταβλητές περιβάλλοντος των Windows, μέσα στην κονσόλα (ή στα σκριπτ) του NppExec... τους βάζουμε το πρόθεμα SYS.

 

Δηλαδή, τα $(SYS.GTK2_CFLAGS) και $(SYS.GTK2_LIBS) αντιστοιχούν στις μεταβλητές περιβάλλοντος GTK2_CFLAGS και GTK2_LIBS, αντίστοιχα (που είναι ορισμένες κανονικά από το Ο Υπολογιστής μου | ιδιότητες, όπως έχουμε περιγράψει στο 1ο μέρος του οδηγού).

 

Δεν απαιτούνται από το GTK+ API, τις έχω φτιάξει εγώ να περιέχουν τα command-line flags, τα include folders και τις βιβλιοθήκες που χρειάζονται στη γραμμή εντολών του gcc προκειμένου να γίνονται compile & link τα προγράμματα που χρησιμοποιούν το GTK+2 API.

 

Συγκεκριμένα, με τα Win32 binaries του GTK+2 αποσυμπιεσμένα στον φάκελο: c:\unix\gtk2 έχω ορίσει τις μεταβλητές αυτές να περιέχουν τις παρακάτω τιμές:

GTK2_CFLAGS='-mms-bitfields -Ic:/unix/gtk2/include/gtk-2.0 -Ic:/unix/gtk2/lib/gtk-2.0/include -Ic:/unix/gtk2/include/atk-1.0 -Ic:/unix/gtk2/include/cairo -Ic:/unix/gtk2/include/pango-1.0 -Ic:/unix/gtk2/include/glib-2.0 -Ic:/unix/gtk2/lib/glib-2.0/include -Ic:/unix/gtk2/include -Ic:/unix/gtk2/include/freetype2 -Ic:/unix/gtk2/include/libpng14'

 

GTK2_LIBS='-Lc:/unix/gtk2/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl'

 

έτσι ώστε να μη χρειάζεται να γράφω όλα αυτά τα μαρκινάρια όποτε θέλω να κάνω compile.

 

Δηλαδή, αν θέλαμε να κάνουμε compile απευθείας από cmd.exe θα γράφαμε ...

 

gcc gtk2prog.c -o gtk2prog.exe %GTK2_CFLAGS% %GTK2_LIBS%

 

Αν θυμάστε, στο προηγούμενο post έθιξα το πρόβλημα που έχει η cmd.exe να μην υποστηρίζει τον χαρακτήρα backquote. Αν τον υποστήριζε, το compilation εφαρμογών GTK+2 θα ήταν δραματικά απλοποιημένο, στην παρακάτω γραμμή (χωρίς την ανάγκη καμιάς από τις παραπάνω μεταβλητές περιβάλλοντος)....

 

>gcc gtk2prog.c -o gtk2prog.exe `pkg-config --cflags --libs gtk+-2.0`

(από το pkg-config μέχρι το τέλος της γραμμής περικλείονται σε χαρακτήρες backquote).

 

Με το mingw-toolchain εγκατεστημένο το παραπάνω είναι εφικτό μέσα από την κονσόλα της MSYS :)

 

Σημείωση: Αν θέλετε να στήσετε το GTK+2 για ανάπτυξη εφαρμογών στα Windows, κατεβάζετε το all-in-one-bundle (θα το δείτε γραμμένο ολογράφως σε δικό του link), το αποσυμπιέζετε σε όποιον φάκελο θέλετε (π.χ. c:\programs\gtk2), προσθέτετε τον φάκελο των εκτελέσιμών του στο PATH των Windows ( π.χ. PATH=c:\programs\gtk2\bin;bla-bla) και προαιρετικά (κάντε το) φτιάχνετε 2 ακόμα μεταβλητές περιβάλλοντος:

 

GTK_HOME=c:\programs\gtk2

PKG_CONFIG_PATH = c:\programs\gtk2\lib\pkgconfig;ότι_άλλα_περιεχόμενα_είχε_η_μεταβήτή_αν_υπήρχε_ήδη

 

η 2η μεταβλητή είναι αυτή που σας επιτρέπει μέσα από την κονσόλα την MSYS να χρησιμοποιήσετε την απλοποιημένη γραμμή εντολών με τα backquotes ;)

 

ΥΓ. Είχα δεν είχα το έκανα ολίγον... advanced το νήμα μου φαίνεται...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@migf1: Ξερεις πως μπορω να κανω add μια γλωσσα στο μενου?

 

>		
<Language name="Standard ML" ext="sml" commentLine="" commentStart="(*" commentEnd="*)">
       <Keywords name="instre1">abstype abstraction and andalso as case datatype div do else end eqtype exception false fn fun functor funsig handle if in include infix infixr let local mod nil nonfix of op open orelse raise rec sharing sig signature struct structure then type true val where with withtype while</Keywords>
<Keywords name="instre2">option SOME NONE ignore ref chr explode implode ord size it<Keywords>
<Keywords name="type1">array bool char int list nil real string unit vector word<Keywords>
</Language>

 

Αλλά δεν μου παίζει για κάποιο λόγο

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@migf1: Ξερεις πως μπορω να κανω add μια γλωσσα στο μενου?

 

>		
<Language name="Standard ML" ext="sml" commentLine="" commentStart="(*" commentEnd="*)">
       <Keywords name="instre1">abstype abstraction and andalso as case datatype div do else end eqtype exception false fn fun functor funsig handle if in include infix infixr let local mod nil nonfix of op open orelse raise rec sharing sig signature struct structure then type true val where with withtype while</Keywords>
<Keywords name="instre2">option SOME NONE ignore ref chr explode implode ord size it<Keywords>
<Keywords name="type1">array bool char int list nil real string unit vector word<Keywords>
</Language>

 

Αλλά δεν μου παίζει για κάποιο λόγο

Δυστυχώς δεν έχω ασχοληθεί ποτέ με το συγκεκριμένο οπότε δεν έχω εικόνα. Τα λινκ που έχω δώσει δεν βοηθάνε;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 μήνες μετά...

Μου στειλανε κατι html αρχεια να κοιταξω και επειδη ηταν αθλια γραμμενα ειπα να δοκιμασω τα διαφορα indent

Πρωτα πρωτα το TextFx με διαφορες ρυθμισεις απετυχε

Μετα δοκιμασα το Tidy2 και αυτο απετυχε

Δοκιμασα και το Indent By Fold το οποιο κρατουσε τους ελληνικους χαρακτηρες στα μηνυματα αλλα δεν κλεινει καλα το html.

 

Καμια αλλη λυση?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...