#!/bin/sh -e

packages_to_install="zsh mosh emacs nmap sipcals"

__apt_update_index
for package in $package_to_install;
    do require="__apt_update_index" __package $package --state=present
done

__require="__package/emacs" \
__directory ~/.emacs.d

__require="__package/emacs __directory/~/.emacs.d" \
__file ~/.emacs.d/init.el \
--owner root \
--group root \
--mode 0644 \
--source - << EOF
;;; init.el --- GNU Emacs Configuration

;; Copyright (C) 2014 Terencio Agozzino

;; Author: Terencio Agozzino <terencio.agozzino@gmail.com>
;; Created: February 16, 2014
;; Homepage: https://github.com/rememberYou/.emacs.d
;; Keywords: abbrev, convenience, faces, maint, outlines, vc

;; This program is free software. You can redistribute it and/or modify it under
;; the terms of the Do What The Fuck You Want To Public License, version 2 as
;; published by Sam Hocevar.
;;
;; This program is distributed in the hope that it will be useful, but WITHOUT
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
;; FOR A PARTICULAR PURPOSE.
;;
;; You should have received a copy of the Do What The Fuck You Want To Public
;; License along with this program. If not, see http://www.wtfpl.net/.

;;; Commentary:

;; Following lines build the configuration code out of the config.el file.

;;; Code:

;; Make startup faster by reducing the frequency of garbage
;; collection.
(setq gc-cons-threshold (* 50 1000 1000))

