(provide 'setup-editing)
|
|
;; GROUP: Editing -> Editing Basics
|
(setq global-mark-ring-max 5000 ; increase mark ring to contains 5000 entries
|
mark-ring-max 5000 ; increase kill ring to contains 5000 entries
|
mode-require-final-newline t ; add a newline to end of file
|
)
|
|
(setq c-default-style "linux")
|
|
(set-terminal-coding-system 'utf-8)
|
(set-keyboard-coding-system 'utf-8)
|
(set-language-environment "UTF-8")
|
(prefer-coding-system 'utf-8)
|
|
(setq-default indent-tabs-mode t)
|
(delete-selection-mode)
|
(global-set-key (kbd "RET") 'newline-and-indent)
|
|
;; GROUP: Editing -> Killing
|
(setq
|
kill-ring-max 5000 ; increase kill-ring capacity
|
kill-whole-line t ; if NIL, kill whole line and move the next line up
|
)
|
|
;; display whitespace characters
|
(global-set-key (kbd "C-c w") 'whitespace-mode)
|
|
;; show important whitespace in diff-mode
|
(add-hook 'diff-mode-hook (lambda ()
|
(setq-local whitespace-style
|
'(face
|
tabs
|
tab-mark
|
spaces
|
space-mark
|
trailing
|
indentation::space
|
indentation::tab
|
newline
|
newline-mark))
|
(whitespace-mode 1)))
|
|
|
(defun prelude-move-beginning-of-line (arg)
|
"Move point back to indentation of beginning of line.
|
|
Move point to the first non-whitespace character on this line.
|
If point is already there, move to the beginning of the line.
|
Effectively toggle between the first non-whitespace character and
|
the beginning of the line.
|
|
If ARG is not nil or 1, move forward ARG - 1 lines first. If
|
point reaches the beginning or end of the buffer, stop there."
|
(interactive "^p")
|
(setq arg (or arg 1))
|
|
;; Move lines first
|
(when (/= arg 1)
|
(let ((line-move-visual nil))
|
(forward-line (1- arg))))
|
|
(let ((orig-point (point)))
|
(back-to-indentation)
|
(when (= orig-point (point))
|
(move-beginning-of-line 1))))
|
|
(global-set-key (kbd "C-a") 'prelude-move-beginning-of-line)
|
|
(defadvice kill-ring-save (before slick-copy activate compile)
|
"When called interactively with no active region, copy a single
|
line instead."
|
(interactive
|
(if mark-active (list (region-beginning) (region-end))
|
(message "Copied line")
|
(list (line-beginning-position)
|
(line-beginning-position 2)))))
|
|
(defadvice kill-region (before slick-cut activate compile)
|
"When called interactively with no active region, kill a single
|
line instead."
|
(interactive
|
(if mark-active (list (region-beginning) (region-end))
|
(list (line-beginning-position)
|
(line-beginning-position 2)))))
|
|
;; kill a line, including whitespace characters until next non-whiepsace character
|
;; of next line
|
(defadvice kill-line (before check-position activate)
|
(if (member major-mode
|
'(emacs-lisp-mode scheme-mode lisp-mode
|
c-mode c++-mode objc-mode
|
latex-mode plain-tex-mode))
|
(if (and (eolp) (not (bolp)))
|
(progn (forward-char 1)
|
(just-one-space 0)
|
(backward-char 1)))))
|
|
;; taken from prelude-editor.el
|
;; automatically indenting yanked text if in programming-modes
|
(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 1000
|
"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)))))
|
|
;; prelude-core.el
|
(defun prelude-duplicate-current-line-or-region (arg)
|
"Duplicates the current line or region ARG times.
|
If there's no region, the current line will be duplicated. However, if
|
there's a region, all lines that region covers will be duplicated."
|
(interactive "p")
|
(pcase-let* ((origin (point))
|
(`(,beg . ,end) (prelude-get-positions-of-line-or-region))
|
(region (buffer-substring-no-properties beg end)))
|
(-dotimes arg
|
(lambda (n)
|
(goto-char end)
|
(newline)
|
(insert region)
|
(setq end (point))))
|
(goto-char (+ origin (* (length region) arg) arg))))
|
|
;; prelude-core.el
|
(defun indent-buffer ()
|
"Indent the currently visited buffer."
|
(interactive)
|
(indent-region (point-min) (point-max)))
|
|
;; prelude-editing.el
|
(defcustom prelude-indent-sensitive-modes
|
'(coffee-mode python-mode slim-mode haml-mode yaml-mode)
|
"Modes for which auto-indenting is suppressed."
|
:type 'list)
|
|
(defun indent-region-or-buffer ()
|
"Indent a region if selected, otherwise the whole buffer."
|
(interactive)
|
(unless (member major-mode prelude-indent-sensitive-modes)
|
(save-excursion
|
(if (region-active-p)
|
(progn
|
(indent-region (region-beginning) (region-end))
|
(message "Indented selected region."))
|
(progn
|
(indent-buffer)
|
(message "Indented buffer.")))
|
(whitespace-cleanup))))
|
|
(global-set-key (kbd "C-c i") 'indent-region-or-buffer)
|
|
;; add duplicate line function from Prelude
|
;; taken from prelude-core.el
|
(defun prelude-get-positions-of-line-or-region ()
|
"Return positions (beg . end) of the current line
|
or region."
|
(let (beg end)
|
(if (and mark-active (> (point) (mark)))
|
(exchange-point-and-mark))
|
(setq beg (line-beginning-position))
|
(if mark-active
|
(exchange-point-and-mark))
|
(setq end (line-end-position))
|
(cons beg end)))
|
|
(defun kill-default-buffer ()
|
"Kill the currently active buffer -- set to C-x k so that users are not asked which buffer they want to kill."
|
(interactive)
|
(let (kill-buffer-query-functions) (kill-buffer)))
|
|
(global-set-key (kbd "C-x k") 'kill-default-buffer)
|
|
;; smart openline
|
(defun prelude-smart-open-line (arg)
|
"Insert an empty line after the current line.
|
Position the cursor at its beginning, according to the current mode.
|
With a prefix ARG open line above the current line."
|
(interactive "P")
|
(if arg
|
(prelude-smart-open-line-above)
|
(progn
|
(move-end-of-line nil)
|
(newline-and-indent))))
|
|
(defun prelude-smart-open-line-above ()
|
"Insert an empty line above the current line.
|
Position the cursor at it's beginning, according to the current mode."
|
(interactive)
|
(move-beginning-of-line nil)
|
(newline-and-indent)
|
(forward-line -1)
|
(indent-according-to-mode))
|
|
(global-set-key (kbd "C-o") 'prelude-smart-open-line)
|
(global-set-key (kbd "M-o") 'open-line)
|