GithubHelp home page GithubHelp logo

.emacs.d's Introduction

Table of contents

Reset Keymaps

Control key

(message "\n -- resetting keymaps --\n")

;; do not unset "\C-m" otherwise enter key does not work in console mode
(dolist (key '(
               "\C-a" "\C-b" "\C-d" "\C-e" "\C-f" "\C-g"
               "\C-j" "\C-k" "\C-l" "\C-n" "\C-o" "\C-p"
               "\C-q" "\C-r" "\C-s" "\C-t" "\C-u" "\C-v"
               "\C-w" "\C-x" "\C-y" "\C-z" "\C-SPC"))
  (global-unset-key key))

Meta

(dolist (key '(
               "\M-a" "\M-b" "\M-c" "\M-d" "\M-e" "\M-f"
               "\M-g" "\M-h" "\M-j" "\M-k" "\M-l" "\M-m"
               "\M-n" "\M-o" "\M-p" "\M-q" "\M-r" "\M-s"
               "\M-t" "\M-u" "\M-v" "\M-w" "\M-x" "\M-y"
               "\M-z" "\M-SPC"))
  (global-unset-key key))

(global-unset-key "\C-e\C-n")

General Alias

(message "\n -- setting alias --\n")

;; ** tab-bar

(defalias 'nt 'tab-bar-new-tab)
(defalias 'ct 'tab-bar-close-tab)

;; ** Centaur

(defalias 'mtl 'centaur-tabs-move-current-tab-to-left)
(defalias 'mtr 'centaur-tabs-move-current-tab-to-right)

;; ** Outline

(defalias 'onh 'outline-next-visible-heading)
(defalias 'oph 'outline-previous-visible-heading)
(defalias 'ouh 'outline-up-heading)
(defalias 'ose 'outline-show-entry)
(defalias 'ohe 'outline-hide-entry)
(defalias 'ohs 'outline-hide-subtree)
(defalias 'oss 'outline-show-subtree)
(defalias 'ohl 'outline-hide-leaves)
(defalias 'osb 'outline-show-branches)
(defalias 'osc 'outline-show-children)
(defalias 'ohb 'outline-hide-body)
(defalias 'osa 'outline-show-all)
(defalias 'oho 'outline-hide-other)

;; Replace
(defalias 'r 'query-replace)

;; Line mode
(defalias 'hl 'global-hl-line-mode)

;; Macro
(defalias 'sm 'start-kbd-macro)
(defalias 'em 'end-kbd-macro)
(defalias 'lm 'call-last-kbd-macro)

;; Rectangle
(defalias 'rm 'rectangle-mark-mode)

;; Upcase / downcase
(defalias 'ur 'upcase-region)
(defalias 'uw 'upcase-word)
(defalias 'dr 'downcase-region)
(defalias 'dw 'downcase-word)

(defalias 'dtw 'delete-trailing-whitespace)
(defalias 'eb 'eval-buffer)

(defalias 'ar 'align-regexp)
;; Align with the symbol '='
(defalias 'ceq 'my-c-equal-align)

;; Information sur une commande
(defalias 'ap 'apropos)

;; buffer
(defalias 'mwb 'mark-whole-bufferi)
(defalias 'kb 'ido-kill-buffer)
(defalias 'reload 'revert-buffer)
(defalias 'ib 'my-indent-buffer)

;; Narrow
(defalias 'nr  'narrow-to-region)
(defalias 'wd  'widen)

;; Package
(defalias 'pl 'package-list-packages)

;; Multiple cursor
(defalias 'cml 'mc/edit-lines)
(defalias 'cmn 'mc/mark-next-like-this)
(defalias 'cmp 'mc/mark-previous-like-this)
(defalias 'cma 'mc/mark-all-like-this)

;; helm-ag
(defalias 'ag 'rg-project)

;; Magit
(defalias 'mm 'magit-mode)
(defalias 'gs 'magit-status)
(defalias 'gbm 'magit-blame-mode)

;; window
(defalias 'o 'other-window)
(defalias 'q 'delete-window)
(defalias 'f 'delete-other-windows)
(defalias 'eh 'enlarge-window-horizontally)
(defalias 'ev 'enlarge-window)
(defalias 'sh 'shrink-window-horizontally)
(defalias 'sv 'shrink-window)

;; copy/paste
(defalias 'cc 'copy-to-clipboard)
(defalias 'pc 'paste-from-clipboard)

;; visual line mode
(defalias 'vlm 'visual-line-mode)

Function

(message "\n -- setting functions --\n")

