diff options
author | Dominik Honnef <dominik.honnef@gmail.com> | 2014-06-17 14:43:35 -0400 |
---|---|---|
committer | Dominik Honnef <dominik.honnef@gmail.com> | 2014-06-17 14:43:35 -0400 |
commit | 68035a99127dc29cad56a033351ea2ac612c871e (patch) | |
tree | c219a69f37f6fe88a973bccc3da461d3d1c83161 /misc | |
parent | 818b5b90479541691abe978b1bc1f391f7c80472 (diff) | |
download | go-68035a99127dc29cad56a033351ea2ac612c871e.tar.gz |
misc/emacs: replace hacky go--delete-whole-line with own implementation
Using flet to replace kill-region with delete-region was a hack,
flet is now (GNU Emacs 24.3) deprecated and at least two people
have reported an issue where using go--delete-whole-line would
permanently break their kill ring. While that issue is probably
caused by faulty third party code (possibly prelude), it's easier
to write a clean implementation than to tweak the hack.
LGTM=ruiu, adonovan
R=adonovan, ruiu
CC=adg, golang-codereviews
https://codereview.appspot.com/106010043
Committer: Alan Donovan <adonovan@google.com>
Diffstat (limited to 'misc')
-rw-r--r-- | misc/emacs/go-mode.el | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/misc/emacs/go-mode.el b/misc/emacs/go-mode.el index 6333ff966..6a2fcc0e4 100644 --- a/misc/emacs/go-mode.el +++ b/misc/emacs/go-mode.el @@ -33,29 +33,35 @@ ;; - Use go--old-completion-list-style when using a plain list as the ;; collection for completing-read ;; -;; - Use go--kill-whole-line instead of kill-whole-line (called -;; kill-entire-line in XEmacs) -;; ;; - Use go--position-bytes instead of position-bytes (defmacro go--xemacs-p () `(featurep 'xemacs)) -(defalias 'go--kill-whole-line - (if (fboundp 'kill-whole-line) - #'kill-whole-line - #'kill-entire-line)) - ;; Delete the current line without putting it in the kill-ring. (defun go--delete-whole-line (&optional arg) - ;; Emacs uses both kill-region and kill-new, Xemacs only uses - ;; kill-region. In both cases we turn them into operations that do - ;; not modify the kill ring. This solution does depend on the - ;; implementation of kill-line, but it's the only viable solution - ;; that does not require to write kill-line from scratch. - (flet ((kill-region (beg end) - (delete-region beg end)) - (kill-new (s) ())) - (go--kill-whole-line arg))) + ;; Derived from `kill-whole-line'. + ;; ARG is defined as for that function. + (setq arg (or arg 1)) + (if (and (> arg 0) + (eobp) + (save-excursion (forward-visible-line 0) (eobp))) + (signal 'end-of-buffer nil)) + (if (and (< arg 0) + (bobp) + (save-excursion (end-of-visible-line) (bobp))) + (signal 'beginning-of-buffer nil)) + (cond ((zerop arg) + (delete-region (progn (forward-visible-line 0) (point)) + (progn (end-of-visible-line) (point)))) + ((< arg 0) + (delete-region (progn (end-of-visible-line) (point)) + (progn (forward-visible-line (1+ arg)) + (unless (bobp) + (backward-char)) + (point)))) + (t + (delete-region (progn (forward-visible-line 0) (point)) + (progn (forward-visible-line arg) (point)))))) ;; declare-function is an empty macro that only byte-compile cares ;; about. Wrap in always false if to satisfy Emacsen without that |