;; Elisp source code header -*- coding: utf-8 -*-
;; Created: [21-00:48 Март 13 2008]
;; Modified: [23-43:48 Май 31 2008]
;; Description:
;;   General features, aka: Fancy looking, cleaning some ambiguous stuff,
;;   some very useful helpers
;;   Modes: color-theme, tabbar, iswithcb, emms, org-mode, tar-mode,
;;          buff-menu+, stripes, sr-speedbar, ispell, flyspell, dired,
;;          cua-mode, rst-mode
;; Author: Stanislav M. Ivankin
;; Email: stas@concat.info
;; Tags: 
;; License: 

(fset 'yes-or-no-p 'y-or-n-p)

(put 'narrow-to-region 'disabled nil)

(transient-mark-mode 1)
;; Try C-Enter :)
(cua-selection-mode 1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(tool-bar-mode 0)

(setq frame-title-format "esgal@eternal")

(custom-set-variables
 '(display-time-24hr-format t)
 '(display-time-format "[%H:%M %d/%m]")
 '(line-number-mode t)
 '(column-number-mode t)
 '(display-battery-mode t)
 '(display-time-mode t)
 '(size-indication-mode t)
 '(display-time-load-average t)
 '(display-time-day-and-date t)
 '(timeclock-modeline-display t)
 '(inhibit-startup-message t))

;; Customization of frame parameters
(setq default-frame-alist
      '((vertical-scroll-bars)
        (menu-bar-lines . 1)
        (background-color . "white")
        (background-mode . light)
        (background-toolbar-color . "#cf3ccf3ccf3c")
        (border-color . "#000000000000")
        (bottom-toolbar-shadow-color . "#79e77df779e7")
        (cursor-color . "Red3")
        (foreground-color . "black")
        (mouse-color . "black")
        (top-toolbar-shadow-color . "#fffffbeeffff")
        (viper-saved-cursor-color-in-replace-mode . "Red3")
        (tool-bar-lines . 0)
        (font . "DejaVu Sans Mono-10")))

;; Change a bit mouse scrolling
(setq mouse-wheel-scroll-amount '(1 ((shift) . 5) ((control))))

;; show/hide menu-bar
(global-set-key (kbd "C-c o") '(lambda ()
                                 (interactive)
                                 (menu-bar-mode)))

(defun set-my-faces ()
  (custom-set-faces
   '(font-lock-function-name-face ((t (:foreground "MediumSlateBlue" :bold t :underline t))))
   '(font-lock-comment-face ((t (:foreground "#777777" :bold nil :italic t))))
   '(flyspell-incorrect ((t (:underline t :weight normal))))
   '(jabber-roster-user-away ((t (:foreground "green"))))
  ))

(when (eq window-system 'x)
  (require 'color-theme)
  (color-theme-initialize)
  (color-theme-blippblopp)
  (color-theme-blue-eshell)
  (color-theme-dark-gnus)
  (set-my-faces)
  (require 'tabbar)
  (tabbar-mode)
  (global-set-key [(s up)]    'tabbar-backward-group)
  (global-set-key [(s down)]  'tabbar-forward-group)
  (global-set-key [(s left)]  'tabbar-backward)
  (global-set-key [(s right)] 'tabbar-forward)
  (setq x-select-enable-clipboard t)
  (if (and (> emacs-major-version 22) (>= +emacs-build-version+ 60))
      (progn
        (set-default-font "DejaVu Sans Mono-10")
        (set-fontset-font "fontset-default"
                          'cyrillic '("DejaVu Sans Mono" . "unicode-bmp")))
    (set-default-font "9x15")))

(require 'iswitchb)
(iswitchb-mode 1)
(add-to-list 'iswitchb-buffer-ignore "*Messages*")
(add-to-list 'iswitchb-buffer-ignore "*Backtrace")
(add-to-list 'iswitchb-buffer-ignore "*Completions")
(add-to-list 'iswitchb-buffer-ignore "*Possible Completions")
(add-to-list 'iswitchb-buffer-ignore "*semantic")
(add-to-list 'iswitchb-buffer-ignore "*compilation")


(global-set-key (kbd "s-m") 'emms)
(autoload 'emms "emms-setup" t)

(defun tv-stop-mpd ()
  (interactive)
  (if emms-player-playing-p
      (emms-stop)
    (shell-command "mpc stop")))

(eval-after-load "emms-setup"
  '(progn
     (message "-> emms loaded")
;;;  (emms-standard)
     (emms-devel)
     (emms-default-players)
     (require 'emms-mode-line)
     (require 'emms-playing-time)
     (emms-mode-line 1)
     (emms-playing-time 1)
     (require 'emms-player-simple)
     (require 'emms-source-file)
     (require 'emms-source-playlist)
     (require 'emms-streams)
     (require 'emms-info)
;;     (add-to-list 'emms-player-list 'emms-player-mpd)
;;     (add-to-list 'emms-info-functions 'emms-info-mpd)
;;     (setq emms-player-mpd-server-name "localhost"
;;         emms-player-mpd-server-port "6600"
;;         emms-player-mpd-music-directory "/var/lib/mpd/music")
     (add-hook 'emms-player-started-hook 'emms-show)
     (setq emms-mode-line-titlebar-function 'emms-mode-line-playlist-current
           emms-volume-amixer-control "PCM"
           emms-show-format "NP: %s"
           emms-score-file "~/.emacs.d/emms-score"
           emms-history-file "~/.emacs.d/emms-history"
           emms-cache-file "~/.emacs.d/emms-cache"
           emms-stream-bookmarks-file "~/emms-bookmarks"
           emms-stream-default-action "play")
;;         emms-source-file-default-directory "/var/lib/mpd/music/")
     (setq emms-lastfm-username "user"
           emms-lastfm-password "password")
     (emms-lastfm-enable)))

;;;; Org mode ;;;;
(require 'org)

(add-hook 'org-mode-hook #'(lambda ()
                                (auto-fill-mode 1)))

(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ca" 'org-agenda)

(setq orgplace "~/emacs/etc/orgmode/")
(setq org-log-done '(done))

(add-hook 'remember-mode-hook 'org-remember-apply-template)

(custom-set-variables
 '(org-agenda-files (list "~/emacs/etc/orgmode/devel.org"
                          "~/emacs/etc/orgmode/dates.org"
                          "~/emacs/etc/orgmode/health.org"
                          "~/emacs/etc/orgmode/purchases.org"))
 '(org-default-notes-file "~/emacs/etc/orgmode/notes.org")
 '(org-agenda-ndays 7)
 '(org-deadline-warning-days 14)
 '(org-agenda-show-all-dates t)
 '(org-agenda-skip-deadline-if-done t)
 '(org-agenda-skip-scheduled-if-done t)
 '(org-agenda-start-on-weekday nil)
 '(org-reverse-note-order t)
 '(org-fast-tag-selection-single-key (quote expert))
 '(org-remember-store-without-prompt t)
 '(org-remember-templates
   (quote ((116 "* TODO %?\n  %u" "~/emacs/etc/orgmode/todo.org" "Tasks")
           (110 "* %u %?" "~/emacs/etc/orgmode/notes.org" "Notes"))))
 '(remember-annotation-functions (quote (org-remember-annotation)))
 '(remember-handler-functions (quote (org-remember-handler))))

(setq org-agenda-custom-commands
      '(("h" "Home related tasks"
         ((tags-todo "@HOME")))
        ("w" "Work related tasks"
         ((tags-todo "@WORK")))))


;;;; Storing tmpfiles ;;;;

(defvar tmp-autosave-dir "~/emacs/tmp/autosave/")

(defun auto-save-file-name-p (filename)
  (string-match "^#.*#$" (file-name-nondirectory filename)))

(defun make-auto-save-file-name ()
  (concat tmp-autosave-dir
          (if buffer-file-name
              (concat "#" (file-name-nondirectory buffer-file-name) "#")
            (expand-file-name
             (concat "#%" (buffer-name) "#")))))

(defvar backup-dir "~/emacs/tmp/backup/")
(setq backup-directory-alist (list (cons "." backup-dir)))

;;;; Info ;;;;

(setq Info-fontify "t")

;;;; Small features ;;;;

(global-set-key [f9] 'term)
;;(custom-set-variables
;; '(term-default-fg-color "white")
;; '(term-default-bg-color "black"))

(require 'tar-mode)

;; buff-menu+
;; ~/elisp/buff-menu+.el
(require 'buff-menu+)
(global-set-key (kbd "C-x C-b") 'buffer-menu)

;; Tex/Latex stuff
(add-hook 'reftex-load-hook 'imenu-add-menubar-index)
(add-hook 'reftex-mode-hook 'imenu-add-menubar-index)

;; Stripes are horizontal lines with different color
(require 'stripes)

;; WithOut man
(setq woman-use-own-frame nil)

;; sr-speedbars
(require 'sr-speedbar)
(global-set-key (kbd "s-s") 'sr-speedbar-toggle)

;; ispell
(require 'ispell)
(require 'flyspell)

(setq ispell-program-name "aspell"
      ispell-extra-args '("--sug-mode=ultra")
      ispell-enable-tex-parser t)

(setq flyspell-default-dictionary "english"
      flyspell-delay '1
      flyspell-issue-message-flag nil)

(dolist (hook '(text-mode-hook lj-compose-mode))
  (add-hook hook (lambda () (flyspell-mode 1))))
(dolist (hook '(change-log-mode-hook log-edit-mode-hook))
  (add-hook hook (lambda () (flyspell-mode -1))))

;; Dired
;;;; Notes:
;; 1. wdired-change-to-wdired-mode, then rename files, simple and fast.
;; Oh, and if to use keyboard macroses {C-x ( ; C-x )}, it is really great! :) 
(require 'dired)

(put 'dired-find-alternate-file 'disabled nil)

(define-key dired-mode-map [return] 'dired-find-alternate-file)
(define-key dired-mode-map [(a)] 'dired-advertised-find-file)

(autoload 'thumbs "thumbs" "Preview images in a directory." t)

;; Restructured text, an easy to use and handfull util for editing simple text
(require 'rst)