(defun my-kill-buffer ()
  "kill current buffer without asking if it's the good one"
  (interactive)
  (kill-buffer (current-buffer)))

(defun my-backward-kill-line ()
  "Kill backward from point to beginning of line"
  (interactive) (kill-line 0))

(defun my-kill-line ()
  "Kill whole line if point is at the beginning of the line else only kill line"
  (interactive)
  (if (equal (point) (line-beginning-position))
      (kill-whole-line)
    (kill-line)))

(defun my-clipboard-kill-ring-save ()
  "Copy current line in the kill ring or region"
  (interactive)
  (if (use-region-p)
      (clipboard-kill-ring-save (region-beginning) (region-end))
    (kill-ring-save (line-beginning-position)
                    (line-beginning-position 2))
    (message "Line copied")))

(defun scroll-up-lot ()
  (interactive)
  (forward-line -2))

(defun scroll-down-lot ()
  (interactive)
  (forward-line 2))

(defun my-comment-line (n)
  "Comment or uncomment current line.
  With positive prefix, apply to N lines including current one.
  With negative prefix, apply to -N lines above.  Also, further
  consecutive invocations of this command will inherit the negative
  argument.

  If region is active, comment lines in active region instead.
  Unlike `comment-dwim', this always comments whole lines."
  (interactive "p")
  (if (use-region-p)
      (comment-or-uncomment-region
       (save-excursion
         (goto-char (region-beginning))
         (line-beginning-position))
       (save-excursion
         (goto-char (region-end))
         (line-end-position)))
    (when (and (eq last-command 'comment-line-backward)
               (natnump n))
      (setq n (- n)))
    (let ((range
           (list (line-beginning-position)
                 (goto-char (line-end-position n)))))
      (comment-or-uncomment-region
       (apply #'min range)
       (apply #'max range)))
    (back-to-indentation)
    (unless (natnump n) (setq this-command 'comment-line-backward))))

(defun move-line (n)
  "Move the current line up or down by N lines."
  (interactive "p")
  (setq col (current-column))
  (beginning-of-line) (setq start (point))
  (end-of-line) (forward-char) (setq end (point))
  (let ((line-text (delete-and-extract-region start end)))
    (forward-line n)
    (insert line-text)
    ;; restore point to original column in moved line
    (forward-line -1)
    (forward-char col)))

(defun move-line-up (n)
  "Move the current line up by N lines."
  (interactive "p")
  (move-line (if (null n) -1 (- n))))

(defun move-line-down (n)
  "Move the current line down by N lines."
  (interactive "p")
  (move-line (if (null n) 1 n)))

(defun move-region (start end n)
  "Move the current region up or down by N lines."
  (interactive "r\np")
  (let ((line-text (delete-and-extract-region start end)))
    (forward-line n)
    (let ((start (point)))
      (insert line-text)
      (setq deactivate-mark nil)
      (set-mark start))))

(defun move-region-up (start end n)
  "Move the current line up by N lines."
  (interactive "r\np")
  (move-region start end (if (null n) -1 (- n))))

(defun move-region-down (start end n)
  "Move the current line down by N lines."
  (interactive "r\np")
  (move-region start end (if (null n) 1 n)))

(defun move-line-region-up (start end n)
  (interactive "r\np")
  (if (use-region-p)
      (move-region-up start end n)
    (move-line-up n)
    ))

(defun move-line-region-down (start end n)
  (interactive "r\np")
  (if (use-region-p)
      (move-region-down start end n)
    (move-line-down n)))

(defun my-c-equal-align ()
  "align region with the symbol '='"
  (interactive)
  (setq sym '=)
  (align-regexp (region-beginning) (region-end) sym))

(defun intelligent-close ()
  "quit a frame the same way no matter what kind of frame you are on"
  (interactive)
  (if (eq (car (visible-frame-list)) (selected-frame))
      ;;for parent/master frame...
      (if (> (length (visible-frame-list)) 1)
          ;;close a parent with children present
          (delete-frame (selected-frame))
        ;;close a parent with no children present
        (save-buffers-kill-emacs))
    ;;close a child frame
    (delete-frame (selected-frame))))

(defun beginning-of-next-line()
  "Moves cursor to the beginning of the next line, or nowhere if at end of the buffer"
  (interactive)
  (end-of-line)
  (if (not (eobp))
      (forward-char 1)))

(defun my-format-buffer ()
  "indent whole buffer and delete trailing whitespace"
  (interactive)
  (delete-trailing-whitespace)
  (indent-region (point-min) (point-max) nil))

(defun my-indent-buffer ()
  "Indent the current buffer"
  (interactive)
  (save-excursion (indent-region (point-min) (point-max) nil)))

(defun my-forward-block (&optional φn)
  "Move cursor forward to the beginning of next text block.
    A text block is separated by blank lines."
  (interactive "p")
  (let ((φn (if (null φn) 1 φn)))
    (search-forward-regexp "\n[\t\n ]*\n+" nil "NOERROR" φn)))

(defun my-backward-block (&optional φn)
  "Move cursor backward to previous text block."
  (interactive "p")
  (let ((φn (if (null φn) 1 φn))
        (ξi 1))
    (while (<= ξi φn)
      (if (search-backward-regexp "\n[\t\n ]*\n+" nil "NOERROR")
          (progn (skip-chars-backward "\n\t "))
        (progn (goto-char (point-min))
               (setq ξi φn)))
      (setq ξi (1+ ξi)))))


;; install xsel
(defun copy-to-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (message "Yanked region to x-clipboard!")
        (call-interactively 'clipboard-kill-ring-save)
        )
    (if (region-active-p)
        (progn
          (shell-command-on-region (region-beginning) (region-end) "xsel -i -b")
          (message "Yanked region to clipboard!")
          (deactivate-mark))
      (message "No region active; can't yank to clipboard!")))
  )

(defun paste-from-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (clipboard-yank)
        (message "graphics active")
        )
    (insert (shell-command-to-string "xsel -o -b"))
    )
  )

(global-set-key [f8] 'copy-to-clipboard)
(global-set-key [f9] 'paste-from-clipboard)

(defun my-create-non-existent-directory ()
  (let ((parent-directory (file-name-directory buffer-file-name)))
    (when (and (not (file-exists-p parent-directory))
               (y-or-n-p (format "Directory `%s' does not exist! Create it?" parent-directory)))
      (make-directory parent-directory t))))

