;;-*-Emacs-Lisp-*- ;; .emacs ;; Sherif Ghali ;; October 2011 ;;________________________________________________________________ ;; Determine where we are ;;________________________________________________________________ (defvar system-type-as-string (prin1-to-string system-type)) (defvar on_windows_nt (string-match "windows-nt" system-type-as-string)) (defvar on_darwin (string-match "darwin" system-type-as-string)) (defvar on_gnu_linux (string-match "gnu/linux" system-type-as-string)) (defvar on_cygwin (string-match "cygwin" system-type-as-string)) (defvar on_solaris (string-match "usg-unix-v" system-type-as-string)) ;;________________________________________________________________ ;; Set the elisp path ;;________________________________________________________________ (cond (on_darwin (setq load-path (cons "~/ghaliweekly/elisp" load-path)) )) (cond (on_windows_nt (setq load-path (cons "h:/elisp" load-path)) )) (cond (on_gnu_linux (setq load-path (cons "~/elisp" load-path)) )) (cond (on_cygwin (setq load-path (cons "/cygdrive/h/elisp" load-path)) )) (cond (on_solaris (setq load-path (cons "~/elisp" load-path)) )) ;;________________________________________________________________ ;; General settings ;;________________________________________________________________ ;; If we read a compressed file, uncompress it on the fly: ;; (this works with .tar.gz and .tgz file as well) (auto-compression-mode 1) ;; The following key-binding iconifies a window -- we disable it: (global-unset-key "\C-x\C-z") ;; The following key-binding quits emacs -- we disable it too: (global-unset-key "\C-x\C-c") ;; But we establish a longer sequence that is harder to hit by accident: (global-set-key "\C-x\C-c\C-v" 'save-buffers-kill-emacs) ;; The longer sequence is all right: emacs should be launched just ;; once at login and never killed until ready to logout. ;; C-x j, which is bound to kanji entering, is too close to dired's C-x C-j (global-unset-key "\C-xj") ;; Disable binding of C-z to iconify a window. (global-unset-key "\C-z") ;; M-` invokes tmm-menubar; disable it. (global-unset-key "\M-`") ;; C-x C-n invokes set-goal-column; disable it. (global-unset-key "\C-x\C-n") ;; We use C-c C-z to invoke a shell inside emacs. ;; The benefits of running a shell from emacs (rather than in an xterm) are: ;; - It is possible to cycle through the previous commands ;; and edit them using the usual emacs commands ;; - One completely avoids using the mouse ;; - The commands are fontified, which makes it easy to identify, for example, ;; the command line options. ;; - There is no upper bound on the output size: Everything is saved. ;; This of course requires caution, but has the benefit of allowing ;; the usual search commands in the shell window. (global-set-key "\C-c\C-z" 'eshell) ;; prevent down-arrow from adding empty lines to the bottom of the buffer ;; (which is the default behaviour) (setq next-line-add-newlines nil) ;; To make it possible for M-q (fill-paragraph) to end a line with a period, ;; one needs to tell emacs to abandon its convention of distinguishing between ;; single and double space. (setq sentence-end-double-space nil) ;;________________________________________________________________ ;; Flash the screen on error; don't beep. ;;________________________________________________________________ (setq-default visible-bell t) ;;________________________________________________________________ ;; More Misc ;;________________________________________________________________ ;; Highlight the marked region. (setq-default transient-mark-mode t) ;; 'woman' mode is an improvement on 'man' mode for manual pages (setq-default woman-use-own-frame nil) ;; Man-notify-method controls the behaviour of (wo)man mode. (setq-default Man-notify-method 'pushy) ;; Permanent display of line and column numbers is handy. (setq-default line-number-mode 't) (setq-default column-number-mode 't) ;;________________________________________________________________ ;; Font lock ;;________________________________________________________________ ;; Use font-lock everywhere. (global-font-lock-mode t) ;; We have CPU to spare; highlight all syntax categories. (setq font-lock-maximum-decoration t) ;; It is much more pleasant and less tiring to use a dark background. (set-foreground-color "white") (set-background-color "black") ;; Set cursor and mouse colours: (set-cursor-color "yellow") (set-mouse-color "white") ;;________________________________________________________________ ;; Choose a font that provides 60-80 lines. ;;________________________________________________________________ (cond (on_darwin (set-default-font "-apple-monaco-medium-r-normal--14-*-*-*-*-*-*-*") ;; (set-default-font "-apple-monaco-medium-r-normal--12-120-72-72-m-120-iso10646-1") ;; (set-default-font "-apple-monaco-medium-r-normal--13-130-72-72-m-130-iso10646-1") ;; (set-default-font "-apple-monaco-medium-r-normal--14-140-72-72-m-140-iso10646-1") ;; (set-default-font "-apple-monaco-medium-r-normal--18-*-*-*-*-*-*-*") ;; (set-default-font "-apple-monaco-medium-r-normal--24-*-*-*-*-*-*-*") ;; (set-default-font "-apple-monaco-medium-r-normal--36-*-*-*-*-*-*-*") )) (cond (on_windows_nt ;; (set-default-font "Lucida Console-9:bold") (set-default-font "Lucida Console-11:bold") ;; (set-default-font "Lucida Console-13:bold") ;; (set-default-font "Lucida Console-15:bold") ;; (set-default-font "Consolas-12") ;; (set-default-font "Courier New-12:bold") )) (cond (on_gnu_linux (set-default-font "9x15bold") ;; (set-default-font "12x24") )) (cond (on_cygwin (set-default-font "9x15bold") )) ;;________________________________________________________________ ;; I hardly ever use the menu bar or the tool bar ;;________________________________________________________________ ;; Asking for no menu bar on OS X/Darwin is harmless, but also futile. (cond (on_windows_nt (menu-bar-mode -1) )) (when window-system (tool-bar-mode -1) ) ;; remember that speedbar, on the other hand, is useful ;;________________________________________________________________ ;; Settings for new frames (make-frame-command, C-x 5 2) ;;________________________________________________________________ (setq default-frame-alist '((background-color . "black") (foreground-color . "white") (scroll-bar-foreground-color . "red") (vertical-scroll-bars . right) (scroll-bar-width . 17) (top . 20) (left . 10) (width . 140) ;; (height . 50) ;; for laptop (mouse-color . "yellow") (cursor-color . "yellow"))) (cond (on_windows_nt (setq default-frame-alist (append default-frame-alist '((font . "Lucida Console-11:bold") (height . 64) (width . 140) ))) )) (cond (on_darwin (setq default-frame-alist (append default-frame-alist '((font . "-apple-monaco-medium-r-normal--14-*-*-*-*-*-*-*") (width . 130) (height . 39) ;; (height . 58) too large for MacBook's 1280x800 ))) )) (cond (on_gnu_linux (setq default-frame-alist (append default-frame-alist '((font . "9x15bold") (width . 130) (height . 38) ))) )) (cond (on_solaris (setq default-frame-alist (append default-frame-alist '((width . 130) (height . 38) ))) )) ;; notice that ;; toggle-horizontal-scroll-bar ;; reports ;; toggle-horizontal-scroll-bar: Horizontal scroll bars aren't implemented yet ;;________________________________________________________________ ;; Use the following settings for the initial frame. ;;________________________________________________________________ (setq initial-frame-alist '((top . 20) (left . 10) (width . 140) (height . 39) )) ;;________________________________________________________________ ;; Files and directories ;;________________________________________________________________ ;; dired-x is a nice substitute for Windows Explorer and OSX's Finder. ;; M-o: avoid seeing all the backup files. ;; C-x C-j: enter dired/dired-x mode. (add-hook 'dired-load-hook (function (lambda () (load "dired-x")))) ;; Because Explorer and Finder have a mapping from file type to application, ;; we need to tell emacs what to do with each file type. (setq dired-guess-shell-alist-user (list (list "\\.ipe$" "ipe ") (list "\\.xml$" "ipe ") (list "\\.prn$" "gv ") (list "\\.ps$" "gv ") (list "\\.ps.gz$" "gv ") (list "\\.eps$" "gv ") (list "\\.eps.gz$" "gv ") (list "\\.pdf$" "acroread") (list "\\.PDF$" "acroread") (list "\\.iv$" "SceneViewer") (list "\\.\\(rgb\|tiff\|tif\|xbm\|gif\|pgm\|ppm\|bmp\|tga\\)$" "display") (list "\\.ppm$" "display") (list "\\.gif$" "display") (list "\\.png$" "display") (list "\\.jpg$" "display") (list "\\.JPG$" "display") (list "\\.avi$" "movieplayer") (list "\\.sc$" "showcase") (list "\\.wav$" "realplay") (list "\\.drawtool$" "drawtool") )) ;;________________________________________________________________ ;; Define a few colours that look good on reverse video: ;;________________________________________________________________ (set-face-foreground 'bold "LightGoldenrod") (set-face-background 'bold "grey20") (set-face-foreground 'bold-italic "yellow green") (set-face-foreground 'italic "yellow3") (set-face-background 'region "DarkSlateGrey") (set-face-foreground 'isearch "white") (set-face-background 'isearch "SteelBlue3") (set-face-foreground 'font-lock-comment-face "green") (set-face-background 'font-lock-comment-face "black") (set-face-foreground 'font-lock-string-face "LightSalmon") (set-face-background 'font-lock-string-face "black") (set-face-foreground 'font-lock-doc-face "LightSalmon2") (set-face-background 'font-lock-doc-face "black") ;; font-lock-doc-face inherits font-lock-string-face. (set-face-foreground 'font-lock-function-name-face "gold") (set-face-background 'font-lock-function-name-face "gray10") ;; dired-directory inherits font-lock-function-name-face. (set-face-foreground 'font-lock-variable-name-face "LightGoldenrod") (set-face-background 'font-lock-variable-name-face "black") (set-face-foreground 'font-lock-keyword-face "gold") (set-face-background 'font-lock-keyword-face "black") ;; Face: font-lock-type-face ;; Documentation: Font Lock mode face used to highlight types and classes. (set-face-foreground 'font-lock-type-face "cyan") (set-face-foreground 'modeline "black") (set-face-background 'modeline "SteelBlue2") ;; "#5cacee" (set-face-foreground 'highlight "black") (set-face-foreground 'secondary-selection "black") ;; Green #00ff00 ;; LightSalmon2 #ee9572 238,149,114 ;; gold #ffd700 255,215,0 ;; gray15 #262626 ;; LightGoldenrod #eedd82 ;; SteelBlue2 #5cacee 92,172,238 ;; DarkSlateGrey #2f4f4f ;; LightBlue2 ;; SteelBlue2 ;;________________________________________________________________ ;; Settings for compilation ;;________________________________________________________________ ;; We set a key-binding for this often-used command: (global-set-key "\M-C" 'compile) ;; Notice that by default 'compile calls "make -k" ;; The following two commands load the source file automatically and point ;; to the error/warning line. This make emacs essentially a (mouse-free) IDE: (global-set-key [f11] 'previous-error) (global-set-key [f12] 'next-error) ;;________________________________________________________________ ;; Settings for compilation scrolling ;;________________________________________________________________ ;; scroll the *compilation* buffer window as output appears. (setq compilation-scroll-output t) ;; (setq compilation-window-height 20) (setq compile-auto-highlight t) ;;________________________________________________________________ ;; Set the default compilation command ;;________________________________________________________________ ;; default on *nix is 'make -t' (cond (on_windows_nt (setq compile-command "nmake") )) (cond (on_darwin (setq compile-command "make ") )) (cond (on_gnu_linux (setq compile-command "make ") )) (cond (on_solaris (setq compile-command "make ") )) ;;________________________________________________________________ ;; Compile without pressing enter to confirm command ;;________________________________________________________________ ;; (setq compilation-read-command nil) ;; ;; This is a bad idea: ;; 1- It precludes using qmake as a variant. ;; 2- It is mildly risky if the compile command becomes somehow corrupted. ;;________________________________________________________________ ;; Settings for modes ;;________________________________________________________________ ;;________________________________ ;; c++-mode ;;________________________________ ;; Even if the file extension is just .c or .h, assume it is a C++ file: (setq auto-mode-alist (cons '("\\.c\\'" . c++-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.h\\'" . c++-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.fx\\'" . c++-mode) auto-mode-alist)) ;; Treat vertex and fragment shaders as C programs (setq auto-mode-alist (cons '("\\.fsh\\'" . c-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.vsh\\'" . c-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.vert\\'" . c-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.frag\\'" . c-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.vert.txt\\'" . c-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.frag.txt\\'" . c-mode) auto-mode-alist)) ;; Accept more filenames as Makefiles. (setq auto-mode-alist (cons '(".*Makefile.*" . makefile-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.mak" . makefile-mode) auto-mode-alist)) ;; Treat .rhtml files as HTML (setq auto-mode-alist (cons '("\\.rhtml\\'" . html-mode) auto-mode-alist)) ;;________________________________ ;; ruby-mode ;;________________________________ (setq ruby-indent-level 4) ;; Treat .rjs files as Ruby (setq auto-mode-alist (cons '("\\.rjs\\'" . ruby-mode) auto-mode-alist)) ;; Rakefiles are Ruby files: (setq auto-mode-alist (cons '("\\Rakefile\\'" . ruby-mode) auto-mode-alist)) ;; So is Gemfile: (setq auto-mode-alist (cons '("\\Gemfile\\'" . ruby-mode) auto-mode-alist)) ;; Treat .vssettings files (Visual Studio) as XML (setq auto-mode-alist (cons '("\\.vssettings\\'" . xml-mode) auto-mode-alist)) ;;________________________________ ;; Finance ;;________________________________ ;; Treat .fixlog files (FIX) as XML -- large files; use on demand ;; (setq auto-mode-alist (cons '("\\.fixlog\\'" . xml-mode) auto-mode-alist)) ;; or else: don't font-lock fixlog files ;; (setq auto-mode-alist (cons '("\\.fixlog\\'" . fundamental-mode) auto-mode-alist)) ;; Treat .ssql files (Streambase) as SQL (setq auto-mode-alist (cons '("\\.ssql\\'" . sql-mode) auto-mode-alist)) ;;________________________________ ;; lua-mode ;;________________________________ ;; http://lua-mode.luaforge.net/ (setq auto-mode-alist (cons '("\\.lua$" . lua-mode) auto-mode-alist)) (autoload 'lua-mode "lua-mode" "Lua editing mode." t) ;; If you want to use hideshow, turn on hs-minor-mode or add this: ;; (add-hook 'lua-mode-hook 'hs-minor-mode) ;;________________________________ ;; Boost jam-mode ;;________________________________ (cond (on_windows_nt (require 'jam-mode) (add-to-list 'auto-mode-alist '("\\.jam$" . jam-mode)) (add-to-list 'auto-mode-alist '("^Jamfile$\\|^Jamfile\\.v2$" . jam-mode)) )) ;;________________________________ ;; DOS batch files ;;________________________________ (cond (on_windows_nt (autoload 'dos-mode "dos" "Edit Dos scripts." t) (add-to-list 'auto-mode-alist '("\\.bat$" . dos-mode)) )) ;;________________________________ ;; lilypond-mode ;;________________________________ ;; http://lilypond.org/doc/v2.11/Documentation/user/lilypond-program/Emacs-mode (cond (on_darwin (setq load-path (append (list (expand-file-name "~/ghaliweekly/elisp/lily")) load-path)) ;; "/Applications/LilyPond.app/Contents/Resources/share/emacs/site-lisp")) load-path)) (autoload 'LilyPond-mode "lilypond-mode" "LilyPond Editing Mode" t) (add-to-list 'auto-mode-alist '("\\.ly$" . LilyPond-mode)) (add-to-list 'auto-mode-alist '("\\.ily$" . LilyPond-mode)) (add-hook 'LilyPond-mode-hook (lambda () (turn-on-font-lock))) )) ;;________________________________ ;; qt-pro-mode ;;________________________________ ;; http://www.tolchz.net/2008/01/07/qmake-major-mode-for-emacs-qt-proel/ ;; Use for Qt's .pro and .pri files (if on_gnu_linux () (progn (require 'qt-pro) (add-to-list 'auto-mode-alist '("\\.pr[io]$" . qt-pro-mode))) ) ;; Treat .moc files (Qt) as C++ ;; (setq auto-mode-alist (cons '("\\.moc\\'" . c++-mode) auto-mode-alist)) ;; Nokia/Trolltech renamed moc files to moc_*.cpp. Pattern added to dired-omit. ;; Treat .ui files (Qt) as XML (setq auto-mode-alist (cons '("\\.ui\\'" . xml-mode) auto-mode-alist)) ;;________________________________ ;; Old: ;; Qt mode from: ;; http://www.emacswiki.org/emacs/QtMode ;;________________________________ ;;(require 'cc-mode) ;; (setq c-C++-access-key "\\<\\(slots\\|signals\\|private\\|protected\\|public\\)\\>[ \t]*[(slots\\|signals)]*[ \t]*:") ;; (font-lock-add-keywords 'c++-mode '(( (concat "\\<\\(Q_OBJECT\\|public slots\\|public signals\\|private slots\\|" ;; "private signals\\|protected slots\\|protected signals\\)\\>") . font-lock-constant-face))) ;;________________________________ ;; Ruby on Rails ;;________________________________ ;; Emacs has one serious weakness. There is no way to use font-lock in ;; a file mixing two languages. A literate program mixing C code with ;; LaTeX is one example. An rhtml file mixing Ruby and HTML is ;; another. ;;(cond (on_darwin ;; (setq load-path (cons "~/ghaliweekly/elisp/emacs-rails" load-path)) ;; (setq load-path (cons "~/ghaliweekly/elisp/emacs-rails-extra" load-path)) ;; ;; (defun try-complete-abbrev (old) ;; (if (expand-abbrev) t nil)) ;; ;; (setq hippie-expand-try-functions-list ;; '(try-complete-abbrev ;; try-complete-file-name ;; try-expand-dabbrev)) ;; ;; (require 'rails) ;; ;; (setq auto-mode-alist (cons '("\\.rhtml$" . html-mode) auto-mode-alist)) ;;)) ;;________________________________ ;; javascript-mode ;;________________________________ (setq auto-mode-alist (cons '("\\.js\\'" . java-mode) auto-mode-alist)) ;; no good: ;;(autoload 'javascript-mode "javascript-mode") ;;(setq auto-mode-alist ;; (cons '("\\.js\\'" . javascript-mode) auto-mode-alist)) ;; ________________________________ ;; xml-mode ;; ________________________________ (setq auto-mode-alist (cons '("\\.ipe\\'" . xml-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.qrc\\'" . xml-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.svg\\'" . xml-mode) auto-mode-alist)) ;;________________________________________________________________ ;; Scrolling ;;________________________________________________________________ ;; We also map scroll wheel and trackpad events to scrolling. ;; The mouse wheel on windows generates few events. ;; Scroll by 3 unless shifted. (defun up-slow () (interactive) (scroll-up 1)) (defun down-slow () (interactive) (scroll-down 1)) (defun up-semi-slow () (interactive) (scroll-up 2)) (defun down-semi-slow () (interactive) (scroll-down 2)) (defun up-medium () (interactive) (scroll-up 3)) (defun down-medium () (interactive) (scroll-down 3)) (cond (on_windows_nt ;; xemacs won't like the following: (global-set-key [mouse-4] 'down-medium) (global-set-key [mouse-5] 'up-medium) (global-set-key [S-mouse-4] 'down-slow) (global-set-key [S-mouse-5] 'up-slow) )) ;; The trackpad on Mac OSX generates too many events. ;; Scroll by 1 unless shifted. (cond (on_darwin (global-set-key [mouse-4] 'down-slow) (global-set-key [mouse-5] 'up-slow) (global-set-key [S-mouse-4] 'down-medium) (global-set-key [S-mouse-5] 'up-medium) )) (cond (on_gnu_linux (global-set-key [mouse-4] 'down-medium) (global-set-key [mouse-5] 'up-medium) (global-set-key [S-mouse-4] 'down-slow) (global-set-key [S-mouse-5] 'up-slow) )) (defun up-fast () (interactive) (scroll-up 8)) (defun down-fast () (interactive) (scroll-down 8)) (global-set-key [C-mouse-4] 'down-fast) (global-set-key [C-mouse-5] 'up-fast) ;; Ordinarily emacs jumps by half a page when scrolling -- reduce: (setq scroll-step 1) ;; The default value is 5, which is too fast on a MacBook or a trackpad; reduce: (cond (on_darwin (mouse-wheel-mode 1) (setq mouse-wheel-scroll-amount '(1 ((shift) . 1) ((control) . nil))) (setq mouse-wheel-progressive-speed 'f) )) ;; And finally, the most useful addition to .emacs: the ability to ;; scroll from the keyboard (what is everyone else using!?) (global-set-key "\M-N" 'up-semi-slow) (global-set-key "\M-P" 'down-semi-slow) ;;________________________________________________________________ ;; Calendar ;;________________________________________________________________ (setq calendar-latitude [43 40 north]) (setq calendar-longitude [79 24 west]) (setq calendar-time-zone -300) (setq calendar-location-name "Toronto") ;;________________________________________________________________ ;; Dired-mode settings ;;________________________________________________________________ ;; A few customizations: ;; Among them: make copy and delete in dired recursive. (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(dired-recursive-copies (quote top)) '(dired-recursive-deletes (quote top)) '(large-file-warning-threshold 100000000) '(mumamo-submode-indent-offset 4) '(same-window-buffer-names (quote ("*eshell*" "*Python*" "*shell*" "*mail*" "*inferior-lisp*" "*ielm*" "*scheme*" "*")))) ;;________________________________________________________________ ;; Local Variable Values ;;________________________________________________________________ ;; May need: ;; (TeX-brace-indent-level . 4) (TeX-auto-untabify) ;; (TeX-auto-regexp-list . LaTeX-auto-regexp-list)))) ;;________________________________________________________________ ;; Dired omit ;; dired-omit-files is only effective if emacs is restarted. ;;________________________________________________________________ (add-hook 'dired-mode-hook (lambda () (setq dired-omit-files (concat "^\\.$\\|" "^\\.\\.$\\|" "^\\.git$\\|" "^moc_\\|" "\\.d$\\|" "\\.ncb$\\|" "\\.sln$\\|" "\\.suo$\\|" "^vc90\\|" "\\.pdb$\\|" "^vc90\\.idb$\\|" "^Jamfile$\\|" "^Jamfile\\.v2$\\|" "^Makefile$\\|" "^Makefile\\.Debug$\\|" "^Makefile\\.Release$\\|" "\\.vcproj$\\|" "\\.vcproj\\.NA\\.ghali\\.user$")) )) ;; We don't hide \\|^debug$\\|^release$ to keep it possible to run (! or &) executables from emacs. ;; ;; Do not set ;; dired-omit-extensions ;; directly. See below. ;;________________________________________________________________ ;; Completion ;;________________________________________________________________ '(completion-ignored-extensions (quote ("CVS/" ".o" "~" ".bin" ".lbin" ".fasl" ".ufsl" ".a" ".ln" ".blg" ".bbl" ".elc" ".lof" ".glo" ".idx" ".lot" ".dvi" ".fmt" ".tfm" ".class" ".fas" ".lib" ".x86f" ".sparcf" ".lo" ".la" ".toc" ".log" ".aux" ".cp" ".fn" ".ky" ".pg" ".tp" ".vr" ".cps" ".fns" ".kys" ".pgs" ".tps" ".vrs" ".lbl" ".out" ".brf" ".ncb" ".sln" ".suo" ".vcproj.AD.ghali.user" ".idb" ".pdb" ".synctex.gz" ".svn"))) ;; .vcproj.AD.ghali.user ;; client.vcproj.AD.ghali.user ;; dired-omit-extensions defaults to elements of ;; `completion-ignored-extensions' ;; `dired-latex-unclean-extensions' ;; `dired-bibtex-unclean-extensions' ;; `dired-texinfo-unclean-extensions' ;;________________________________________________________________ ;; Avoid vertical splits ;;________________________________________________________________ ;; If a window is wider than split-width-threshold, Emacs will split a ;; window horizontally (C-x 3) when one compiles. Since my preferred ;; default is to truncate-lines, it means that I have to scroll ;; horizontally to read the error messages. Change the variable to ;; something half of which makes it possible to read compilation ;; messages. (setq split-width-threshold 240) ;;________________________________________________________________ ;; Function definitions (bound to function keys) ;;________________________________________________________________ (defun altotop () "Align at Top of Screen" (interactive) (recenter 1)) ;; now that recenter-top-bottom is C-l, use F7 for something other than (recenter 1). (defun funcsumm () "function summary" (interactive) (occur "^void\\|int [a-zA-Z_]*([^$])[^;]$")) ;; (occur "\(void\|int\) *")) (defun ptreg1 () "Save Current Location" (interactive) (point-to-register 1)) (defun gtreg1 () "Goto Saved Location" (interactive) (jump-to-register 1)) (defun ptreg2 () "Save Current Location" (interactive) (point-to-register 2)) (defun gtreg2 () "Goto Saved Location" (interactive) (jump-to-register 2)) (defun ptreg3 () "Save Current Location" (interactive) (point-to-register 3)) (defun gtreg3 () "Goto Saved Location" (interactive) (jump-to-register 3)) (defun ptreg4 () "Save Current Location" (interactive) (point-to-register 4)) (defun gtreg4 () "Goto Saved Location" (interactive) (jump-to-register 4)) ;;________________________________________________________________ ;; Function Key binding ;;________________________________________________________________ (global-set-key [f1] 'goto-line) (global-set-key [f2] 'what-line) (global-set-key [S-f3] 'ptreg1) (global-set-key [f3] 'gtreg1) (global-set-key [S-f4] 'ptreg2) (global-set-key [f4] 'gtreg2) (global-set-key [S-f5] 'ptreg3) (global-set-key [f5] 'gtreg3) (global-set-key [S-f6] 'ptreg4) (global-set-key [f6] 'gtreg4) (global-set-key [f7] 'altotop) (global-set-key [S-f7] 'eval-region) ;; (global-set-key [f8] 'funcsumm) (global-set-key [f8] 'bury-buffer) (global-set-key [S-f8] 'unbury-buffer) ;; (global-set-key [S-f8] 'brf-FindNextDbl) ;; We also set [M-f8] below to hs-toggle-hiding (global-set-key [M-f9] 'shrink-window) (global-set-key [M-f10] 'enlarge-window) ;; (global-set-key [f9] 'delete-other-windows) ; ^x 1 ;; (global-set-key [f10] 'other-window) ; ^x o (global-set-key [f11] 'previous-error) (global-set-key [f12] 'next-error) ;; windows doesn't send S-f3 but f13 so we define those: (global-set-key [f13] 'ptreg1) (global-set-key [f14] 'ptreg2) (global-set-key [f15] 'ptreg3) (global-set-key [f16] 'ptreg4) ;; interesting; by default it maps to <print>. (global-set-key [f17] 'eval-region) ;;________________________________________________________________ ;; Insert hard newlines while typing in text mode ;;________________________________________________________________ (add-hook 'text-mode-hook '(lambda () (auto-fill-mode 1))) (add-hook 'mail-mode-hook '(lambda () (auto-fill-mode 1))) (add-hook 'latex-mode-hook '(lambda () (auto-fill-mode 1))) ;;________________________________________________________________ ;; Put all .save's in one place ;;________________________________________________________________ (cond (on_darwin (setq auto-save-list-file-prefix "~/ghaliweekly/misc/.save/.saves-" ) )) ;;________________________________________________________________ ;; Info ;;________________________________________________________________ (cond (on_windows_nt (setq Info-directory-list (cons (expand-file-name "C:/cygwin17/usr/share/info/") Info-default-directory-list)) )) ;; Other places to look for info files: ;; setenv INFOPATH /usr/gnu/info:/usr/local/info:/usr/TeX/info ;; /usr/share/info/ ;;________________________________________________________________ ;; fontify html ;;________________________________________________________________ ;; even though emacs > 21.xx.xx has an html mode, htmlfontify is ;; useful because it makes it possible to ;; M-x htmlfontify-copy-and-link-dir (cond (on_darwin (when (< emacs-major-version 23) (setq load-path (cons "~/ghaliweekly/elisp/htmlfontify" load-path)) (require 'htmlfontify) ))) ;;________________________________________________________________ ;; Stop cursor from blinking ;;________________________________________________________________ ;; Starting from emacs 21, the default cursor blinks. (when (>= emacs-major-version 21) (blink-cursor-mode 0) ) ;;________________________________________________________________ ;; Some dired settings ;;________________________________________________________________ (cond (on_darwin (require 'dired) (define-key dired-mode-map "o" 'dired-open-mac) (defun dired-open-mac () (interactive) (let ((file-name (dired-get-file-for-visit))) (if (file-exists-p file-name) (shell-command (concat "open '" file-name "'" nil ))))) )) ;; Q: How does one do dired-open on Windows? ;; Emacs 22 already had dired-toggle-read-only, but it was called ;; wdired-change-to-wdired-mode ;; We override C-x C-q. Its previous binding in emacs 22 is ;; toggle-read-only. ;; This makes it possible to rename files by editting the dired buffer. (when (= emacs-major-version 22) (require 'dired) (define-key dired-mode-map "\C-x\C-q" 'wdired-change-to-wdired-mode) ) ;;________________________________________________________________ ;; CVS ;;________________________________________________________________ (setenv "CVS_RSH" "ssh") ;;________________________________________________________________ ;; Latex ;;________________________________________________________________ ;; Notice that MacTeX installs to /usr/local/texlive. ;; 'port install texlive' would be in /opt/local/* ;; Avoid having a duplicate tex installation. (cond (on_darwin (setenv "TEXINPUTS" ".:/usr/local/texlive/2011/texmf-dist/tex//:" "$HOME/ghaliweekly/latex/styles//") )) ;; If I return to installing LaTeX via MacPorts, reset to: ;; (setenv "TEXINPUTS" ".:/opt/local/share/texmf-dist/tex//") ;;________________________________________________________________ ;; Path ;;________________________________________________________________ (cond (on_darwin (setenv "PATH" (concat ".:/usr/local/Trolltech/Qt-4.8.0/bin:" "/usr/texbin:" "/opt/local/bin:" "/opt/local/sbin:" "$HOME/ghali/bin/scripts:" "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:" "/usr/local/texlive/2011/bin/universal-darwin/")) (setenv "DYLD_LIBRARY_PATH" "/usr/local/glow/glow_src/:/usr/local/ipe/build/lib/") (setenv "PKG_CONFIG_PATH" "/usr/local/Trolltech/Qt-4.8.0/lib/pkgconfig") )) (cond (on_windows_nt (setenv "INCLUDE" (concat "C:/Program Files/Microsoft Visual Studio 9.0/VC/ATLMFC/INCLUDE;" "C:/Program Files/Microsoft Visual Studio 9.0/VC/INCLUDE;" "C:/Program Files//Microsoft SDKs/Windows/v6.0A/include")) ;; ;C:/Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1/include/ (setenv "LIB" (concat "C:/Program Files/Microsoft Visual Studio 9.0/VC/ATLMFC/LIB;" "C:/Program Files/Microsoft Visual Studio 9.0/VC/LIB;" "C:/Program Files//Microsoft SDKs/Windows/v6.0A/lib")) ;; ;C:/Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1/Lib/ (setenv "LIBPATH" (concat "C:/WINNT/Microsoft.NET/Framework/v3.5;C:/WINNT/Microsoft.NET/Framework/v2.0.50727;" "C:/Program Files/Microsoft Visual Studio 9.0/VC/ATLMFC/LIB;" "C:/Program Files/Microsoft Visual Studio 9.0/VC/LIB")) ;; (setenv "PATH" "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin/") (setenv "PATH" (concat "C:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE;" "C:/Program Files/Microsoft Visual Studio 9.0/VC/BIN;" "C:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools;" "C:/WINNT/Microsoft.NET/Framework/v3.5;" "C:/WINNT/Microsoft.NET/Framework/v2.0.50727;" "C:/Program Files/Microsoft Visual Studio 9.0/VC/VCPackages;" "C:/Program Files//Microsoft SDKs/Windows/v6.0A/bin;" "C:/Qt/4.7.1/bin;C:/WINNT/system32;C:/WINNT;C:/WINNT/system32/WBEM;" "C:/Program Files/Common Files/OTG;C:/cygwin17/bin")) )) (cond (on_gnu_linux (setenv "PATH" (concat "/usr/kerberos/bin:" "/usr/local/bin:" "/bin:" "/usr/bin:" "/apps/home/ghali/bin:" "/usr/local/Trolltech/Qt-4.7.1/bin:" ".")) )) (cond (on_solaris (setenv "PATH" (concat "/usr/bin:" "/usr/ccs/bin:" "/usr/local/bin:" "/usr/sfw/bin:" ".")) (setenv "LD_LIBRARY_PATH" (concat "/home/ghali/boost_1_45_0/stage/lib:" "/home/ghali/qt/lib:" ".")) )) ;;________________________________________________________________ ;; eshell path ;;________________________________________________________________ (cond (on_windows_nt (add-hook 'eshell-mode-hook '(lambda nil (eshell/export "EPOCROOT=\\Paragon\\") (let ((path)) (setq path (concat "C:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE" ";C:/Program Files/Microsoft Visual Studio 9.0/VC/bin" ";C:/Program Files/Microsoft Visual Studio 9.0/VC/BIN" ";C:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools" ";C:/WINNT/Microsoft.NET/Framework/v3.5" ";C:/WINNT/Microsoft.NET/Framework/v2.0.50727" ";C:/Program Files/Microsoft Visual Studio 9.0/VC/VCPackages" ";C:/Program Files//Microsoft SDKs/Windows/v6.0A/bin" ";C:/Qt/4.7.1/bin" ";C:/WINNT/system32" ";C:/WINNT" ";C:/WINNT/system32/WBEM" ";C:/Program Files/Common Files/OTG" ";C:/cygwin17/bin")) (setenv "PATH" path)) (local-set-key "\C-u" 'eshell-kill-input)) ) )) (cond (on_darwin (add-hook 'eshell-mode-hook '(lambda nil (eshell/export "EPOCROOT=\\Paragon\\") (let ((path)) (setq path (concat "/Users/me/.rvm/bin/rvm" ";/Users/me/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/bin" ";/opt/local/bin" )) (setenv "PATH" path)) (local-set-key "\C-u" 'eshell-kill-input)) ) )) ;;________________________________________________________________ ;; Qt & Visual Studio ;;________________________________________________________________ (cond (on_windows_nt (setenv "QTDIR" "C:\Qt\4.7.1") (setenv "QMAKESPEC" "win32-msvc2008") )) ;; Setting QMAKESPEC avoids: ;; Warning: Generator: MSVC.NET: Found more than one version of ;; Visual Studio, but none in your path! Fallback to lowest ;; version (MSVC.NET 2008 (9.0), MSVC.NET 2003 (7.1)) ;;________________________________________________________________ ;; pgp/gnupg encrypt ;;________________________________________________________________ ;; file extension: .cpt (if on_gnu_linux () (require 'ps-ccrypt "ps-ccrypt.el") ) ;;________________________________________________________________ ;; Change window title ;;________________________________________________________________ (setq frame-title-format (list "" "%b" ;; " of " ;; `default-directory " @ " system-name " (" system-type-as-string ")" )) ;;________________________________________________________________ ;; Do not publish my email on Usenet ;;________________________________________________________________ (setq user-full-name "Sherif Ghali") ;; (setq user-login-name "myLastname") ;; (setq user-real-login-name "myLastname") ;; (setq user-mail-address "myName@somewhere") ;; (setq system-name "machine.somewhere") ;;________________________________________________________________ ;; Don't display initial logo ;;________________________________________________________________ (setq inhibit-startup-message t) ;;________________________________________________________________ ;; SVN ;;________________________________________________________________ ;; The executable is Cygwin's, but we can use it on bare windows. (cond (on_windows_nt (require 'psvn) (setq svn-status-svn-executable "C:/cygwin17/bin/svn.exe") )) ;; svn issues a warning ("cannot set LC_CTYPE locale") if LANG is not set. (setenv "LANG" "C") ;;________________________________________________________________ ;; diff ;;________________________________________________________________ ;; Even though C:/cygwin17/bin is in the PATH, we need to specify the ;; complete path here; It is not enough to call "diff.exe". ;; ;; Alternatively, add Cygwin17/bin to the windows-wide path ;; (Control Panel \ System \ Advanced) (cond (on_windows_nt (setq ediff-diff-program "C:/cygwin17/bin/diff.exe") )) ;;________________________________________________________________ ;; Ask Cygwin to accept the windows directory separator quietly ;;________________________________________________________________ ;; If we don't, emacs's ediff will be confused by the message ;; cygwin warning: ;; MS-DOS style path detected: C:\\Documents and Settings\\ghali\\... ;; Preferred POSIX equivalent is: /cygdrive/c/Documents and Settings/ghali/... ;; CYGWIN environment variable option "nodosfilewarning" turns off this warning. ;; Consult the user's guide for more details about POSIX paths: ;; http://cygwin.com/cygwin-ug-net/using.html#using-pathnames (cond (on_windows_nt (setenv "CYGWIN" "nodosfilewarning") )) ;;________________________________________________________________ ;; scroll-left is disabled by default; enable it. ;;________________________________________________________________ (put 'scroll-left 'disabled nil) (put 'set-goal-column 'disabled nil) ;;________________________________________________________________ ;; Display long lines by truncating them ;;________________________________________________________________ (cond (on_windows_nt (set-default 'truncate-lines t) )) (cond (on_darwin (set-default 'truncate-lines nil) )) ;;________________________________________________________________ ;; Prevent compilation mode from truncating lines ;;________________________________________________________________ (defun my-compilation-mode-hook () (setq truncate-lines nil) (setq truncate-partial-width-windows nil)) (add-hook 'compilation-mode-hook 'my-compilation-mode-hook) ;;________________________________________________________________ ;; Mark user-written files (for subsequent searching) ;;________________________________________________________________ (defun mark-cpp-tex-files () "Mark C, C++, pro, and LaTeX files" (interactive) (dired-mark-files-regexp (concat "\\.h$\\|" "\\.c$\\|" "\\.fsh$\\|" "\\.vsh$\\|" "\\.C$\\|" "\\.hpp$\\|" "\\.ipp$\\|" "\\.cpp$\\|" "\\.pro$\\|" "\\.tex$"))) (add-hook 'dired-mode-hook '(lambda () (define-key dired-mode-map ";" 'mark-cpp-tex-files) )) ;;________________________________________________________________ ;; to do ;;________________________________________________________________ ;; Accidentally running '!' in dired-mode under windows-nt on a ;; directory crashes emacs. ;;________________________________________________________________ ;; Show matching parenthesis ;; show-paren-mode is both a function and a variable, but ;; "Setting this variable directly does not take effect; ;; either customize it (see the info node `Easy Customization')...or.." ;;________________________________________________________________ (show-paren-mode t) ;;________________________________________________________________ ;; Disable set-goal-column ;;________________________________________________________________ ;; No need for this brief acronym since I never use set-goal-column. (global-unset-key "\C-x\C-n") ;;________________________________________________________________ ;; Unlike emacs 22, emacs 23 uses a distant Alt-key. ;;________________________________________________________________ (cond (on_darwin (when (>= emacs-major-version 23) (setq mac-option-key-is-meta nil) (setq mac-command-key-is-meta t) (setq mac-command-modifier 'meta) (setq mac-option-modifier nil) ) )) ;;________________________________________________________________ ;; Highlighting - Enable hi lock globally ;;________________________________________________________________ ;; Highlight entire line (use when needed). ;;(global-hl-line-mode 0) ;; hi lock is only available since Emacs 22. (when (>= emacs-major-version 22) (global-hi-lock-mode 1) (setq hi-lock-file-patterns-policy t) ) ;;________________________________________________________________ ;; Testing whether auto-updating of dired buffers is convenient ;;________________________________________________________________ ;; (setq dired-auto-revert-buffer t) ;; This is a bad idea. It makes deeply recursive directories unusable. ;;________________________________________________________________ ;; Emacs 23 cuts off M-` from OS X. Handle within emacs. ;;________________________________________________________________ (global-set-key (kbd "M-§") 'other-frame) ;;________________________________________________________________ ;; Scroll lock still needs improvement. ;;________________________________________________________________ ;; (setq scroll-all-mode 't) ;;________________________________________________________________ ;; hideshow; ;; On Windows: S-Mouse-2 hides/unhides initial comment block. ;; On Mac: M-x hs-toggle-hiding ;; `C-c @ C-c' Either hide or show the current block. ;;________________________________________________________________ (load-library "hideshow") (add-hook 'c++-mode-hook (lambda () (hs-minor-mode 1)) ) (add-hook 'c-mode-hook (lambda () (hs-minor-mode 1)) ) (add-hook 'makefile-mode-hook (lambda () (hs-minor-mode 1)) ) (add-hook 'css-mode-hook (lambda () (hs-minor-mode 1)) ) (setq hs-minor-mode-hook 'hs-hide-initial-comment-block) (global-set-key [M-f8] 'hs-toggle-hiding) ;;________________________________________________________________ ;; uniquify -- though using <1>, <2> also has its advantages. ;;________________________________________________________________ (require 'uniquify) (setq uniquify-buffer-name-style 'reverse) ;;________________________________________________________________ ;; hi-lock mini-manual ;;________________________________________________________________ ;; `C-x w h REGEXP <RET> FACE <RET>' highlight-regexp ;; `C-x w r REGEXP <RET>' unhighlight-regexp ;; `C-x w l REGEXP <RET> FACE <RET>' highlight-lines-matching-regexp ;; `C-x w b' hi-lock-write-interactive-patterns ;; `C-x w i' hi-lock-find-patterns ;; C-x w b: hi-lock-write-interactive-patterns ;; C-x w i: hi-lock-find-patterns ;;________________________________________________________________ ;; Handle files with mixed UNIX and DOS line endings. ;;________________________________________________________________ (defun remove-dos-eol () "Do not use '^M' in files containing mixed UNIX and DOS line endings." (interactive) (setq buffer-display-table (make-display-table)) (aset buffer-display-table ?\^M [])) ;;________________________________________________________________ ;; Holidays ;;________________________________________________________________ ;; We need to test whether we are running emacs 23 because ;; holiday-other-holidays used to be called other-holidays. (when (>= emacs-major-version 23) (setq holiday-local-holidays '( (holiday-float 10 1 2 "Canadian Thanksgiving") ; second Monday in October )) (setq holiday-other-holidays nil) ) ;;________________________________________________________________ ;; Entering French accents ;;________________________________________________________________ ;; C-x <RET> C-\ -- set-input-method (press space to see; ;; french-prefix is convenient on a qwerty keyboard) ;; C-\ -- toggle-input-method ;; C-\ -- french-prefix ;;________________________________________________________________ ;; Long lines ;;________________________________________________________________ ;; Consider making longlines-mode the default for text files. ;; longlines-auto-wrap ;;________________________________________________________________ ;; C/C++ Indentation ;;________________________________________________________________ ;; C-c . <RET> STYLE <RET> ("C-c ." is c-set-style) ;; Possible styles: ;; awk bsd cc-mode ellemtel gnu java k&r linux python stroustrup user whitesmith (require 'cc-mode) (setq c-basic-offset 4) ; Amount of basic offset used by + and - symbols in `c-offsets-alist' (setq c-comment-only-line-offset 0) ; Extra offset for line which contains only the start of a comment (setq indent-tabs-mode nil) ; Indentation can insert tabs if this is non-nil (setq-default indent-tabs-mode nil) (c-set-offset 'substatement-open 0) ; The brace that opens a substatement block (c-set-offset 'brace-list-open 0) ; Open brace of an enum or static array list (c-set-offset 'namespace-open 0) (c-set-offset 'namespace-close 0) (c-set-offset 'innamespace 0) ;; May also need: ;; (c-set-offset 'inline-open 0) ;; (c-set-offset 'case-label +)) ;; Remember to use ;; `M-a' (`c-beginning-of-statement') ;; `M-e' (`c-end-of-statement') ;; `C-M-a' (`c-beginning-of-defun') ;; `C-M-e' (`c-end-of-defun') ;; rather than just ;; M-{ backward-paragraph ;; M-} forward-paragraph ;; Also useful is to remember that ;; `C-c C-w' (c-subword-mode) toggles subword mode on and off. ;; The meaning of the following keys then changes: ;; `M-f' `forward-word' `c-forward-subword' ;; `M-b' `backward-word' `c-backward-subword' ;; c-subword-mode is buffer local. ;; as well as: ;; `C-c C-<DEL>', or `C-c <DEL>' (`c-hungry-delete-backwards')(2) ;; Delete any amount of whitespace in the backwards direction ;; ;; `C-c C-d', `C-c C-<DELETE>', or `C-c <DELETE>' (`c-hungry-delete-forward') ;; Delete any amount of whitespace in the forward direction ;;________________________________________________________________ ;; SGML mode (do I still need this?) ;;________________________________________________________________ (setq sgml-basic-offset 4) ;;________________________________________________________________ ;; TeX preview ;;________________________________________________________________ (autoload 'tex-math-preview "tex-math-preview" nil t) (add-hook 'texinfo-mode-hook (lambda () (define-key texinfo-mode-map [f10] 'tex-math-preview))) ;;________________________________ (set-frame-parameter (selected-frame) 'alpha 100) ;;________________________________________________________________ ;; The server waits for emacsclient (launched from git, ipe, ...) ;;________________________________________________________________ (server-start) ;; Press C-x # when done. ;;________________________________________________________________ ;; Indent html by 4 ;;________________________________________________________________ (setq sgml-basic-offset 4) ;;________________________________________________________________ ;; Choose interactively from the kill ring. ;;________________________________________________________________ (require 'browse-kill-ring) (global-set-key (kbd "C-c C-k") 'browse-kill-ring) ;;________________________________________________________________ ;; Confirm css is an adequate mode for qml files. ;;________________________________________________________________ (setq auto-mode-alist (cons '("\\.qml\\'" . css-mode) auto-mode-alist)) ;;________________________________________________________________ ;; Selective auto-fill ;;________________________________________________________________ (defun selective-auto-fill-disabling-hook () "Check to see if we should disable autofill." (save-excursion (when (re-search-forward "DoNotAutoFillThisFile" 1000 t) (auto-fill-mode -1)))) (add-hook 'find-file-hooks 'selective-auto-fill-disabling-hook) ;;________________________________________________________________ ;; unfill paragraphs and regions ;;________________________________________________________________ ;; Source: ;; http://xahlee.org/emacs/emacs_unfill-paragraph.html (defun unfill-paragraph () "Replace newline chars in current paragraph by single spaces. This command does the reverse of `fill-paragraph'." (interactive) (let ((fill-column 90002000)) (fill-paragraph nil))) (defun unfill-region (start end) "Replace newline chars in region by single spaces. This command does the reverse of `fill-region'." (interactive "r") (let ((fill-column 90002000)) (fill-region start end))) ;;________________________________________________________________ ;;________________________________________________________________ ;;________________________________________________________________ ;;________________________________________________________________