]> git.rkrishnan.org Git - .emacs.d.git/blob - init.el
use git submodules to manage extensions. WIP
[.emacs.d.git] / init.el
1 (setq load-path (cons "~/.emacs.d/emacs" load-path))
2
3 ;; color themes
4 (add-to-list 'custom-theme-load-path "~/.emacs.d/themes")
5 (load-theme 'zenburn t)
6
7 (require 'package)
8 (package-initialize)
9
10 (load "my-c-mode.el")
11 (load "my-generic-stuff.el")
12 (load "my-search.el")
13 (load "my-erc.el")
14 (load "my-org-mode.el")
15 (load "my-slime.el")
16 (load "my-twitter.el")
17 (load "my-python.el")
18
19 ;; setup font
20 (if (>= emacs-major-version 23)
21     (setq default-frame-alist '((font . "Inconsolata-12")))
22   (set-default-font
23    "-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO8859-1"))
24
25 (setq-default indent-tabs-mode nil)
26 (add-hook 'emacs-lisp-mode-hook
27           (lambda () (which-function-mode t)))
28
29 ;; iswitch
30 (iswitchb-mode 1)
31
32 ;; smooth scroll
33 (setq scroll-conservatively 1)
34 (put 'upcase-region 'disabled nil)
35 (put 'downcase-region 'disabled nil)
36
37 ;; cscope
38 (require 'xcscope)
39
40 (defun match-paren (arg)
41   "Go to the matching paren if on a paren; otherwise insert %."
42   (interactive "p")
43   (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
44         ((looking-at "\\s\)") (forward-char 1) (backward-list 1))
45         (t (self-insert-command (or arg 1)))))
46
47 ;; emacs window size according to screen resolution
48 ;; from stackoverflow.com
49 ;;  - <http://stackoverflow.com/questions/92971/how-do-i-set-the-size-of-emacs-window>
50 (defun set-frame-size-according-to-resolution ()
51   (interactive)
52   (if window-system
53       (progn
54         ;; use 120 char wide window for largeish displays
55         ;; and smaller 80 column windows for smaller displays
56         ;; pick whatever numbers make sense for you
57         (if (> (x-display-pixel-width) 1280)
58             (add-to-list 'default-frame-alist (cons 'width 80))
59           (add-to-list 'default-frame-alist (cons 'width 78)))
60         ;; for the height, subtract a couple hundred pixels
61         ;; from the screen height (for panels, menubars and
62         ;; whatnot), then divide by the height of a char to
63         ;; get the height we want
64         (add-to-list 'default-frame-alist
65                      (cons 'height (/ (- (x-display-pixel-height) 0) (frame-char-height)))))))
66
67 (set-frame-size-according-to-resolution)
68
69 ;; tramp
70 (require 'tramp)
71  (setq tramp-default-method "ssh")
72
73 ;; cut and paste with the rest of ecosystem in X
74 (setq x-select-enable-clipboard t)
75
76 ;; remove toolbar
77 (if (> emacs-major-version 20)
78     (tool-bar-mode -1))
79
80 ;; clojure mode
81 (add-to-list 'load-path "~/.emacs.d/vendor/clojure-mode")
82 (require 'clojure-mode)
83
84 ;; highlight parentheses mode
85 (require 'highlight-parentheses)
86
87 ;; rainbow effect
88 ;; http://stackoverflow.com/questions/2413047/how-do-i-get-rainbow-parentheses-in-emacs
89 ;; (setq hl-paren-colors
90 ;;       '(;"#8f8f8f" ; this comes from Zenburn
91 ;;                    ; and I guess I'll try to make the far-outer parens look like this
92 ;;         "orange1" "yellow1" "greenyellow" "green1"
93 ;;         "springgreen1" "cyan1" "slateblue1" "magenta1" "purple"))
94
95 ;; paredit
96 (autoload 'paredit-mode "paredit"
97   "Minor mode for pseudo-structurally editing Lisp code." t)
98
99 (dolist (hook '(emacs-lisp-mode-hook
100                 lisp-mode-hook
101                 lisp-interaction-mode-hook
102                 clojure-mode-hook
103                 scheme-mode-hook))
104   (add-hook hook #'(lambda ()
105                      (highlight-parentheses-mode t)
106                      (paredit-mode +1))))
107 ;; clojure-test-mode
108 (autoload 'clojure-test-mode "clojure-test-mode" "Clojure test mode" t)
109 (autoload 'clojure-test-maybe-enable "clojure-test-mode" "" t)
110 (add-hook 'clojure-mode-hook 'clojure-test-maybe-enable)
111
112 ;; flyspell
113 (autoload 'flyspell-mode "flyspell" "On-the-fly spelling checker." t)
114
115 ;;; fullscreen mode
116 (defun switch-full-screen ()
117   (interactive)
118   (shell-command "wmctrl -r :ACTIVE: -btoggle,fullscreen"))
119
120 (global-set-key [f10] 'switch-full-screen)
121
122 ;; gist integration
123 (require 'gist)
124
125 ;; browse url
126 (setq browse-url-browser-function 'browse-url-generic
127       browse-url-generic-program "/usr/bin/iceweasel"
128       browse-url-new-window-flag  t
129       browse-url-firefox-new-window-is-tab t)
130 (define-key global-map "\C-co" 'browse-url-at-point)
131
132 ;; nxml for editing xml files
133 (setq auto-mode-alist
134       (cons '("\\.\\(xml\\|xsl\\|rng\\|xhtml\\)\\'" . nxml-mode)
135             auto-mode-alist))
136
137 ;; completions enhancements
138 (icomplete-mode t)
139
140 ;; Interactively Do Things mode
141 (require 'ido)
142
143 (ido-mode t)
144 (setq ido-enable-flex-matching t)
145 (setq ido-enable-last-directory-history nil)
146
147 ;; browse kill ring
148 (when (require 'browse-kill-ring nil 'noerror)
149   (browse-kill-ring-default-keybindings))
150
151 ;; rainbox mode for CSS color highlighting
152 (require 'rainbow-mode)
153
154 (add-to-list 'auto-mode-alist '("\\.rkt$" . scheme-mode))
155
156 ;; scheme auto complete
157 (require 'scheme-complete)
158 (autoload 'scheme-smart-complete "scheme-complete" nil t)
159 (eval-after-load 'scheme
160   '(progn (define-key scheme-mode-map "\t" 'scheme-complete-or-indent)))
161
162 ;; autocomplete
163 (add-to-list 'load-path "~/.emacs.d/vendor/popup/")
164 (add-to-list 'load-path "~/.emacs.d/vendor/auto-complete/")
165 (require 'auto-complete)
166
167 (set-default 'ac-sources
168              '(ac-source-abbrev
169                ac-source-dictionary
170                ac-source-yasnippet
171                ac-source-words-in-buffer
172                ac-source-words-in-same-mode-buffers
173                ac-source-semantic))
174
175 (dolist (m '(c-mode c++-mode java-mode))
176   (add-to-list 'ac-modes m))
177
178 (global-auto-complete-mode t)
179
180 ;; slime autocomplete
181 (add-to-list 'load-path "~/.emacs.d/vendor/ac-slime/")
182
183 (require 'ac-slime)
184 (set-default 'ac-sources 'ac-source-slime-simple)
185 (add-hook 'slime-mode-hook 'set-up-slime-ac)
186 (add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
187
188 ;; scheme/quack
189 ;(require 'quack)
190 ;(setq scheme-program-name "racket")
191 ;(setq quack-default-program "racket -il racket/base")
192 ;(setq quack-switch-to-scheme-method 'other-window)
193 ;(setq quack-newline-behavior 'indent-newline-indent)
194
195 (defun racket-enter! ()
196   (interactive)
197   (comint-send-string (scheme-proc)
198         (format "(enter! (file \"%s\") #:verbose)\n" buffer-file-name))
199   (switch-to-scheme t))
200 (local-set-key "\C-c\C-v" 'racket-enter!)
201
202 ;; company-mode
203 (add-to-list 'load-path "~/.emacs.d/vendor/company-mode")
204 (autoload 'company-mode "company" nil t)
205
206 ;; handle trailing whitespaces
207 ;(add-hook 'before-save-hook 'delete-trailing-whitespace)
208
209 ;; update copyright years before saving.
210 ;(add-hook 'before-save-hook 'copyright-update)
211
212 ;; la carte mode (access menu from keyboard)
213 (require 'lacarte)
214
215 ;;; Based on code by Rudi Schlatte.
216 ;;; Needs this library:
217 ;;; http://www.emacswiki.org/cgi-bin/wiki/XmlRpc
218 (require 'xml-rpc)
219
220 (defvar lisppaste-nick "vu3rdd")
221 (defvar lisppaste-channel "None")
222 (defvar lisppaste-colorize-as "Scheme")
223 (defvar lisppaste-prev-title "")
224
225 (defun lisppaste-region (region-begin region-end
226                                       &optional channel username title annotate)
227   (interactive "r")
228   (let* ((content (buffer-substring region-begin region-end))
229          (channel (or channel
230                       (read-from-minibuffer "Channel: " lisppaste-channel)))
231          (username (or username (read-from-minibuffer "Nick: " lisppaste-nick)))
232          (title (or title (read-from-minibuffer "Title: " lisppaste-prev-title)))
233          (annotate (or annotate (string-to-number (read-from-minibuffer "Annotate? "))))
234          (colorize-as (if (zerop annotate) (read-from-minibuffer "Colorize as (empty for default): " lisppaste-colorize-as))))
235     (setf lisppaste-prev-title title)
236     (let* ((ret (xml-rpc-method-call "http://common-lisp.net:8185/RPC2" 'newpaste
237                                      channel username title content (or colorize-as annotate)))
238            (url-beg (search "http://" ret))
239            (url-end (and url-beg (search " " ret :start2 url-beg)))
240            (url (and url-end (substring ret url-beg url-end))))
241       (print ret)
242       (and url (browse-url url))
243       (or url ret))))
244
245 ;;; displays "\" at the end of lines that wrap
246 (setq longlines-show-hard-newlines t)
247
248 ;;; haskell mode
249 (setq auto-mode-alist
250       (append auto-mode-alist
251               '(("\\.[hg]s$"  . haskell-mode)
252                 ("\\.hic?$"   . haskell-mode)
253                 ("\\.hsc$"    . haskell-mode)
254                 ("\\.chs$"    . haskell-mode)
255                 ("\\.l[hg]s$" . literate-haskell-mode))))
256 (autoload 'haskell-mode "haskell-mode"
257   "Major mode for editing Haskell scripts." t)
258 (autoload 'literate-haskell-mode "haskell-mode"
259   "Major mode for editing literate Haskell scripts." t)
260
261 ;adding the following lines according to which modules you want to use:
262 (require 'inf-haskell)
263
264 (add-hook 'haskell-mode-hook 'turn-on-font-lock)
265 (add-hook 'haskell-mode-hook 'turn-on-haskell-ghci)
266 (add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
267 (add-hook 'haskell-mode-hook 'turn-on-haskell-indent)
268 (set-variable 'haskell-program-name "ghci")
269
270 ;; javascript mode
271 (autoload 'js2-mode "js2-mode" nil t)
272 (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))
273
274 ;; swank-js
275 (add-to-list 'load-path "~/src/swank-js/")
276 (require 'slime-js)
277
278 ;; geiser for Scheme programming
279 ;(load-file "~/src/geiser/elisp/geiser.el")
280
281 ;; geiser racket
282 ;(setq geiser-guile-binary "racket")
283 ;(setq geiser-active-implementations '(racket))
284
285 ;; flymake
286 (require 'flymake)
287 (defun flymake-racket-init ()
288   (let* ((temp-file (flymake-init-create-temp-buffer-copy
289                      'flymake-create-temp-inplace))
290          (local-file (file-relative-name
291                       temp-file
292                       (file-name-directory buffer-file-name))))
293     (list "racket" (list "-qf" local-file))))
294
295 (push '("\\.rkt\\'" flymake-racket-init)
296       flymake-allowed-file-name-masks)
297
298
299 ;; ghc-mod
300 (autoload 'ghc-init "ghc" nil t)
301 (add-hook 'haskell-mode-hook
302           (lambda ()
303             (ghc-init)
304             (require 'auto-complete-config)
305             (auto-complete-mode t)
306             (add-to-list 'ac-sources 'ac-source-ghc-mod)))
307 ;; haskell-mode hooks
308 (add-hook 'haskell-mode-hook 'capitalized-words-mode)
309 (add-hook 'haskell-mode-hook 'turn-on-haskell-decl-scan)
310
311 ;; sml
312 (autoload 'sml-mode "sml-mode" "Major mode for editing SML." t)
313 (autoload 'run-sml "sml-proc" "Run an inferior SML process." t)
314
315 ;; notmuch for email/searching
316 (require 'notmuch)
317 (require 'gnus-art)
318
319 ;; sending email
320 (setq message-send-mail-function 'message-send-mail-with-sendmail
321       mail-specify-envelope-from t      ; Settings to work with msmtp
322       message-sendmail-f-is-evil nil  
323       mail-envelope-from 'header
324       message-sendmail-envelope-from 'header
325       sendmail-program "/usr/bin/msmtp"
326       user-full-name "Ramakrishnan Muthukrishnan")
327
328 (setq message-kill-buffer-on-exit t) ; kill buffer after sending mail)
329
330 (setq notmuch-fcc-dirs "Gmail/Sent") ; stores sent mail to the specified directory
331 (setq message-directory "Gmail/Drafts") ; stores postponed messages to the specified directory
332