Skip to content

Latest commit

 

History

History
1458 lines (1335 loc) · 100 KB

horoz.org

File metadata and controls

1458 lines (1335 loc) · 100 KB

* System Inquiry

OS Detection

(defconst *is-a-windows* (eq system-type 'windows-nt))
(defconst *is-a-mac* (eq system-type 'darwin))

Configure Use-Package

 (unless (package-installed-p 'use-package)
   (package-refresh-contents)
   (package-install 'use-package))

 (setq use-package-verbose t
	use-package-always-ensure t)

Emacs Defaults

which-function-mode

(which-function-mode 1)

electric pair mode

;; (when (featurep 'electric-pair-mode)
;;   (electric-pair-mode))

others

(setq buffer-save-without-query t)
(fset 'yes-or-no-p 'y-or-n-p)
(global-auto-revert-mode t)
(show-paren-mode)
(setq load-prefer-newer t)
;; reduce the frequency of garbage collection by making it happen on
;; each 50MB of allocated data (the default is on every 0.76MB)
(setq gc-cons-threshold 50000000)

;; warn when opening files bigger than 100MB
(setq large-file-warning-threshold 100000000)
(global-set-key (kbd "RET") 'newline-and-indent)

Revert buffers automatically when underlying files are changed externally

  

set find program

(if *is-a-windows*
    (setq find-program "C:/PortableGit-2.15.0-64-bit.7z/usr/bin/find.exe"))

Execute Path

(if *is-a-windows*
    (setq exec-path (append exec-path '("C:/PortableGit-2.15.0-64-bit.7z/usr/bin"))))

alias list

(defalias 'fl 'find-library)
(defalias 'eb 'eval-buffer)
(defalias 'rt 'projectile-regenerate-tags)

Setup Directories

(defvar  d-emacs-dir "~/.emacs.d")
(unless (file-exists-p d-emacs-dir)
  (make-directory d-emacs-dir))

(defvar  emacs-lisp-dir (expand-file-name "lisp" d-emacs-dir))
(defvar emacs-temp-dir (expand-file-name "temp/" d-emacs-dir))

(unless (file-exists-p emacs-lisp-dir)
  (make-directory emacs-lisp-dir))

(unless (file-exists-p emacs-temp-dir)
  (make-directory emacs-temp-dir))


(setq temporary-file-directory emacs-temp-dir)

(setq backup-directory-alist
      `((".*" . ,temporary-file-directory)))

(setq auto-save-file-name-transforms
      `((".*" ,temporary-file-directory t)))

(add-to-list 'load-path emacs-lisp-dir)
(add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory))

init

$PATH

;; (if *is-a-mac*
;;     (setenv "PATH"
;;             (concat
;;              "/usr/local/go/bin" path-separator
;;              "/Users/cihangir/go/bin" path-separator
;;              (getenv "PATH"))))

(require 'exec-path-from-shell)
(when (memq window-system '(mac ns x))
  (exec-path-from-shell-initialize))

Osx keys

   (when *is-a-mac*
     (setq mac-command-modifier 'meta)
     (setq mac-option-modifier 'none)
     (setq-default default-input-method "MacOSX")

     ;; Make mouse wheel / trackpad scrolling less jerky
     (setq mouse-wheel-scroll-amount '(1
					 ((shift) . 5)
					 ((control))))


     (dolist (multiple '("" "double-" "triple-"))
	 (dolist (direction '("right" "left"))
	   (global-set-key (read-kbd-macro (concat "<" multiple "wheel-" direction ">")) 'ignore))))

exec-path

;; (if *is-a-mac*
;;     (add-to-list 'exec-path "/usr/local/bin"))

Custom Settings File

(setq custom-file (expand-file-name "custom-settings.el" d-emacs-dir))
(if (file-exists-p custom-file )
    (load custom-file))

org-mode

Using the below config, you can run: my-org-publish-buffer to open current buffer as html in browser

Export org-mode docs as HTML compatible with Twitter Bootstrap

;; (use-package ox-twbs)

Settings

org-bullets’ new version causing syntax highlighting problem in source blocks . So I want to keep org-bullets-20140918.1137 in my git repo .

(use-package org-bullets
  :ensure t
  :config
  (progn
    (require 'which-func)
    ;;(add-to-list 'which-func-mode 'org-mode)
    (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
                               ))                     
(setq org-ellipsis "")

(setq org-hide-leading-stars t)
(setq org-agenda-files
      '("~/org/projects.org"))

(add-hook 'org-mode-hook
          (lambda ()
            (local-set-key (kbd "C-c e") 'org-edit-src-code)))

Use syntax highlighting in source blocks while editing.

(setq org-src-fontify-natively t)

When editing a code snippet, use the current window rather than

popping open a new one (which shows the same information).

(setq org-src-window-setup 'current-window)

Quickly insert a block of elisp:

(add-to-list 'org-structure-template-alist
             '("el" "#+BEGIN_SRC emacs-lisp\n?\n#+END_SRC"))

Utility function

(setq org-publish-project-alist
      '(("org-notes"
         :base-directory "~/org/"
         :publishing-directory "~/public_html/"
         :publishing-function org-twbs-publish-to-html
         :with-sub-superscript nil
         )))

(defun my-org-publish-buffer ()
  (interactive)
  (save-buffer)
  (save-excursion (org-publish-current-file))
  (let* ((proj (org-publish-get-project-from-filename buffer-file-name))
         (proj-plist (cdr proj))
         (rel (file-relative-name buffer-file-name
                                  (plist-get proj-plist :base-directory)))
         (dest (plist-get proj-plist :publishing-directory)))
    (browse-url (concat "file://"
                        (file-name-as-directory (expand-file-name dest))
                        (file-name-sans-extension rel)
                        ".html"))))

File open methods

(defun open-file-new-window ()
  (interactive)
  (with-helm-alive-p
    (helm-exit-and-execute-action
     (lambda (candidate)
       (find-file-other-window candidate)))))

evil-mode

Utility

(defun minibuffer-keyboard-quit ()
  "Abort recursive edit.
In Delete Selection mode, if the mark is active, just deactivate it;
then it takes a second \\[keyboard-quit] to abort the minibuffer."
  (interactive)
  (if (and delete-selection-mode transient-mark-mode mark-active)
      (setq deactivate-mark  t)
    (when (get-buffer "*Completions*") (delete-windows-on "*Completions*"))
    (abort-recursive-edit)))

Key Bindings

(use-package evil

  :init
  (progn
    (use-package evil-leader
      :init
      (global-evil-leader-mode)
      :config
      (progn
        (setq evil-leader/in-all-states t)
        (evil-leader/set-leader "SPC")
        ;; (evil-leader/set-key
        ;;           "SPC" 'helm-M-x
        ;; ;;          "g" 'ace-jump-mode
        ;;           "e" 'eshell
        ;;           "r" 'eval-buffer
        ;;           "s" 'helm-swoop
        ;;           "d" 'neotree-toggle
        ;;           "w" 'save-all-buffers
        ;;           "q" 'save-buffers-kill-terminal
        ;;           "f f" 'helm-projectile-find-file
        ;;           "o" 'other-window
        ;;           "0" 'delete-window
        ;;           "1" 'delete-other-windows
        ;;           "2" 'split-window-below
        ;;           "3" 'split-window-right
        ;;           "b" 'switch-to-buffer
        ;;           "k" 'kill-other-buffers)
        ))


    (evil-mode 1))

  :config
  (progn
    
    (evil-define-key 'normal 'compilation-mode-map "m" 'compile-goto-error)
    (define-key evil-insert-state-map "j" #'evil-escape-f)
    (define-key evil-normal-state-map [escape] 'keyboard-quit)
    (define-key evil-visual-state-map [escape] 'keyboard-quit)
    (define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
    (define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
    (define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
    (define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
    (define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)))
   

evil-escape-f

(evil-define-command evil-escape-f ()
  :repeat change
  (interactive)
  (let ((modified (buffer-modified-p)))
    (insert "j")
    (let ((evt (read-event (format "Insert %c to exit insert state" ?j)
                           nil 0.5)))
      (cond
       ((null evt) (message ""))
       ((and (integerp evt) (char-equal evt ?j))
        (delete-char -1)
        (set-buffer-modified-p modified)
        (push 'escape unread-command-events))
       (t (setq unread-command-events (append unread-command-events
                                              (list evt))))))))

General Package

(use-package general
  :config
  (progn
    ;; bind a key globally in normal state; keymaps must be quoted
    (general-evil-setup)
    (setq general-default-keymaps 'evil-normal-state-map)))

neotree

Utilities

neotree-project-root-dir-or-current-dir fit-window-to-buffer-horizontally

(defun neotree-project-root-dir-or-current-dir ()
  "Open NeoTree using the project root, using projectile, or the
current buffer directory."
  (interactive)
  (let ((project-dir (ignore-errors (projectile-project-root)))
        (file-name (buffer-file-name))
        (neo-smart-open t))
    (if (neo-global--window-exists-p)
        (neotree-hide)
      (progn
        (neotree-show)
        (if project-dir
            (neotree-dir project-dir))
        (if file-name
            (neotree-find file-name))))))

Load with icons

(use-package neotree
  :ensure t :ensure all-the-icons
  :config
  (progn
    (require 'all-the-icons)
    (setq fit-window-to-buffer-horizontally t)
    (setq neo-smart-open t)
    (setq neo-window-fixed-size nil)
    (setq neo-theme (if (display-graphic-p) 'icons 'arrow))))

(add-hook 'neotree-mode-hook
          (lambda ()
            (define-key evil-normal-state-local-map (kbd "TAB") 'neotree-enter)
            (define-key evil-normal-state-local-map (kbd "q") 'neotree-hide)
            (define-key evil-normal-state-local-map (kbd "RET") 'neotree-enter)))

automatically-resize-neotree-window-to-contents

(defun neotree-resize-window (&rest _args)
  "Resize neotree window. https://github.com/jaypei/emacs-neotree/pull/110"
  (interactive)
  (neo-buffer--with-resizable-window
   (let ((fit-window-to-buffer-horizontally t))
     (fit-window-to-buffer))))

(defun t/neotree-keep-size (fn &rest args)
  "Reset neotree width after open, if user adjusted it's size."
  (let ((w (window-width)))
    (funcall fn)
    (neo-global--set-window-width w)))
(advice-add 'neotree-enter :around 't/neotree-keep-size)

;; (defun neotree-resize-window 
;;     (neo-buffer--with-resizable-window
;;      (let ((fit-window-to-buffer-horizontally t))
;;        (fit-window-to-buffer))))


;;(add-hook 'neo-change-root-hook #'neotree-resize-window)
;;(add-hook 'neo-enter-hook #'neotree-resize-window)


;;(add-hook 'neo-change-root-hook #'fit-window-to-buffer)
;;(add-hook 'neo-enter-hook #'fit-window-to-buffer)

window management

;;(require 'es-windows)
(use-package ace-window
  :config
  (global-set-key (kbd "M-p") 'ace-window))

which-key-mode

(use-package which-key
  :init (which-key-mode 1))

UI Preferences

Cursor

the blinking cursor is nothing, but an annoyance

(blink-cursor-mode -1)
(set-cursor-color "#EC0E0E") 

Menubar

(menu-bar-mode -1)

Toolbar

the toolbar is just a waste of valuable screen estate in a tty tool-bar-mode does not properly auto-load, and is already disabled anyway

(when (fboundp 'tool-bar-mode)
  (tool-bar-mode -1))

Startup

Layout

(defun my-startup-layout ()
  (interactive)
  (delete-other-windows)
  (split-window-horizontally)
  (next-multiframe-window)
  (switch-to-buffer "*Messages*")
  (next-multiframe-window))
(my-startup-layout)

Full Screen

(add-to-list 'default-frame-alist '(fullscreen . maximized))

Inhibit startup screen

(setq inhibit-startup-screen t)

Bell

(setq visible-bell 1)
;; disable the annoying bell ring
(setq ring-bell-function 'ignore)

Nice scrolling

(setq scroll-margin 0
      scroll-conservatively 100000
      scroll-preserve-screen-position 1)

mode line settings

(line-number-mode t)
(column-number-mode t)
(size-indication-mode t)

Title Format

(setq-default frame-title-format
              '(:eval
                (format "[%s] %s"

                        (projectile-project-name)

                        (cond
                         (buffer-file-truename
                          (concat "  (" buffer-file-truename ")"))
                         (dired-directory
                          (concat "  {" dired-directory "}"))
                         (t
                          "[no file]")))))

Beacon Mode only on Windows

(when *is-a-windows*
  (use-package beacon
    :config (beacon-mode 1)))
   

Theme

tangotango theme

;; (use-package tangotango-theme
;;   :init (load-theme 'tangotango t))

(add-to-list 'custom-theme-load-path "~/.emacs.d/themes")
(load-theme 'dracula t)

solarized theme

;; (defun hrs/apply-solarized-theme ()
;;   (setq solarized-use-variable-pitch nil)
;;   (setq solarized-height-plus-1 1.0)
;;   (setq solarized-height-plus-2 1.0)
;;   (setq solarized-height-plus-3 1.0)
;;   (setq solarized-height-plus-4 1.0)
;;   (setq solarized-high-contrast-mode-line t)
;;   (load-theme 'solarized-dark t))

;; (hrs/apply-solarized-theme)

spaceline

(use-package spaceline
  :config
  (progn
    (require 'spaceline-config)
    (setq powerline-height 20)
    (setq ns-use-srgb-colorspace nil)
    (setq powerline-default-separator 'wave)
    (spaceline-spacemacs-theme)))

company-mode with irony

Setup Hooks

   (defun my-irony-setup ()
     (define-key irony-mode-map [remap completion-at-point]
	 'irony-completion-at-point-async)
     (define-key irony-mode-map [remap complete-symbol]
	 'irony-completion-at-point-async)
     (push 'java-mode irony-supported-major-modes))

   (defun my-c-common-setup ()    ;; function called by c-mode-common-hook
     (irony-mode 1)
     (company-mode))

Loading company

(use-package irony
  :bind( :map company-active-map
              ([tab] . company-complete-selection)
              ("M-m" . company-complete-selection)
              ("C-j" . company-select-next)
              ("M-j" . company-select-next)
              ("C-k" . company-select-previous)
              ("M-k" . company-select-previous))
  :init
  (use-package company
    :init
    (progn
      (add-hook 'after-init-hook 'global-company-mode)
      (use-package company-irony)))
  :config
  (progn
    (setq company-dabbrev-downcase nil)
    (add-hook 'irony-mode-hook 'my-irony-setup)
    (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
    (add-hook 'c-mode-common-hook 'my-c-common-setup)

    (when (boundp 'w32-pipe-read-delay)
      (setq w32-pipe-read-delay 0))
    (when (boundp 'w32-pipe-buffer-size)
      (setq irony-server-w32-pipe-buffer-size (* 64 1024)))
    (add-to-list 'company-backends 'company-irony)))

Flycheck setup

;; (defun my-flycheck-setup ()
;;   (flycheck-mode)
;;   (setq flycheck-check-syntax-automatically nil)
;;   ;; (setq flycheck-check-syntax-automatically '(save) )
;;   )

;; (use-package flycheck
;;   :ensure t :ensure flycheck-irony :ensure flycheck-pos-tip
;;   :commands my-flycheck-setup
;;   :init
;;   ;;(mapc (lambda (hook) ( add-hook hook 'my-flycheck-setup)) '(c-mode-common-hook emacs-lisp-mode-hook))
;;   (add-hook 'c-mode-common-hook 'my-flycheck-setup)
;;   (add-hook 'flycheck-mode-hook #'flycheck-irony-setup))

;; (setq-default flycheck-disabled-checkers '(emacs-lisp-checkdoc))

ido-mode

Local keys

(defun accept-ido-line ()
  (interactive)
  (if (active-minibuffer-window)
      (ido-exit-minibuffer)))

(defun bind-ido-keys ()
  "Keybindings for ido mode."
  (define-key global-map (kbd "M-m") 'accept-ido-line)
  (define-key ido-completion-map (kbd "M-n") 'ido-next-match) 
  (define-key ido-completion-map (kbd "M-p") 'ido-prev-match) 
  (define-key ido-completion-map (kbd "C-j") 'ido-next-match) 
  (define-key ido-completion-map (kbd "C-k") 'ido-prev-match)
  (define-key ido-completion-map (kbd "M-j") 'ido-next-match) 
  (define-key ido-completion-map (kbd "M-k") 'ido-prev-match))

Loading

(use-package ido-vertical-mode
  :init
  (use-package ido)
  :config
  (progn
    ;;    (unbind-key "M-j" global-map)
    (ido-mode t)
    (ido-vertical-mode 1)
    (add-hook 'ido-setup-hook #'bind-ido-keys)))

c-style

(defconst my-c-style
  '((c-tab-always-indent        . t)
    (c-comment-only-line-offset . 4)
    (c-hanging-braces-alist     . ((substatement-open after)
                                   (brace-list-open)))
    (c-hanging-colons-alist     . ((member-init-intro before)
                                   (inher-intro)
                                   (case-label after)
                                   (label after)
                                   (access-label after)))
    (c-cleanup-list             . (scope-operator
                                   empty-defun-braces
                                   defun-close-semi))
    (c-offsets-alist            . ((arglist-close . c-lineup-arglist)
                                   (substatement-open . 0)
                                   (case-label        . 4)
                                   (block-open        . 0)
                                   (knr-argdecl-intro . -)))
    (c-echo-syntactic-information-p . t))
  "My C Programming Style")

(c-add-style "PERSONAL" my-c-style)

(defun my-c-mode-common-hook ()
  (c-set-style "PERSONAL")
  (setq tab-width 2 indent-tabs-mode nil)
  (c-toggle-auto-newline -1)
  (local-unset-key "\C-c\C-c")
  (local-unset-key "\C-c\C-e")
  (local-unset-key "\C-c\C-s"))

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
(add-hook 'prog-mode-hook 'linum-mode)

Programming Modes

c-mode

;;(add-to-list 'which-func-mode 'c-mode)

c++-mode

Groovy mode

(use-package groovy-mode
  :mode ("\\.gradle?\\'" . groovy-mode)
  :config
  (add-hook 'groovy-mode-hook (lambda ()
                                (groovy-electric-mode))))

Kotlin mode

(use-package kotlin-mode
  :config
  (progn 
    (electric-pair-mode)
    (add-hook 'kotlin-mode-hook ( lambda ()
                                  (setq-default indent-tabs-mode nil)
                                  (setq kotlin-tab-width 4)))))
(load-library "my-kotlin-indent.el")
(defun kotlin-mode-use-my-kotlin-indent ()
  (setq indent-line-function 'kotlin-mode--elk-indent-line))

(add-hook 'kotlin-mode-hook 'kotlin-mode-use-my-kotlin-indent)

java mode

(defvar java-function-regexp
  (concat
   "^[ \t]*"                                   ; leading white space
   "\\(public\\|private\\|protected\\|"        ; some of these 8 keywords
   "abstract\\|final\\|static\\|"
   "synchronized\\|native"
   "\\|[ \t\n\r]\\)*"                          ; or whitespace
   "[a-zA-Z0-9_$]+"                            ; return type
   "[ \t\n\r]*[[]?[]]?"                        ; (could be array)
   "[ \t\n\r]+"                                ; whitespace
   "\\([a-zA-Z0-9_$]+\\)"                      ; the name we want!
   "[ \t\n\r]*"                                ; optional whitespace
   "("                                         ; open the param list
   "\\([ \t\n\r]*"                             ; optional whitespace
   "\\<[a-zA-Z0-9_$]+\\>"                      ; typename
   "[ \t\n\r]*[[]?[]]?"                        ; (could be array)
   "[ \t\n\r]+"                                ; whitespace
   "\\<[a-zA-Z0-9_$]+\\>"                      ; variable name
   "[ \t\n\r]*[[]?[]]?"                        ; (could be array)
   "[ \t\n\r]*,?\\)*"                          ; opt whitespace and comma
   "[ \t\n\r]*"                                ; optional whitespace
   ")"                                         ; end the param list
   ))

(defun my:next-java-method()
  (interactive)
  (re-search-forward java-function-regexp nil t))

(defun my:prev-java-method()
  (interactive)
  (re-search-backward java-function-regexp nil t))

go-mode

;; (defun set-compile-command-for-go()
;;   (if (not (string-match "go" compile-command))
;;       (set (make-local-variable 'compile-command)
;;            "go build -v && go test -v && go vet")))

(defun set-compile-command-for-go()
  (if (not (string-match "go" compile-command))
      (set (make-local-variable 'compile-command)
           "go build -v")))

(use-package go-mode
  :ensure t 
  :config (progn
            (add-hook 'go-mode-hook
                      (lambda ()
                        (add-hook 'go-mode-hook 'go-eldoc-setup)
                        (evil-define-key 'normal go-mode-map (kbd "g d") 'godef-jump)
                        (set (make-local-variable 'company-backends) '(company-go))
                        (set-compile-command-for-go)
                        (company-mode)))
            (setq gofmt-command "goimports")
            (add-hook 'before-save-hook 'gofmt-before-save)))

(use-package auto-complete
  :ensure t
  :commands go-mode
  :config (ac-config-default))


(use-package go-autocomplete
  :ensure t
  :commands go-mode)


(use-package go-projectile
  :ensure t
  :init
  (setq go-projectile-switch-gopath 'never))


(use-package company-go
  :ensure t
  :commands go-mode
  :config (lambda ()
            (setq company-tooltip-limit 20)                      ; bigger popup window
            (setq company-idle-delay .3)                         ; decrease delay before autocompletion popup shows
            (setq company-echo-delay 0)                          ; remove annoying blinking
            (setq company-begin-commands '(self-insert-command)) ; start autocompletion only after typing
            ))

;; (defun set-compile-command-for-go()
;; ;;   (interactive)
;; ;;   (if (not (string-match "go" compile-command))
;; ;;       (set (make-local-variable 'compile-command)
;; ;;            "go build -v && go test -v && go vet")))


(custom-set-faces
 '(company-preview
   ((t (:foreground "darkgray" :underline t))))
 '(company-preview-common
   ((t (:background "lightgray" :foreground "black"))))
 '(company-tooltip
   ((t (:background "lightgray" :foreground "black"))))
 '(company-tooltip-selection
   ((t (:background "steelblue" :foreground "white"))))
 '(company-tooltip-common
   ((t (:background "lightgray" :foreground "red"))))
 '(company-tooltip-common-selection
   ((((type x)) (:inherit company-tooltip-selection :weight bold))
    (t (:inherit company-tooltip-selection)))))

json mode

(use-package json-mode
  :mode "\\.json$"
  :config (setq js-indent-level 4))

js2-mode

(use-package js2-mode
  :mode (("\\.js$" . js2-mode)
         ("\\.jsx$" . js2-mode))
  :interpreter ("node" . js2-mode)
  :bind (("C-a" . back-to-indentation-or-beginning-of-line)
         ("C-M-h" . backward-kill-word))
  :config
  (progn
    (add-hook 'js2-mode-hook (lambda () (setq js2-basic-offset 4)))
    (add-hook 'js2-mode-hook (lambda ()
                               (bind-key "M-j" 'join-line-or-lines-in-region js2-mode-map)))))

web-mode

(use-package web-mode
  :ensure t
  :config
  (progn
    (setq web-mode-ac-source-alist
          '(("css" . (ac-source-css-property))
            ("html" . (ac-source-words-in-buffer ac-source-abbrev))))
    (setq web-mode-enable-current-element-highlight t)
    ;; (setq web-mode-enable-current-column-highlight t)
    (setq web-mode-enable-auto-closing t))
  :mode ("\\.html?\\'" . web-mode))

typescript mode

(defun setup-tide-mode ()
  (interactive)
  (tide-setup)
  (flycheck-mode +1)
  (setq flycheck-check-syntax-automatically '(save mode-enabled))
  (eldoc-mode +1)
  (tide-hl-identifier-mode +1)
  ;; company is an optional dependency. You have to
  ;; install it separately via package-install
  ;; `M-x package-install [ret] company`
  (setq company-tooltip-align-annotations t)
  (add-hook 'before-save-hook 'tide-format-before-save)
  (company-mode +1))

(use-package tide
  :ensure t
  :commands typescript-mode
  :config (setup-tide-mode))

;; aligns annotation to the right hand side

;; formats the buffer before saving

;; (add-hook 'typescript-mode-hook #'setup-tide-mode)

Editing

agressive-indent

   (use-package aggressive-indent
     :config
     (progn
	 (add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
	 (add-hook 'css-mode-hook #'aggressive-indent-mode)))

Projectile

Format-spec function

(require 'format-spec)

Projectile ignore stuffs

(defun ignore-my-dirs ()
  (add-to-list 'projectile-globally-ignored-directories "~/.emacs.d/elpa")
  ;; (add-to-list 'projectile-globally-ignored-directories "CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "Debug/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "MainModule/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "MainModule/com/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "MainModule/inc/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "MainModule/prj/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "MainModule/src/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "MainModule/obj/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "MainModule/res/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "MainModule/bonus/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "MainModule/Debug/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "res/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "prj/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "Simul/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "kuanta/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "Simul/ImportLib/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "Simul/ImportLib/Src/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "Simul/ImportLib/Debug/CVS")
  ;; (add-to-list 'projectile-globally-ignored-directories "Simul/ModuleStartUp/CVS"))
  )

(defun projectile-ignore-files ()
  (add-to-list 'projectile-globally-ignored-files "GPATH")
  (add-to-list 'projectile-globally-ignored-files "GRTAGS")
  (add-to-list 'projectile-globally-ignored-files "GTAGS"))

Load with use-package

(use-package projectile
  :config
  (progn 
    (setq projectile-completion-system 'helm)
    (projectile-global-mode)
    (helm-projectile-on)
    (projectile-ignore-files)
    (setq projectile-enable-caching t)))

Helm

Helm -core

;; (use-package helm-core
;;   :ensure t)


;; https://github.com/tonini/emacs.d/blob/master/init.el
(use-package helm
  :bind (("M-x" . helm-M-x)
         ("C-SPC" . helm-dabbrev)
         ("C-x b" . helm-buffers-list)
         ("C-x C-f" . helm-find-files))

  :bind (:map helm-map
              ("M-m" . helm-maybe-exit-minibuffer)
              ("C-k" . helm-previous-line)
              ("C-j" . helm-next-line)
              ("M-k" . helm-previous-line)
              ("M-j" . helm-next-line)) 
  :config
  (progn
    (setq helm-buffers-fuzzy-matching t)
    (helm-mode 1)
    (setq helm-split-window-in-side-p           t
          helm-buffers-fuzzy-matching           t
          helm-split-window-in-side-p t
          helm-completion-in-region-fuzzy-match t
          ;;helm-move-to-line-cycle-in-source     t
          helm-ff-search-library-in-sexp        t
          helm-ff-file-name-history-use-recentf t
          helm-ag-fuzzy-match                   t)

    (substitute-key-definition 'find-tag 'helm-etags-select global-map)
    (setq projectile-completion-system 'helm))

  ;; Display helm buffers always at the bottom
  ;; Source: http://www.lunaryorn.com/2015/04/29/the-power-of-display-buffer-alist.html
  (add-to-list 'display-buffer-alist
               `(,(rx bos "*helm" (* not-newline) "*" eos)
                 (display-buffer-reuse-window display-buffer-in-side-window)
                 (reusable-frames . visible)
                 (side            . bottom)
                 (window-height   . 0.4)))
  :diminish (helm-mode))

Helm-projectile

(use-package helm-projectile
  :config
  (ignore-my-dirs)
  (helm-projectile-on)
  (setq-default
  	projectile-mode-line
  	'(:eval
     (if (file-remote-p default-directory)
         " Proj"
       (format " Proj[%s]" (projectile-project-name))))))

Helm-swoop

(use-package helm-swoop
  :bind ( 
		    
		    ( "M-i" . helm-swoop ) 
		    ("M-I" . helm-swoop-back-to-last-point))
  :config
  ;; (setq helm-swoop-pre-input-function (lambda () ""))
  )

grep ignore stuffs

(when (boundp 'grep-find-ignored-files) 
  (progn 
    (add-to-list 'grep-find-ignored-files "*.msg")
    (add-to-list 'grep-find-ignored-files "*.eps")
    (add-to-list 'grep-find-ignored-files "GPATH")
    (add-to-list 'grep-find-ignored-files "GRTAGS")
    (add-to-list 'grep-find-ignored-files "GTAGS")
    (add-to-list 'grep-find-ignored-files ".teliumProject*")
    (add-to-list 'grep-find-ignored-files "*.mk")
    (add-to-list 'grep-find-ignored-files "*.docx")
    (add-to-list 'grep-find-ignored-files "*.doc")
    (add-to-list 'grep-find-ignored-files "*.exe")))
  

yasnippet

(use-package yasnippet
  :config
  (progn
    (add-hook 'after-save-hook
              (lambda ()
                (when (eql major-mode 'snippet-mode)
                  (yas-reload-all))))
    (yas-global-mode 1))
  :mode ("\\.yasnippet" . snippet-mode))

;; Add yasnippet support for all company backends
;; https://github.com/syl20bnr/spacemacs/pull/179
(defvar company-mode/enable-yas t
  "Enable yasnippet for all backends.")

(defun company-mode/backend-with-yas (backend)
  (if (or (not company-mode/enable-yas) (and (listp backend) (member 'company-yasnippet backend)))
      backend
    (append (if (consp backend) backend (list backend))
            '(:with company-yasnippet))))

(setq company-backends (mapcar #'company-mode/backend-with-yas company-backends))

Search Tools

ag - silver search

(when *is-a-mac*
  (setq-default locate-command "mdfind"))

(use-package "ag"
  :ensure t :ensure projectile
  :init (use-package wgrep-ag
          :config
          (progn
            (setq ag-ignore-list '("*.*~"
                                   "*.map"
                                   "TAGS"
                                   "dist"
                                   "node_modules"))
            (setq ag-project-root-function 
                  (lambda (d) (let ((default-directory d)) (projectile-project-root))))
            (setq-default ag-highlight-search t
                          grep-scroll-output t)  ))
  ;; :config 
  ;; (setq ag-ignore-list (cons projectile-globally-ignored-directories projectile-globally-ignored-files)
  )

ace-jump-mode

(use-package ace-jump-mode
  :config
  (evil-leader/set-key "g" ace-jump-mode))

Version Control

magit installation

;; (use-package magit)

Utility Functions

Handier way to add modes to auto-mode-alist

(defun add-auto-mode (mode &rest patterns)
  "Add entries to `auto-mode-alist' to use `MODE' for all given file `PATTERNS'."
  (dolist (pattern patterns)
    (add-to-list 'auto-mode-alist (cons pattern mode))))

Delete the current file

(defun delete-this-file ()
  "Delete the current file, and kill the buffer."
  (interactive)
  (unless (buffer-file-name)
    (error "No file is currently being edited"))
  (when (yes-or-no-p (format "Really delete '%s'?"
                             (file-name-nondirectory buffer-file-name)))
    (delete-file (buffer-file-name))
    (kill-this-buffer)))

Rename the current file

(defun rename-this-file-and-buffer (new-name)
  "Renames both current buffer and file it's visiting to NEW-NAME."
  (interactive "sNew name: ")
  (let ((name (buffer-name))
        (filename (buffer-file-name)))
    (unless filename
      (error "Buffer '%s' is not visiting a file!" name))
    (progn
      (when (file-exists-p filename)
        (rename-file filename new-name 1))
      (set-visited-file-name new-name)
      (rename-buffer new-name))))
   

String utilities missing from core emacs

(defun sanityinc/string-all-matches (regex str &optional group)
  "Find all matches for `REGEX' within `STR', returning the full match string or group `GROUP'."
  (let ((result nil)
        (pos 0)
        (group (or group 0)))
    (while (string-match regex str pos)
      (push (match-string group str) result)
      (setq pos (match-end group)))
    result) )
   

Eval-Buffer or Region

 (defun eval-region-or-buffer ()
   "Evaluate the selection, or, if empty, the whole buffer."
   (interactive)
   (let ((debug-on-error t))
     (cond
      (mark-active
	(call-interactively 'eval-region)
	(setq deactivate-mark t))
      (t
	(eval-buffer)))))

Format on Paste

   (dolist (command '(yank yank-pop evil-paste-before evil-paste-after))
     (eval `(defadvice ,command (after indent-region activate)
		(and (not current-prefix-arg)
		     (member major-mode '(emacs-lisp-mode lisp-mode kotlin-mode
							  clojure-mode    scheme-mode
							  haskell-mode    ruby-mode
							  rspec-mode      python-mode
							  c-mode          c++-mode
							  objc-mode       latex-mode
							  plain-tex-mode  web-mode))
		     (let ((mark-even-if-inactive transient-mark-mode))
		       (indent-region (region-beginning) (region-end) nil))))))

Kill all other buffers

(defun kill-other-buffers ()
  "Kill all other buffers."
  (interactive)
  (eshell)
  (mapc 'kill-buffer 
        (delq (current-buffer) 
              (remove-if-not 'buffer-file-name (buffer-list)))))

Save all buffers

(defun save-all-buffers()
  (interactive)
  (save-some-buffers t))

Kill this buffer and delete this window

(defun kill-this-buffer-and-window ()
  (interactive)
  (when (get-buffer "*Help*")
    (progn
      (kill-buffer "*Help*")
      (return)))
  (kill-this-buffer)
  (if (> (count-windows) 1)
      (delete-window)))

open config.org

(defun open-config-org ()
  (interactive)
  (find-file "~/.emacs.d/horoz.org"))

open init.el

(defun open-init-el ()
  (interactive)
  (find-file "~/.emacs.d/init.el"))

dired mode

accept key

(define-key dired-mode-map (kbd "M-m") 'dired-find-file)
(define-key dired-mode-map "c" 'find-file)

expand-region

(use-package expand-region
  :bind( "C-=" . er/expand-region))

Perspective

Installation

(use-package perspective
  :config
  (progn (persp-mode)
         (require 'persp-projectile)
         (custom-set-faces
          '(persp-selected-face ((t (:foreground "cornflower blue" :weight bold)))))))

;; (custom-set-faces
;;  '(persp-selected-face ((t (:foreground "cornflower blue" :weight bold)))))

Key binding

  (eval-after-load "evil-leader"
    '(progn
	  (evil-leader/set-key
	    "p s" 'projectile-persp-switch-project)))

Code folding

Enable

(add-hook 'prog-mode-hook #'hs-minor-mode)
(add-hook 'sgml-mode-hook #'hs-minor-mode)

;; Fix XML folding
(add-to-list 'hs-special-modes-alist
             (list 'nxml-mode
                   "<!--\\|<[^/>]*[^/]>"
                   "-->\\|</[^/>]*[^/]>"
                   "<!--"
                   'nxml-forward-element
                   nil))

;; Fix HTML folding
(dolist (mode '(sgml-mode
                html-mode
                html-erb-mode))
  (add-to-list 'hs-special-modes-alist
               (list mode
                     "<!--\\|<[^/>]*[^/]>"
                     "-->\\|</[^/>]*[^/]>"
                     "<!--"
                     'sgml-skip-tag-forward
                     nil)))

Key binding

(evil-define-key 'normal prog-mode-map (kbd "t") 'hs-toggle-hiding)

helm-gtags

(use-package helm-gtags
  :init
  (progn
    (setq helm-gtags-fuzzy-match t)
    (add-hook 'c-mode-hook #'helm-gtags-mode)
    (add-hook 'c++-mode-hook #'helm-gtags-mode)
    (add-hook 'go-mode-hook #'helm-gtags-mode)))

smart-parents

;; (use-package smartparens
;;   :config
;;   (progn
;;     (require 'smartparens-html)
;;     (show-smartparens-global-mode 1)
;;     (smartparens-global-mode 1)
;;     (setq smartparens-strict-mode t)
;;     (sp-local-pair 'emacs-lisp-mode "`" nil :when '(sp-in-string-p)))
;;   :bind
;;   (("C-M-k" . sp-kill-sexp-with-a-twist-of-lime)
;;    ("C-M-f" . sp-forward-sexp)
;;    ("C-M-b" . sp-backward-sexp)
;;    ("C-M-n" . sp-up-sexp)
;;    ("C-M-d" . sp-down-sexp)
;;    ("C-M-u" . sp-backward-up-sexp)
;;    ("C-M-p" . sp-backward-down-sexp)
;;    ("C-M-w" . sp-copy-sexp)
;;    ("M-s" . sp-splice-sexp)
;;    ("M-r" . sp-splice-sexp-killing-around)
;;    ("C-)" . sp-forward-slurp-sexp)
;;    ("C-}" . sp-forward-barf-sexp)
;;    ("C-(" . sp-backward-slurp-sexp)
;;    ("C-{" . sp-backward-barf-sexp)
;;    ("M-S" . sp-split-sexp)
;;    ("M-J" . sp-join-sexp)
;;    ("C-M-t" . sp-transpose-sexp))) 

undo-tree

(use-package undo-tree
  :ensure t)
  

compilation buffer

compile command wo promt

(setq compilation-read-command nil)

compilation buffer

;; (setq split-height-threshold nil)
;; (setq split-width-threshold most-positive-fixnum)
;; (setq compilation-window-height 20)

next error

(defun my-nexterrorloop ()
  (interactive)
  (next-error 1 t))

popwin

(use-package popwin
  :config (popwin-mode 1)) 

window management

switch-window

(use-package switch-window)

multiple-cursor

https://github.com/gabesoft/evil-mc

(use-package evil-mc)
(global-evil-mc-mode  1) ;; enable

toggle-header-source

(setq cc-other-file-alist
      '(("\\.c"   (".h"))
        ("\\.cpp"   (".h"))
        ("\\.h"   (".c"".cpp"))))

;; (setq ff-search-directories
;;       '("." "../src" "../inc" "../MainModule/inc" "../MainModule/src"))

(add-to-list 'cc-search-directories "../../MainModule/inc")
(add-to-list 'cc-search-directories "../../MainModule/src")
(add-to-list 'cc-search-directories "../../MainModule/bonus")

Global Keybindings

Special Files

open init.el

(global-set-key (kbd "C-c i") (lambda ()
                                (interactive)
                                (find-file user-init-file)))

open configuration.org

(global-set-key (kbd "C-c c") (lambda ()
                                (interactive)
                                (find-file "~/.emacs.d/horoz.org")))

open emacs.d/lisp dir

(global-set-key (kbd "C-c I") (lambda ()
                                (interactive)
                                (dired emacs-lisp-dir)) )
  

open ~/org/projects.org

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (find-file "~/org/projects.org")))

open file at new window

(define-key helm-projectile-find-file-map (kbd "M-o") 'open-file-new-window)

Eshell

Start eshell or switch to it if it’s active.

(global-set-key (kbd "C-x m") 'eshell)

Start a new eshell even if one is active.

(global-set-key (kbd "C-x M") (lambda () (interactive) (eshell t)))

Start a regular shell if you prefer that.

(global-set-key (kbd "C-x M-m") 'shell)

left window resizing

(global-set-key (kbd "M-[") (lambda (delta)
                              (interactive "p")
                              (enlarge-window-horizontally delta)))


(global-set-key (kbd "M-]") (lambda (delta)
                              (interactive "p")
                              (shrink-window-horizontally delta)))

accept & quit & exit

(define-key global-map (kbd "M-o") 'evil-jump-backward)
(define-key global-map (kbd "M-g") 'keyboard-quit)
(define-key helm-projectile-projects-map (kbd "M-g") 'helm-keyboard-quit)
(define-key helm-projectile-projects-map (kbd "M-m") 'helm-maybe-exit-minibuffer)
(define-key helm-map (kbd "M-g") 'helm-keyboard-quit)
(define-key helm-find-files-map (kbd "M-g") 'helm-keyboard-quit)
(define-key helm-projectile-find-file-map (kbd "M-g") 'helm-keyboard-quit)
(define-key helm-projectile-find-file-map (kbd "M-m") 'helm-ff-RET)
(define-key compilation-button-map (kbd "M-m") 'compile-goto-error)

(define-key minibuffer-local-map (kbd "M-m") #'exit-minibuffer)

SPC prefixed

(eval-after-load "evil-leader"
  '(progn
     (evil-leader/set-key
       "SPC" 'helm-M-x
       "f" 'helm-projectile-find-file
       "a" 'ace-jump-mode
       "e" 'eshell
       "c" 'open-config-org
       "i" 'open-init-el
       "r" 'ag-project
       "s" 'save-all-buffers
       "d" 'dired-jump
       "D" 'dired-jump-other-window
       "n" 'neotree-project-root-dir-or-current-dir
       "q" 'kill-this-buffer-and-window
       "o" 'other-window
       "0" 'delete-window
       "1" 'delete-other-windows
       "2" 'split-window-below
       "3" 'split-window-right
       "b" 'switch-to-buffer
       "t" 'hs-toggle-hiding
       "mm" 'compile
       "mn" 'my-nexterrorloop
       "w" 'switch-window
       "h i" 'ff-find-other-file
       "h v" 'describe-variable
       "h f" 'describe-function
       "h k" 'describe-key
       ";" 'comment-line
       "p p" 'helm-projectile-switch-project
       "x c" 'save-buffers-kill-terminal
       "g p" 'go-set-project
       "g r" 'go-run
       "l a" 'helm-all-mark-rings
       "k" 'kill-this-buffer)))

dimmer

(use-package dimmer
  :ensure t
  :config (dimmer-mode))

cmake

;;first part
 (use-package cmake-mode
   :mode ("CMakeLists\\.txt\\'" "\\.cmake\\'"))


;; (use-package cmake-ide
;;   :ensure t
;;   :init (cmake-ide-setup))

;; (defun set-compile-key ()
;;   (message "set-compile-key")
;;   )

;; (defadvice cmake-ide--mode-hook (after cmake-ide--mode-hook-after activate)
;;   (evil-leader/set-key "mm" 'cmake-ide-compile)
;;   (message "cihangir advice"))

;; ;; second part

;; (use-package cmake-project
;;   :ensure t)

;; (defun start-cmake-project-mode()
;;   (if (locate-dominating-file default-directory "CMakeLists.txt")
;;       (cmake-project-mode)))

;; (add-hook 'c-mode-hook 'start-cmake-project-mode)
;; (add-hook 'c++-mode-hook 'start-cmake-project-mode)