;;; programming.el --- Module file for programming configuration. ;; ;; Copyright (C) 2017 Wojciech Kozlowski ;; ;; Author: Wojciech Kozlowski ;; Created: 28 Aug 2017 ;; ;; This file is not part of GNU Emacs. ;; ;;; Commentary: ;; ;; This module sets up packages and configuration for editing source code in ;; all languages. ;; ;;; License: GPLv3 ;;; Required packages: (setq init-packages/programming-packages '(yasnippet) ) ;; Configuration: (defun init-packages/init-programming () ;; -------------------------------------------------------------------------- ;; Line numbers. ;; -------------------------------------------------------------------------- (setq-default linum-format "%4d \u2502") ;; Line number format (add-hook 'prog-mode-hook 'linum-mode) ;; Only in programming modes ;; -------------------------------------------------------------------------- ;; Formatting settings. ;; -------------------------------------------------------------------------- (setq-default c-default-style "linux") ;; -------------------------------------------------------------------------- ;; Enable yasnippet. ;; -------------------------------------------------------------------------- (use-package yasnippet :init (yas-global-mode 1)) ;; -------------------------------------------------------------------------- ;; Trailing whitespace. ;; -------------------------------------------------------------------------- ;; The following setting of `show-trailing-whitespace' is incompatible with ;; fci-mode. The only known workaround is to have whitespace mode on with ;; whitespace-style set such that only trailing whitespace is shown. At the ;; moment, just rely on `ws-butler'. ;; (add-hook 'prog-mode-hook (lambda () ;; (interactive) ;; (setq show-trailing-whitespace t))) ;; -------------------------------------------------------------------------- ;; Automatically indent yanked text in programming mode. ;; -------------------------------------------------------------------------- (defvar yank-indent-modes '(LaTeX-mode TeX-mode) "Modes in which to indent regions that are yanked (or yank-popped). Only modes that don't derive from `prog-mode' should be listed here.") (defvar yank-indent-blacklisted-modes '(python-mode slim-mode haml-mode) "Modes for which auto-indenting is suppressed.") (defvar yank-advised-indent-threshold 10000 "Threshold (# chars) over which indentation does not automatically occur.") (defun yank-advised-indent-function (beg end) "Do indentation, as long as the region isn't too large." (if (<= (- end beg) yank-advised-indent-threshold) (indent-region beg end nil))) (defadvice yank (after yank-indent activate) "If current mode is one of 'yank-indent-modes, indent yanked text (with prefix arg don't indent)." (if (and (not (ad-get-arg 0)) (not (member major-mode yank-indent-blacklisted-modes)) (or (derived-mode-p 'prog-mode) (member major-mode yank-indent-modes))) (let ((transient-mark-mode nil)) (yank-advised-indent-function (region-beginning) (region-end))))) (defadvice yank-pop (after yank-pop-indent activate) "If current mode is one of `yank-indent-modes', indent yanked text (with prefix arg don't indent)." (when (and (not (ad-get-arg 0)) (not (member major-mode yank-indent-blacklisted-modes)) (or (derived-mode-p 'prog-mode) (member major-mode yank-indent-modes))) (let ((transient-mark-mode nil)) (yank-advised-indent-function (region-beginning) (region-end))))) )