summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorDominik Honnef <dominik.honnef@gmail.com>2014-06-17 14:43:35 -0400
committerDominik Honnef <dominik.honnef@gmail.com>2014-06-17 14:43:35 -0400
commit68035a99127dc29cad56a033351ea2ac612c871e (patch)
treec219a69f37f6fe88a973bccc3da461d3d1c83161 /misc
parent818b5b90479541691abe978b1bc1f391f7c80472 (diff)
downloadgo-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.el40
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