emacs.d/init.el
Stefan Schwarz 8aecc9f23a add php mode
2019-09-02 14:35:13 +02:00

435 lines
15 KiB
EmacsLisp

;;; init.el --- spacemacs like config
;; foosinn
;;; Commentary:
;; my config
;;; Code:
;; sane defaults
(setq delete-old-versions -1 ) ; delete excess backup versions silently
(setq version-control t ) ; use version control
(setq vc-make-backup-files t ) ; make backups file even when in version controlled dir
(setq backup-directory-alist `(("." . "~/.emacs.d/backups")) ) ; which directory to put backups file
(setq vc-follow-symlinks t ) ; don't ask for confirmation when opening symlinked file
(setq auto-save-file-name-transforms '((".*" "~/.emacs.d/auto-save-list/" t)) ) ;transform backups file name
(setq inhibit-startup-screen t ) ; inhibit useless and old-school startup screen
(setq ring-bell-function 'ignore ) ; silent bell when you make a mistake
(setq coding-system-for-read 'utf-8 ) ; use utf-8 by default
(setq coding-system-for-write 'utf-8 )
(setq sentence-end-double-space nil) ; sentence SHOULD end with only a point.
(setq default-fill-column 80) ; toggle wrapping text at the 80th character
(setq initial-scratch-message "Welcome in Emacs") ; print a default message in the empty scratch buffer opened at startup
;; global keybindings
(global-set-key (kbd "C-k") 'previous-line)
(global-set-key (kbd "C-j") 'next-line)
;; package manager
(require 'package)
(setq package-enable-at-startup nil) ; tells emacs not to load any packages before starting up
(setq package-archives '(("org" . "http://orgmode.org/elpa/")
("gnu" . "http://elpa.gnu.org/packages/")
("melpa" . "https://melpa.org/packages/")))
(package-initialize)
;; use package
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package))
(require 'use-package)
;; themes
(use-package doom-themes :ensure t
:config
(load-theme 'doom-snazzy t))
(use-package all-the-icons :ensure t)
(use-package doom-modeline :ensure t
:hook (after-init . doom-modeline-mode))
(set-face-attribute 'default nil
:family "Meslo LG S DZ"
:height 105
:weight 'normal
:width 'normal)
;; evil config
(use-package evil :ensure t
:config (evil-mode 1))
(use-package evil-surround
:ensure t
:config
(global-evil-surround-mode 1)
(evil-define-key 'visual evil-surround-mode-map "s" 'evil-surround-region)
)
;; ivy config
(use-package ivy :ensure t
:config
(setq ivy-height 10)
(setq ivy-use-virtual-buffers t)
(setq enable-recursive-minibuffers t)
(setq ivy-re-builders-alist
'((swiper . ivy--regex-plus)
(t . ivy--regex-fuzzy)))
(ivy-mode 1)
(define-key ivy-minibuffer-map (kbd "C-j") 'ivy-next-line)
(define-key ivy-minibuffer-map (kbd "C-k") 'ivy-previous-line)
(define-key ivy-minibuffer-map (kbd "C-h") (kbd "DEL"))
(define-key ivy-minibuffer-map (kbd "C-S-h") help-map)
(define-key ivy-minibuffer-map (kbd "C-l") 'ivy-alt-done)
(define-key ivy-minibuffer-map (kbd "<escape>") 'minibuffer-keyboard-quit))
(use-package ivy-xref :ensure t
:init (setq xref-show-xrefs-function #'ivy-xref-show-xrefs))
(use-package ivy-rich :ensure t
:config (ivy-rich-mode 1))
;; counsel
(use-package counsel :ensure t
:config (counsel-mode 1))
(use-package counsel-projectile :ensure t)
(use-package swiper :ensure t)
;; projectile
(use-package projectile :ensure t
:config (projectile-mode +1))
;; which key
(use-package which-key :ensure t
:config
(which-key-mode 1)
(which-key-setup-side-window-bottom)
(which-key-setup-minibuffer)
(setq which-key-idle-delay .3)
)
;; langs
;;
;; golang
(use-package go-mode :ensure t
:config (add-to-list 'auto-mode-alist '("\\.go\\'" . go-mode)))
;; yaml
(use-package yaml-mode :ensure t
:config
(add-to-list 'auto-mode-alist '("\\.yaml\\'" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
)
;; dockerfile
(use-package dockerfile-mode :ensure t
:config (add-to-list 'auto-mode-alist '("Dockerfile\\'" . dockerfile-mode)))
(use-package puppet-mode :ensure t
:config
(add-to-list 'auto-mode-alist '("\\.pp\\'" . puppet-mode))
(general-define-key
:states '(normal visual insert emacs)
:keymaps 'puppet-mode-map
:prefix "SPC"
:non-normal-prefix "C-SPC"
"ma" 'puppet-align-block
)
)
;; php
(use-package php-mode :ensure t)
;; code-with-fun
(use-package company
:config
(global-company-mode 1)
(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(define-key company-active-map (kbd "C-j") 'company-select-next)
(define-key company-active-map (kbd "C-k") 'company-select-previous)
(setq company-idle-delay 0.2
company-minimum-prefix-length 2
company-require-match nil
company-dabbrev-ignore-case nil
company-dabbrev-downcase nil)
)
(use-package lsp-mode :ensure t
:commands (lsp lsp-deferred)
:hook
(c++-mode . lsp-deferred)
(dockerfile-mode . lsp-deferred)
(go-mode . lsp-deferred)
(javascript-mode . lsp-deferred)
(js-mode . lsp-deferred)
(python-mode . lsp-deferred)
(ruby-mode . lsp-deferred)
(rust-mode . lsp-deferred)
:config
(setq lsp-auto-configure t
lsp-prefer-flymake nil
lsp-auto-guess-root nil)
)
(use-package flycheck :ensure t
:init (global-flycheck-mode))
(use-package lsp-ui :ensure t
:commands lsp-ui-mode)
(use-package company-lsp :ensure t
:commands company-lsp)
(use-package yasnippet :ensure t
:config (yas-global-mode 1))
(use-package yasnippet-snippets :ensure t)
(use-package smartparens :ensure t
:config (smartparens-global-mode 1))
;; treemacs
(use-package treemacs :ensure t)
(use-package lsp-treemacs :ensure t
:commands lsp-treemacs-errors-list)
(use-package treemacs-evil :ensure t
:after treemacs evil)
(use-package treemacs-evil :ensure t
:after treemacs evil)
(use-package treemacs-evil :ensure t
:after treemacs evil)
;; magit
(use-package evil-magit :ensure t)
(use-package magit :ensure t)
;; general config
(use-package general :ensure t
:config
(menu-bar-mode -1)
(toggle-scroll-bar -1)
(tool-bar-mode -1)
(general-define-key
:states '(normal visual insert emacs)
:prefix "SPC"
:non-normal-prefix "C-SPC"
;; simple command
"SPC" 'counsel-M-x
"'" '(iterm-focus :which-key "iterm")
"?" '(iterm-goto-filedir-or-home :which-key "iterm - goto dir")
"/" 'counsel-ag
"TAB" '(switch-to-last-buffer :which-key "prev buffer")
;; Applications
"a" '(:ignore t :which-key "Applications")
"ar" 'ranger
"ad" 'dired
;; Buffers
"b" '(:ignore t :which-key "Buffers")
"bb" 'switch-to-buffer
"bd" 'evil-delete-buffer
"bn" 'next-buffer
"bn" 'next-buffer
"bs" 'switch-to-scratch-buffer
;; Files
"ff" 'counsel-find-file
"fL" 'counsel-locate
"fr" 'counsel-recentf
"fR" 'rename-current-buffer-file
"fD" 'delete-current-buffer-file
"fc" 'copy-file'
;; Git
"g" '(:ignore t :which-key "Magit")
"gfh" 'magit-log-buffer-file
"gm" 'magit-dispatch-popup
"gs" 'magit-status
"gS" 'magit-stage-file
"gU" 'magit-unstage-file
;; Langs
"mf" 'lsp-format-buffer
"mgg" 'lsp-find-definition
"mh" 'lsp-describe-thing-at-point
"mj" 'imenu
"me" 'lsp-ui-flycheck-list
;; Projectile
"p" '(:ignore t :which-key "Projectile")
"p SPC" 'counsel-projectile
"pb" 'counsel-projectile-switch-to-buffer
"pd" 'counsel-projectile-find-dir
"pp" 'counsel-projectile-switch-project
"pf" 'counsel-projectile-find-file
"pr" 'projectile-recentf
;; Swyper
"s" '(:ignore t :which-key "Swyper")
"ss" 'swiper
"sb" 'swiper-all
"sw" 'avy-goto-word-0
;; Treemacs
"ft" 'treemacs
"fB" 'treemacs-bookmark
"fT" 'treemacs-find-file
"f M-t" 'treemacs-find-tag
;; Window
"w" '(:ignore t :which-key "Window")
"w=" 'balance-windows-area
"wd" 'evil-window-delete
"w <down>" 'evil-window-down
"wf" 'follow-mode
"wF" 'make-frame
"wh" 'evil-window-left
"wH" 'evil-window-move-far-left
"wj" 'evil-window-down
"wJ" 'evil-window-move-very-bottom
"wK" 'evil-window-move-very-top
"wk" 'evil-window-up
"w <left>" 'evil-window-left
"wL" 'evil-window-move-far-right
"wl" 'evil-window-right
"wm" 'toggle-maximize-buffer
"wo" 'other-frame
"w <right>" 'evil-window-right
"w <S-down>" 'evil-window-move-very-bottom
"w <S-left>" 'evil-window-move-far-left
"w-" 'split-window-below
"w/" 'split-window-right
"w <S-right>" 'evil-window-move-far-right
"ws" 'split-window-below
"wS" 'split-window-below-and-focus
"w <S-up>" 'evil-window-move-very-top
"w <up>" 'evil-window-up
"wU" 'winner-redo
"wu" 'winner-undo
"wv" 'split-window-right
"wV" 'split-window-right-and-focus
"ww" 'other-window
"wx" 'kill-buffer-and-window
))
;; custom functions
(defun toggle-maximize-buffer () "Maximize buffer."
(interactive)
(save-excursion
(if (and (= 1 (length (window-list)))
(assoc ?_ register-alist))
(jump-to-register ?_)
(progn
(window-configuration-to-register ?_)
(delete-other-windows)))))
(defun switch-to-scratch-buffer (&optional arg)
"Switch to the `*scratch*' buffer, creating it first if needed.
if prefix argument ARG is given, switch to it in an other, possibly new window."
(interactive "P")
(let ((exists (get-buffer "*scratch*")))
(if arg
(switch-to-buffer-other-window (get-buffer-create "*scratch*"))
(switch-to-buffer (get-buffer-create "*scratch*")))))
(defun switch-to-last-buffer ()
"Switch to the last buffer, allowes quick jumping between the last two."
(interactive)
(switch-to-buffer nil))
(defun delete-current-buffer-file ()
"Remove file connected to current buffer and kill buffer."
(interactive)
(let ((filename (buffer-file-name))
(buffer (current-buffer))
(name (buffer-name)))
(if (not (and filename (file-exists-p filename)))
(ido-kill-buffer)
(if (yes-or-no-p
(format "Are you sure you want to delete this file: '%s'?" name))
(progn
(delete-file filename t)
(kill-buffer buffer)
(when (projectile-project-p)
(call-interactively #'projectile-invalidate-cache))
(message "File deleted: '%s'" filename))
(message "Canceled: File deletion")))))
(defun rename-current-buffer-file (&optional arg)
"Rename the current buffer and the file it is visiting.
If the buffer isn't visiting a file, ask if it should
be saved to a file, or just renamed.
If called without a prefix argument (ARG), the prompt is
initialized with the current directory instead of filename."
(interactive "P")
(let* ((name (buffer-name))
(filename (buffer-file-name)))
(if (and filename (file-exists-p filename))
;; the buffer is visiting a file
(let* ((dir (file-name-directory filename))
(new-name (read-file-name "New name: " (if arg dir filename))))
(cond ((get-buffer new-name)
(error "A buffer named '%s' already exists!" new-name))
(t
(let ((dir (file-name-directory new-name)))
(when (and (not (file-exists-p dir))
(yes-or-no-p
(format "Create directory '%s'?" dir)))
(make-directory dir t)))
(rename-file filename new-name 1)
(rename-buffer new-name)
(set-visited-file-name new-name)
(set-buffer-modified-p nil)
(when (fboundp 'recentf-add-file)
(recentf-add-file new-name)
(recentf-remove-if-non-kept filename))
(when (projectile-project-p)
(call-interactively #'projectile-invalidate-cache))
(message "File '%s' successfully renamed to '%s'"
name (file-name-nondirectory new-name)))))
;; the buffer is not visiting a file
(let ((key))
(while (not (memq key '(?s ?r)))
(setq key (read-key (propertize
(format
(concat "Buffer '%s' is not visiting a file: "
"[s]ave to file or [r]ename buffer?")
name)
'face 'minibuffer-prompt)))
(cond ((eq key ?s) ; save to file
;; this allows for saving a new empty (unmodified) buffer
(unless (buffer-modified-p) (set-buffer-modified-p t))
(save-buffer))
((eq key ?r) ; rename buffer
(let ((new-name (read-string "New buffer name: ")))
(while (get-buffer new-name)
;; ask to rename again, if the new buffer name exists
(if (yes-or-no-p
(format (concat "A buffer named '%s' already exists: "
"Rename again?")
new-name))
(setq new-name (read-string "New buffer name: "))
(keyboard-quit)))
(rename-buffer new-name)
(message "Buffer '%s' successfully renamed to '%s'"
name new-name)))
;; ?\a = C-g, ?\e = Esc and C-[
((memq key '(?\a ?\e)) (keyboard-quit))))))))
(defun copy-file ()
"Write the file under new name."
(interactive)
(call-interactively 'write-file))
;; other
(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.
'(custom-safe-themes
(quote
("427fa665823299f8258d8e27c80a1481edbb8f5463a6fb2665261e9076626710" "614e5089876ea69b515c50b6d7fa0a37eb7ed50fda224623ec49e1c91a0af6a1" "93a0885d5f46d2aeac12bf6be1754faa7d5e28b27926b8aa812840fe7d0b7983" "b0fd04a1b4b614840073a82a53e88fe2abc3d731462d6fde4e541807825af342" "cdb3e7a8864cede434b168c9a060bf853eeb5b3f9f758310d2a2e23be41a24ae" "ef4edbfc3ec509612f3cf82476beddd2aeb3da7bdc3a35726337a0cc838a4ef4" "a16e816774b437acb78beb9916a60ea236cfcd05784227a7d829623f8468c5a2" "8c847a5675ece40017de93045a28ebd9ede7b843469c5dec78988717f943952a" "e3c87e869f94af65d358aa279945a3daf46f8185f1a5756ca1c90759024593dd" "db10381a554231a40b7474eaac28bd58f05067faacce3b25d294bb179a3511a1" "34c99997eaa73d64b1aaa95caca9f0d64229871c200c5254526d0062f8074693" "868abc288f3afe212a70d24de2e156180e97c67ca2e86ba0f2bf9a18c9672f07" default)))
'(package-selected-packages
(quote
(puppet-mode smartparens yaml-mode ivy-hydra ivy-rich evy use-package general evil avy))))
(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.
)
(provide 'init)
;;; init.el ends here