(add-to-list 'find-file-not-found-functions #'my-create-non-existent-directory)

(defun rename-this-buffer-and-file ()
  "Renames current buffer and file it is visiting."
  (interactive)
  (let ((name (buffer-name))
        (filename (buffer-file-name)))
    (if (not (and filename (file-exists-p filename)))
        (error "Buffer '%s' is not visiting a file!" name)
      (let ((new-name (read-file-name "New name: " filename)))
        (cond ((get-buffer new-name)
               (error "A buffer named '%s' already exists!" new-name))
              (t
               (rename-file filename new-name 1)
               (rename-buffer new-name)
               (set-visited-file-name new-name)
               (set-buffer-modified-p nil)
               (message "File '%s' successfully renamed to '%s'" name (file-name-nondirectory new-name))))))))

Shortcut

(message "\n -- setting shortcuts --\n")

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BASIC COMMAND
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key (kbd "C-SPC")   'Control-X-prefix)
(global-set-key (kbd "C-e")     'set-mark-command)
(global-set-key (kbd "M-SPC")   'execute-extended-command)
(global-set-key (kbd "C-SPC u") 'universal-argument)

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OPEN FILE
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key [f1] 'find-file)
(global-set-key (kbd "C-SPC f") 'find-file)

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SAVE
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key [f2] 'save-buffer)
(global-set-key [f3] 'write-file)
(global-set-key (kbd "C-w") 'save-buffer)
(global-set-key (kbd "C-SPC w") 'write-file)

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; KILL
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key [f4] 'kill-emacs)
(global-set-key (kbd "C-k") 'my-kill-buffer)

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BUFFER MENU
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key [f7] 'buffer-menu)
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GOTO
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key "\M-g" 'goto-line)

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; WINDOWS
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key "\M-b" 'next-buffer)
(global-set-key "\M-b" 'next-buffer)
(global-set-key (kbd "C-SPC O") 'previous-multiframe-window)
(global-set-key [f12] 'repeat-complex-command)
(global-set-key (kbd "C-SPC n") 'next-multiframe-window)
(global-set-key (kbd "C-SPC p") 'previous-multiframe-window)

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MINIBUFFER HISTORY
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-key minibuffer-local-map (kbd "<up>")   'previous-history-element)
(define-key minibuffer-local-map (kbd "<down>") 'next-history-element)


;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;;;; EDITION SHORTCUT ;;;;;;;
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; UNDO/REDO
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key (kbd "C-z") 'undo)
(global-set-key (kbd "M-z") 'redo)

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; KILL WORD/LINE
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Hack to solve problem for tab and C-i
;;(global-set-key "\t" 'self-insert-command)

(global-set-key (kbd "C-i") 'backward-kill-word)
(global-set-key (kbd "C-o") 'repeat)

;;(keyboard-translate ?\C-i ?\M-|)
;;(global-set-key [?\M-|] 'backward-kill-word)
;;(global-set-key "¿" 'tab-to-tab-stop)

(global-set-key "\C-u" 	  'kill-word)
(global-set-key "\M-i" 	  'my-backward-kill-line)
(global-set-key "\M-u" 	  'my-kill-line)
(global-set-key [delete] 'delete-char) ;; delete standard behaviour

  ;;;;;;;;;;;;;;;;;;;;;;;;
;; COPY / CUT / PASTE ;;
  ;;;;;;;;;;;;;;;;;;;;;;;;

(global-set-key (kbd "C-SPC c") 'my-clipboard-kill-ring-save)
(global-set-key (kbd "C-SPC d") 'kill-region)
(global-set-key (kbd "C-v") 	'yank)
(global-set-key (kbd "M-v") 	'yank-pop)

  ;;;;;;;;;;;;;;;;
;; RECTANGLES ;;
  ;;;;;;;;;;;;;;;;
(global-set-key (kbd "M-e") 'rectangle-mark-mode)
(global-set-key (kbd "C-SPC r c") 'copy-rectangle-to-register)    ;; supprime un rectangle en l'enregistrant
(global-set-key (kbd "C-SPC r v") 'yank-rectangle)   	;; insère le dernier rectangle enregistré
(global-set-key (kbd "C-SPC r o") 'open-rectangle)   	;; insère un rectangle de blancs
(global-set-key (kbd "C-SPC r d") 'kill-rectangle) 	;; supprime un rectangle sans l'enregistrer
(global-set-key (kbd "C-SPC r t") 'string-rectangle)   	;; insérer un string dans un rectangle

  ;;;;;;;;;;
;; WORD ;;
  ;;;;;;;;;;

;; PAGE
(global-set-key "\C-n" 'forward-word)
(global-set-key "\C-t" 'backward-word)

;; PARAGRAPH
(global-set-key "\C-d" 'my-backward-block)
(global-set-key "\C-l" 'my-forward-block)

;; BUFFER
(global-set-key "\M-d" 'beginning-of-buffer)
(global-set-key "\M-l" 'end-of-buffer)


  ;;;;;;;;;
;; DEV ;;
  ;;;;;;;;;


(global-set-key (kbd "C-SPC i") 'indent-region)

(global-set-key (kbd "C-SPC C-c")  'my-comment-line)

(global-unset-key (kbd "C-@"))
(global-set-key (kbd "C-@") 'Control-X-prefix)

;; Same with return and C-m
;;(keyboard-translate ?\C-m ?\C-&)
;;(global-set-key (kbd "C-&") 'newline-and-indent)
;;(global-set-key (kbd "RET") 'newline-and-indent)
(global-set-key (kbd "RET") 'newline-and-indent)
;; Same with C-c which is a prefix key
;;(keyboard-translate ?\C-j ?\C-.)
(global-unset-key (kbd "C-@ C-@"))
(global-set-key (kbd "C-SPC C-SPC") 'execute-extended-command)

;; Go 2 lines up or down
(global-set-key (kbd "\C-s") 'scroll-up-lot)
(global-set-key (kbd "\C-r") 'scroll-down-lot)

  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Completion automatique ;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key [(f1)] 'dabbrev-completion)
(global-set-key (kbd "C-q") 'dabbrev-expand)

(global-set-key (kbd "M-<down>") 'move-line-region-down)
(global-set-key (kbd "M-<up>") 'move-line-region-up)

;;(global-set-key (kbd "M-S-t") 'tabbar-backward-group)
;;(global-set-key (kbd "M-S-n") 'tabbar-forward-group)
;;(global-set-key "\M-t" 'tabbar-backward-tab)
;;(global-set-key "\M-n" 'tabbar-forward-tab)

  ;;;;;;;;;;;;;;;
;; Recherche ;;
  ;;;;;;;;;;;;;;;
(global-set-key (kbd "C-f") 'isearch-forward)
(global-set-key (kbd "M-f") 'isearch-backward)
(define-key isearch-mode-map "\C-f" 'isearch-repeat-forward)
(define-key isearch-mode-map "\M-f" 'isearch-repeat-backward)

;; ne detruit pas le serveur si le fichier dans lequel on se trouve est un client
(global-set-key (kbd "C-SPC q") 'intelligent-close)

  ;;;;;;;;;;;;;;;;;;;
;; FRAME SCALING ;;
  ;;;;;;;;;;;;;;;;;;;
(global-set-key (kbd "C-M-<left>")  'shrink-window-horizontally)
(global-set-key (kbd "C-M-<right>") 'enlarge-window-horizontally)
(global-set-key (kbd "C-M-<down>")  'shrink-window)
(global-set-key (kbd "C-M-<up>")    'enlarge-window)

  ;;;;;;;;;;;;;
;; Compile ;;
  ;;;;;;;;;;;;;
(global-set-key (kbd "C-p")  'recenter-top-bottom)

(global-set-key (kbd "C-SPC m")  'rename-this-buffer-and-file)

System

(message "\n -- setting system --\n")

(setq gc-cons-threshold 100000000) ;; speed up heavy processes (e.g: lsp)
;; Maximum number of bytes to read from subprocess in a single chunk.
;; Enlarge the value only if the subprocess generates very large (megabytes) amounts of data in one go.
(setq read-process-output-max (* 1024 1024)) ;; 1 mb (default value is 4096)

;; Fast boot
(modify-frame-parameters nil '((wait-for-wm . nil)))
(setq inhibit-startup-message t)
(fset 'yes-or-no-p 'y-or-n-p)

rest

;; Save cursor position when exiting a file
(save-place-mode)

;; Delete trailing whitespace on save
(add-hook 'before-save-hook 'delete-trailing-whitespace)

;; Always follow symlink
(setq vc-follow-symlinks t)

;; Opening file side by side rather than onTop/below
(setq split-height-threshold nil)
(setq split-width-threshold 0)

;; BACKUP
(defvar my-backup-directory (concat user-emacs-directory "backups"))
(unless (file-exists-p my-backup-directory)
  (make-directory my-backup-directory))
(setq backup-directory-alist
      `((".*" . ,my-backup-directory)))
(setq auto-save-file-name-transforms
      `((".*" ,my-backup-directory t)))
(setq delete-old-versions t
      backup-by-copying t          ; copy rather than rename, slower but simpler
      kept-new-versions 6
      kept-old-versions 2
      version-control t            ; version numbers for backup file
      delete-old-versions t
      delete-by-moving-to-trash t
      auto-save-default nil        ; no #file# backups
      )

;; UTF-8
(set-language-environment   'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-language-environment   'utf-8)
(prefer-coding-system       'utf-8)

;; refresh buffers content and dired listing when files get edited/deleted/added outside of emacs
(global-auto-revert-mode 1)
(setq global-auto-revert-non-file-buffers t)

;; Scroll behaviour
(setq redisplay-dont-pause t
      scroll-margin 1
      ;; content moves of only one line at end of windown
      scroll-step 1
      scroll-conservatively 10000
      ;; Cursor position fixed when page is scrolled
      scroll-preserve-screen-position 1)

;; No carriage return for long line
(if (boundp 'truncate-lines)
    (setq-default truncate-lines t) ; always truncate
  (progn
    (setq hscroll-margin 1)
    (setq auto-hscroll-mode 1)
    (setq automatic-hscrolling t)))

;; No visual nor audible alert
(setq visible-bell 'nil
      ring-bell-function 'ignore)

;; Save cursor position and load it automatically when opening file
(setq save-place-file (concat user-emacs-directory "saveplace"))
(setq-default save-place t)
(require 'saveplace)

;; Find case sensitive
(setq case-fold-search t)

;; Selection can be overwrite
(delete-selection-mode 1)

;; Mouse support
(if (load "mwheel" t)
    (mwheel-install))

;; Corresponding parentheses shown
(require 'paren)
(show-paren-mode t)
(setq blink-matching-paren t
      blink-matching-paren-on-screen t
      blink-matching-paren-dont-ignore-comments t)

;; Automatic completion
(require 'dabbrev)
(set 'dabbrev-case-fold-search nil)
(set 'dabbrev-case-replace nil)
(global-set-key [(f1)] 'dabbrev-completion)
(global-set-key (kbd "\C-q") (quote dabbrev-expand))

;; Mode associated to file extension
(setq auto-mode-alist
      (append
       '(("\\.C$"    . c++-mode)
         ("\\.H$"    . c++-mode)
         ("\\.cc$"   . c++-mode)
         ("\\.hh$"   . c++-mode)
         ("\\.c$"    . c-mode)
         ("\\.h$"    . c++-mode)
         ("\\.m$"    . objc-mode)
         ("\\.java$" . java-mode)
         ("\\.tex$"  . latex-mode)
         ("\\.markdown$" . markdown-mode)
         ("\\.md$" . markdown-mode)
         ) auto-mode-alist))

;; Use same buffer for compilation
(setq-default display-buffer-reuse-frames t)

;; Allow narrowing region
(put 'narrow-to-region 'disabled nil)

;; Allow downcase-region
(put 'downcase-region 'disabled nil)

;; Indent with space only
(setq-default indent-tabs-mode nil)

(setq dired-recursive-deletes 'always)
(setq dired-recursive-copies 'always)

;; Tramp default to ssh
(setq tramp-default-method "ssh")

;; hide flymake logs on init
(remove-hook 'flymake-diagnostic-functions 'flymake-proc-legacy-flymake)

;; connect as root to a remote ssh server: C-f /ssh:prod|sudo:root@prod:/

Mode

(message "\n -- setting plugin --\n")

(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)

(defun install-package (name)
  (unless (package-installed-p name)
    (package-refresh-contents) (package-install name)))

ace jump mode

jump to any word or initial

(install-package 'ace-jump-mode)
(require 'ace-jump-mode)
(setq ace-jump-mode-case-fold nil) ;; don't ignore case
(global-set-key (kbd "C-j") 'ace-jump-mode)
(global-set-key (kbd "M-j") 'ace-jump-char-mode)

bm - bookmark

(install-package 'bm)

(global-set-key (kbd "M-m") 'bm-toggle)
(global-set-key (kbd "M-s") 'bm-next)
(global-set-key (kbd "M-r") 'bm-previous)
(setq bm-highlight-style 'bm-highlight-only-line) ;;default, the last one in the pic
(setq bm-marker 'bm-marker-right)

csv

(install-package 'csv-mode)

centaur tabs

(install-package 'centaur-tabs)
(require 'centaur-tabs)
(centaur-tabs-headline-match)
(centaur-tabs-mode t)
(global-set-key (kbd "M-t")  'centaur-tabs-backward)
(global-set-key (kbd "M-n") 'centaur-tabs-forward)
(setq centaur-tabs-set-modified-marker t
      centaur-tabs-modified-marker "*"
      centaur-tabs-set-close-button nil
      centaur-tabs-cycle-scope 'tabs)

dash

A modern list api for Emacs

(install-package 'dash)
(require 'dash)

diff-hl

(install-package 'diff-hl)
(global-diff-hl-mode)
(unless (window-system) (diff-hl-margin-mode))

(add-hook 'magit-pre-refresh-hook 'diff-hl-magit-pre-refresh)
(add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh)

elm

(install-package 'elm-mode)

expand region

incrementally expand region to word -> string -> paragraph -> …

(install-package 'expand-region)
;;(global-set-key (kbd "M-o") 'er/expand-region)
;;(global-set-key (kbd "M-O") 'er/contract-region)

flx-ido

;; auto completion a la Sublime when searching for files

(install-package 'flx-ido)
(require 'flx-ido)
(setq ido-enable-flex-matching t
      ido-use-faces nil) ; disable color
(ido-mode 1)
(ido-everywhere 1)
(flx-ido-mode 1)

github markdown

(install-package 'markdown-mode)
(autoload 'markdown-mode "markdown-mode" "Major mode for editing Markdown files" t)

rg

ripgrep for emacs

(install-package 'rg)

hlint

;;(load "~/.emacs.d/hs-lint")

;;(defun my-haskell-mode-hook ()
;;    (local-set-key "\C-cl" 'hs-lint))
;;(add-hook 'haskell-mode-hook 'my-haskell-mode-hook)

multiple cursor

(install-package 'multiple-cursors)

(global-set-key (kbd "M-S-<down>") 'mc/mark-next-like-this)
(global-set-key (kbd "M-S-<up>") 'mc/unmark-next-like-this)

magit

(install-package 'magit)

;; prevent instructions from being shown at startup
(setq magit-last-seen-setup-instructions "1.4.0")
;; show magit on full screen when invoking it
(setq magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)

org

(install-package 'toc-org)
(add-hook 'org-mode-hook 'toc-org-mode)

projectile

find file in a git scoped project

(install-package 'projectile)
(projectile-mode)
(global-set-key (kbd "C-SPC a") 'projectile-find-file)
(global-set-key (kbd "C-SPC p") 'projectile-switch-project)

perspective

;;(install-package 'perspective)
;;(require 'perspective)
;;(persp-mode)

tab-bar

(tab-bar-mode)

(global-set-key (kbd "M-T") 'tab-previous)
(global-set-key (kbd "M-N") 'tab-next)

savehist-mode

In minibuffers, use M-p (previous-history-elements) and M-n (next-history-elements) to show previously saved commands

(savehist-mode 1)

yasnippet

(install-package 'yasnippet)
(install-package 'yasnippet-snippets)
(require 'yasnippet)
(yas-global-mode 1)
(define-key yas-minor-mode-map (kbd "<tab>") nil)
(define-key yas-minor-mode-map (kbd "M-q") #'yas-expand)
;; to show available snippets in current mode: M-x yas-describe-tables

Dev

Nix

(install-package 'nix-mode)

Haskell

(install-package 'haskell-mode)
(require 'haskell-mode)
(require 'haskell-interactive-mode)
(require 'haskell-process)

;; This will auto insert "module XXX where" template when creating a new XXX.hs file
(add-hook 'haskell-mode-hook 'haskell-auto-insert-module-template)

(add-hook 'haskell-mode-hook 'interactive-haskell-mode)

;; With ghc 8.X, errors are no longer shown in the repl. This fix it !
(setq haskell-process-args-stack-ghci
      '("--ghci-options=-ferror-spans -fshow-loaded-modules"
        "--no-build" "--no-load"))

(setq haskell-compile-cabal-build-command "stack build")

;; Create tags on save

(define-key haskell-mode-map (kbd "M-.") 'haskell-mode-tag-find)

;; somehow this settings remove the pragma: {-# LANGUAGE ViewPatterns #-} on every save...
                                        ;(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.
                                        ; '(haskell-stylish-on-save t)
                                        ; '(package-selected-packages
                                        ;   '(lsp-mode hs-lint nix-mode haskell-mode outshine helm-ag csv-mode elm-mode markdown-mode magit multiple-cursors expand-region ace-jump-mode projectile flx-ido grip-mode try dash)))

git link

(install-package 'git-link)

(defalias 'gl 'git-link)
(defalias 'glc 'git-link-commit)

Lsp - language server protocol

  (install-package 'lsp-mode)
  (install-package 'lsp-haskell)
  (install-package 'lsp-ui)

  (require 'lsp-mode)
  (add-hook 'haskell-mode-hook #'lsp)
  (add-hook 'elm-mode-hook #'lsp)
  (add-hook 'haskell-literate-mode-hook #'lsp)

  (setq lsp-enable-file-watchers nil) ; not sure why we would need this but enabling this on big project slows down everything considerably

  (setq lsp-keymap-prefix "C-b")
  (define-key lsp-mode-map (kbd "C-b") lsp-command-map)
  (define-key lsp-command-map (kbd "e") 'lsp-execute-code-action)
  (define-key lsp-command-map (kbd "r") 'lsp-find-references)
  (define-key lsp-command-map (kbd "d") 'lsp-find-definition)

  (setq lsp-ui-sideline-show-code-actions t ;; show code actions in sideline
        lsp-ui-doc-show-with-cursor t ;; move the cursor over a symbol to show the doc
        )


  ;;(setq lsp-keymap-prefix (kbd "C-c C-l"))

    ;;; Shortcuts

  (eval-after-load "haskell-mode"
    '(progn
       (define-key haskell-mode-map (kbd "C-c C-c") 'haskell-compile)
       (define-key haskell-mode-map (kbd "C-c C-l") 'my-haskell-process-load-file)
       (define-key haskell-mode-map (kbd "C-c C-m") 'my-load-and-execute)
       (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type)
       (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info)
       ))

;;  (define-key haskell-mode-map (kbd "M-s") 'haskell-interactive-mode-history-previous)
;;  (define-key haskell-mode-map (kbd "M-r") 'haskell-interactive-mode-history-next)
  (define-key haskell-cabal-mode-map (kbd "M-n") 'centaur-tabs-forward)

  (defun my-haskell-process-load-file ()
    (interactive)
    "clear console & load code"
                                          ;  (when (fboundp 'haskell-interactive-mode-clear)
    (haskell-interactive-mode-clear)
    (haskell-process-load-file))

  (defun my-load-and-execute ()
    (interactive)
    "load or reload code and execute the m function if present"
    (save-excursion
      (my-haskell-process-load-file)
      (haskell-interactive-switch)
      (insert "main")
      (haskell-interactive-mode-return)
      (sit-for 0.500)
      (haskell-interactive-switch-back)
      ))

Ruby

;; Enhanced Ruby Mode

(install-package 'ruby-mode)
(require 'ruby-mode)

(defun set-newline-and-indent ()
  (local-set-key (kbd "RET") 'newline-and-indent)
  (local-unset-key (kbd "C-j"))
  )
(add-hook 'ruby-mode-hook 'set-newline-and-indent)

;; do not add header => -*- coding: utf-8 -*-
(setq ruby-insert-encoding-magic-comment nil)

HTML

(setq web-mode-markup-indent-offset 2)
(setq web-mode-css-indent-offset 2)
(setq web-mode-code-indent-offset 2)

CSS

(setq css-indent-offset 2)
(setq scss-indent-offset 2)

Javascript

(setq js-indent-level 2)

Appearance

(message "\n -- setting appeareance --\n")

;; No menu nor bar
(tool-bar-mode 0)
(menu-bar-mode 0)

;; syntaxical colorisation enabled
(require 'font-lock)
(global-font-lock-mode t)
(setq font-lock-maximum-decoration t)

;; 24h hour format
(display-time)
(setq display-time-24hr-format t)

;; Line and column number enabled / highlight current line
(global-display-line-numbers-mode)
(column-number-mode t)
(line-number-mode t)
(global-hl-line-mode 1)

;; No blinking cursor
(blink-cursor-mode nil)

;; Frame name = edited file name
(setq frame-title-format '(buffer-file-name "%f"))

Themes

Theme synchronize with daylight. Theme is light during daytime and dark otherwise.

(install-package 'doom-themes)

(setq default-theme 'doom-one-light)
(load-theme default-theme t)

(defun synchronize-theme ()
  (let* ((light-theme 'doom-one-light)
         (dark-theme 'doom-one)
         (start-time-light-theme 8) ;; from 8h
         (end-time-light-theme 19)   ;; to   19h
         (current-hour (string-to-number (substring (current-time-string) 11 13)))
         (next-theme (if (member current-hour (number-sequence start-time-light-theme end-time-light-theme))
                         light-theme dark-theme)))
    (when (not (equal default-theme next-theme))
      (setq default-theme next-theme)
      (load-theme next-theme t))))

;; run every 15min
(run-with-timer 0 900 'synchronize-theme)

Custom

(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.
 '(bm-face ((t (:background "gray88" :foreground "black"))))
 '(centaur-tabs-default ((t (:background "#f0f0f0"))))
 '(centaur-tabs-selected ((t (:background "sky blue" :foreground "black"))))
 '(centaur-tabs-selected-modified ((t (:background "sky blue" :foreground "black"))))
 '(centaur-tabs-unselected ((t (:background "#f0f0f0" :foreground "black"))))
 '(centaur-tabs-unselected-modified ((t (:background "#f0f0f0" :foreground "black"))))
 ;; '(warning-suppress-log-types '(((flymake flymake-proc)) (comp)))
 ;; '(warning-suppress-types '(((flymake flymake-proc)) (comp)))
 '(tab-bar ((t (:background "#f0f0f0" :foreground "black" :box nil))))
 '(tab-bar-tab ((t (:background "sky blue" :foreground "black" :box nil))))
 '(tab-bar-tab-group-current ((t (:inherit tab-bar-tab :weight bold))))
 '(tab-line-tab-current ((t (:background "sky blue" :foreground "black")))))
'(centaur-tabs-default ((t (:background "#f0f0f0"))))
(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.
 '(centaur-tabs-show-new-tab-button nil)
 '(lsp-enable-file-watchers nil)
 '(package-selected-packages
   '(perspective yasnippet-snippets yasnippet rip-grep git-link lsp-ui doom-themes centaur-tabs lsp-haskell lsp-mode haskell-mode nix-mode helm-ag csv-mode elm-mode markdown-mode magit multiple-cursors expand-region ace-jump-mode projectile flx-ido tabbar dash))
 '(tab-bar-close-button-show nil)
 '(tab-bar-close-tab-select 'left)
 '(tab-bar-new-button-show nil)
 '(tab-bar-new-tab-to 'rightmost)
 '(warning-suppress-types '((comp))))

Desktop save mode

Save your current session when you exit emacs and load it back when you start emacs.

(desktop-save-mode)
;; save the session in the directory where emacs was invoked
(setq desktop-path '("."))
(desktop-read ".")
;; if another emacs session is opened, don't show a warning
(setq desktop-load-locked-desktop t)

.emacs.d's People

Contributors

matsumonkie avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.