(require 'package)
(package-initialize)

(if (file-exists-p (expand-file-name "00_global_config.el" user-emacs-directory))
    (load-file (expand-file-name "00_global_config.el" user-emacs-directory)))

(if (file-exists-p (expand-file-name "10_magit_config.el" user-emacs-directory))
    (load-file (expand-file-name "10_magit_config.el" user-emacs-directory)))

(if (file-exists-p (expand-file-name "20_mu4e_config.el" user-emacs-directory))
    (load-file (expand-file-name "20_mu4e_config.el" user-emacs-directory)))

(if (file-exists-p (expand-file-name "21_smtp_config.el" user-emacs-directory))
    (load-file (expand-file-name "21_smtp_config.el" user-emacs-directory)))

(if (file-exists-p (expand-file-name "30_agenda_config.el" user-emacs-directory))
    (load-file (expand-file-name "30_agenda_config.el" user-emacs-directory)))

(if (file-exists-p (expand-file-name "99_custom_config.el" user-emacs-directory))
    (load-file (expand-file-name "99_custom_config.el" user-emacs-directory)))

(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.
 '(org-agenda-files
   (quote
    ("~/ungleich-learning-circle/youngjin.han/todo-node02-2020.org" "~/ungleich-learning-circle/youngjin.han/learning-node02-2020.org")))
 '(package-selected-packages (quote (zenburn-theme magit)))
 '(xterm-mouse-mode t))
(custom-set-faces
 ;; custom-set-faces 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.
)

;; Make gc pauses faster by decreasing the threshold.
(setq gc-cons-threshold (* 2 1000 1000))

;;; init.el ends here
EOF

__require="__package/emacs __directory/~/.emacs.d __file/~/.emacs.d/init.el" \
__file ~/.emacs.d/00_global_config.el \
--owner root \
--group root \
--mode 0644 \
--source - << EOF
;; Added by Package.el.  This must come before configurations of
;; installed packages.  Don't delete this line.  If you don't want it,
;; just comment it out by adding a semicolon to the start of the line.
;; You may delete these explanatory comments.
(package-initialize)

;; load emacs 24's package system. Add MELPA repository.
(when (>= emacs-major-version 24)
  (require 'package)
  (add-to-list
   'package-archives
   ;; '("melpa" . "http://stable.melpa.org/packages/") ; many packages won't show if using stable
   '("melpa" . "http://melpa.milkbox.net/packages/")
   ;; '("org" . "http://orgmode.org/elpa/")
      t))

(setq auth-sources '("~/.authinfo.gpg"
                     "~/.authinfo"))

(setq-default
;; ad-redefinition-action 'accept                   ; Silence warnings for redefinition
;; cursor-in-non-selected-windows t                 ; Hide the cursor in inactive windows
;; display-time-default-load-average nil            ; Don't display load average
;; fill-column 80                                   ; Set width for automatic line breaks
 help-window-select t                             ; Focus new help windows when opened
 indent-tabs-mode nil                             ; Prefers spaces over tabs
 inhibit-startup-screen t                         ; Disable start-up screen
;; initial-scratch-message ""                       ; Empty the initial *scratch* buffer
;; kill-ring-max 128                                ; Maximum length of kill ring
;; load-prefer-newer t                              ; Prefers the newest version of a file
;; mark-ring-max 128                                ; Maximum length of mark ring
;; scroll-conservatively most-positive-fixnum       ; Always scroll by one line
;; select-enable-clipboard t                        ; Merge system's and Emacs' clipboard
 tab-width 4                                      ; Set width for tabs
;; use-package-always-ensure t                      ; Avoid the :ensure keyword for each package
;; user-full-name "Terencio Agozzino"               ; Set the full name of the current user
;; user-mail-address "terencio.agozzino@gmail.com"  ; Set the email address of the current user
 vc-follow-symlinks t                             ; Always follow the symlinks
;; view-read-only t                                 ; Always open read-only buffers in view-mode
) 
(cd "~/")                                         ; Move to the user directory
(column-number-mode 1)                            ; Show the column number
(display-time-mode 1)                             ; Enable time in the mode-line
(fset 'yes-or-no-p 'y-or-n-p)                     ; Replace yes/no prompts with y/n
(global-hl-line-mode)                             ; Hightlight current line
;; (set-default-coding-systems 'utf-8)               ; Default to utf-8 encoding
;; (show-paren-mode 1)                               ; Show the parent

;; use variable-pitch fonts for some headings and titles
(setq zenburn-use-variable-pitch t)

;; scale headings in org-mode
(setq zenburn-scale-org-headlines t)

;; scale headings in outline-mode
(setq zenburn-scale-outline-headlines t)

(setq zenburn-override-colors-alist
      '(("zenburn-bg+05" . "#282828")
        ("zenburn-bg+1"  . "#2F2F2F")
        ("zenburn-bg+2"  . "#3F3F3F")
        ("zenburn-bg+3"  . "#4F4F4F")))
(load-theme 'zenburn t)

(set-face-attribute 'default nil :font "Source Code Pro Medium")
(set-fontset-font t 'latin "Noto Sans")
(set-frame-font "DejaVu Sans Mono-18" nil t)

;;문법 강조를 활성화
(global-font-lock-mode t)
(transient-mark-mode 1)

(when window-system
  (menu-bar-mode -1)              ; Disable the menu bar
  (scroll-bar-mode -1)            ; Disable the scroll bar
  (tool-bar-mode -1)              ; Disable the tool bar
  (tooltip-mode -1))              ; Disable the tooltips

;; org-mode 설정
;; org-mode 활성화
(require 'org)

;; org-mode를 .org로 끝나는 파일에서 활성화
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))

;; (global-set-key (kbd "<f3>") (lambda () (interactive) (find-file (concat "~/ungleich-learning-circle/youngjin.han/learning-"(system-name)"-"(substring (current-time-string) -4 nil)".org"))))
(global-set-key (kbd "<f3>") (lambda () (interactive) (find-file (concat "~/ungleich-learning-circle/youngjin.han/learning-"(system-name)"-"(format-time-string "%Y")".org"))))

(setq org-directory (expand-file-name "~/ungleich-learning-circle/youngjin.han"))

(use-package window
  :ensure nil
  :bind (("C-x 3" . hsplit-last-buffer)
         ("C-x 2" . vsplit-last-buffer))
  :preface
  (defun hsplit-last-buffer ()
    "Gives the focus to the last created horizontal window."
    (interactive)
    (split-window-horizontally)
    (other-window 1))

  (defun vsplit-last-buffer ()
    "Gives the focus to the last created vertical window."
    (interactive)
    (split-window-vertically)
    (other-window 1)))
EOF

__require="__package/emacs __directory/~/.emacs.d __file/~/.emacs.d/init.el" \
__file ~/.emacs.d/10_magit_config.el \
--owner root \
--group root \
--mode 0644 \
--source - << EOF
;; Added by Package.el.  This must come before configurations of
;; installed packages.  Don't delete this line.  If you don't want it,
;; just comment it out by adding a semicolon to the start of the line.
;; You may delete these explanatory comments.
(require 'magit)

(global-set-key (kbd "C-x g") 'magit-status)
EOF

__require="__package/emacs __directory/~/.emacs.d __file/~/.emacs.d/init.el" \
__file ~/.emacs.d/20_mu4e_config.el \
--owner root \
--group root \
--mode 0644 \
--source - << EOF
;; Added by Package.el.  This must come before configurations of
;; installed packages.  Don't delete this line.  If you don't want it,
;; just comment it out by adding a semicolon to the start of the line.
;; You may delete these explanatory comments.
(add-to-list 'load-path "/usr/local/share/emacs/site-lisp/mu4e")

(require 'mu4e)

;; location of my maildir
(setq mu4e-maildir (expand-file-name "~/.maildir/ungleich/youngjin.han@ungleich.ch/"))

(setq mu4e-maildir-shortcuts
      '( (:maildir "/Inbox"     :key  ?i)
         (:maildir "/archive"   :key  ?a)
         (:maildir "/drafts"    :key  ?d)
         (:maildir "/sent"      :key  ?s)
         (:maildir "/trash"     :key  ?t)))

;; these are actually the defaults
(setq
 mu4e-refile-folder "/archive"    ;; saved messages
 mu4e-drafts-folder "/drafts"     ;; unfinished messages
 mu4e-sent-folder   "/sent"       ;; folder for sent messages
 mu4e-trash-folder  "/trash")     ;; trashed messages

(setq
 mu4e-index-cleanup nil      ;; don't do a full cleanup check
 mu4e-index-lazy-check t)    ;; don't consider up-to-date dirs

(setq
 mu4e-get-mail-command "mbsync -a"                  ;; or fetchmail, or ...
 mu4e-update-interval 300)                          ;; update every 5 minutes

;; show images
(setq mu4e-show-images t)

(setq mu4e-reply-to-address "youngjin.han@ungleich.ch"
      user-mail-address "youngjin.han@ungleich.ch"
      user-full-name  "YOUNGJIN.HAN")

;; spell check
(add-hook 'mu4e-compose-mode-hook
	  (defun my-do-compose-stuff ()
	    "My settings for message composition."
	    (set-fill-column 72)
            (flyspell-mode)))

;;rename files when moving
;;NEEDED FOR MBSYNC
(setq mu4e-change-filenames-when-moving t)

;;store org-mode links to messages
(require 'org-mu4e)

(define-key mu4e-headers-mode-map (kbd "C-c c") 'mu4e-org-store-and-capture)
(define-key mu4e-view-mode-map    (kbd "C-c c") 'mu4e-org-store-and-capture)

(setq mu4e-headers-skip-duplicates nil)

;;store link to message if in header view, not to header query
(setq org-mu4e-link-query-in-headers-mode nil)
EOF

__require="__package/emacs __directory/~/.emacs.d __file/~/.emacs.d/init.el" \
__file ~/.emacs.d/21_smtp_config.el \
--owner root \
--group root \
--mode 0644 \
--source - << EOF
;; Added by Package.el.  This must come before configurations of
;; installed packages.  Don't delete this line.  If you don't want it,
;; just comment it out by adding a semicolon to the start of the line.
;; You may delete these explanatory comments.
(require 'smtpmail)

;; smtp
(setq message-send-mail-function 'smtpmail-send-it
      smtpmail-starttls-credentials
      '(("smtp.ungleich.ch" 587 nil nil))
      smtpmail-default-smtp-server "smtp.ungleich.ch"
      smtpmail-smtp-server "smtp.ungleich.ch"
      smtpmail-smtp-service 587
      smtpmail-auth-credentials "~/.authinfo"
      smtpmail-debug-info t)
EOF

__require="__package/emacs __directory/~/.emacs.d __file/~/.emacs.d/init.el" \
__file ~/.emacs.d/30_agenda_config.el \
--owner root \
--group root \
--mode 0644 \
--source - << EOF
;; Added by Package.el.  This must come before configurations of
;; installed packages.  Don't delete this line.  If you don't want it,
;; just comment it out by adding a semicolon to the start of the line.
;; You may delete these explanatory comments.
(require 'org-agenda)

(global-set-key (kbd "C-c a") 'org-agenda)

(require 'org-capture)

(setq org-capture-templates
      '(("t" "todo" entry (file+headline (concat "~/ungleich-learning-circle/youngjin.han/todo-"(system-name)"-"(format-time-string "%Y")".org") "Tasks")
	          "* TODO [#A] %?\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n%a\n")))

(global-set-key (kbd "<f8>") 'org-todo-list)

(setq org-log-done 'time)
EOF

__require="__package/emacs __directory/~/.emacs.d __file/~/.emacs.d/init.el" \
__file ~/.emacs.d/99_custom_config.el \
--owner root \
--group root \
--mode 0644 \
--source - << EOF
;; Added by Package.el.  This must come before configurations of
;; installed packages.  Don't delete this line.  If you don't want it,
;; just comment it out by adding a semicolon to the start of the line.
;; You may delete these explanatory comments.
EOF
