diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2010-01-17 16:05:59 +0100 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2010-01-17 16:05:59 +0100 |
commit | 5c30e6c157fcf1e181e6fa0b910aa3e1032de2c0 (patch) | |
tree | 7bad636ab92c1afb43a900d2c96b8e2ba751e97f | |
parent | 78a68e3dc8803ba1bf2bf87f4b3cad14c647a7f0 (diff) | |
download | dotfiles-5c30e6c157fcf1e181e6fa0b910aa3e1032de2c0.tar.gz dotfiles-5c30e6c157fcf1e181e6fa0b910aa3e1032de2c0.tar.xz dotfiles-5c30e6c157fcf1e181e6fa0b910aa3e1032de2c0.zip |
cua for rect-selections, advice for copy/kill line, y-or-n-p for winring-delete
-rw-r--r-- | emacs | 65 | ||||
-rw-r--r-- | emacs.d/lisp/rect-mark.el | 445 | ||||
-rw-r--r-- | emacs.elc | bin | 20278 -> 20352 bytes |
3 files changed, 30 insertions, 480 deletions
@@ -5,6 +5,7 @@ ;; If there is more than one, they won't work right. '(Buffer-menu-use-frame-buffer-list nil) '(abbrev-mode t) + '(ac-auto-start t) '(ac-dwim t) '(ac-modes (quote (emacs-lisp-mode lisp-interaction-mode c-mode cc-mode c++-mode java-mode perl-mode cperl-mode python-mode ruby-mode ecmascript-mode javascript-mode js2-mode php-mode css-mode makefile-mode sh-mode fortran-mode f90-mode ada-mode xml-mode sgml-mode delphi-mode))) '(all-christian-calendar-holidays t) @@ -26,6 +27,10 @@ '(column-number-mode t) '(compilation-skip-threshold 2) '(confirm-kill-emacs (quote y-or-n-p)) + '(cua-delete-selection nil) + '(cua-rectangle-mark-key [134217760]) + '(cua-remap-control-v nil) + '(cua-remap-control-z nil) '(curchg-default-cursor-color "white") '(curchg-overwrite/read-only-cursor-type (quote hollow)) '(current-language-environment "English") @@ -344,14 +349,8 @@ (global-set-key (kbd "<f8>") 'switch-dictionary) ; update flyspell after changing dictionary -(defadvice ispell (after advice) - (flyspell-buffer)) -(ad-activate 'ispell t) -(defadvice ispell-word (after advice) - (flyspell-buffer)) -(ad-activate 'ispell-word t) (defadvice ispell-pdict-save (after advice) - (flyspell-buffer)) + (save-excursion (flyspell-buffer))) (ad-activate 'ispell-pdict-save t) ; byte-compile .emacs @@ -411,34 +410,23 @@ (setq x-select-enable-clipboard t) (setq interprogram-paste-function 'x-cut-buffer-or-selection-value) -; rectangle selection -(require 'rect-mark) -(global-set-key (kbd "C-x r SPC") 'rm-set-mark) -(global-set-key (kbd "C-S-y") 'yank-rectangle) - -(global-set-key (kbd "C-x C-x") - '(lambda(p) (interactive - (if rm-mark-active - (rm-exchange-point-and-mark p) (exchange-point-and-mark p))))) - -; if rectangle mark active, copy/cut/ rectangle and -; if not copy whole line when no region is active -(global-set-key (kbd "C-w") - '(lambda(b a) (interactive "r") - (if rm-mark-active - (rm-kill-region b a) - (if mark-active - (kill-region b a) - (kill-region (line-beginning-position) (line-beginning-position 2)))))) - -(global-set-key (kbd "M-w") - '(lambda(b a) (interactive "r") - (if rm-mark-active - (rm-kill-ring-save b a) - (if mark-active - (kill-ring-save b a) - (kill-ring-save (line-beginning-position) (line-beginning-position 2)))))) +;; use cua-mode, but only for rectangle selections +(setq cua-enable-cua-keys nil) +(cua-mode t) +;; copy/kill whole line when no region is active +(defadvice kill-ring-save (before slick-copy activate compile) + (interactive (if mark-active (list (region-beginning) (region-end)) (message + "Copied line") (list (line-beginning-position) (line-beginning-position + 2))))) +(ad-activate 'kill-ring-save) + +(defadvice kill-region (before slick-cut activate compile) + (interactive + (if mark-active (list (region-beginning) (region-end)) + (list (line-beginning-position) + (line-beginning-position 2))))) +(ad-activate 'kill-region) ;; rudel (obby/... connection) ;(add-to-list 'load-path "SOMEDIR/rudel/") @@ -464,7 +452,14 @@ (winring-initialize) (global-set-key (kbd "C-x j") 'winring-jump-to-configuration) (global-set-key (kbd "C-x n") 'winring-new-configuration) -(global-set-key (kbd "C-x K") 'winring-delete-configuration) + +; ask before deleting winring configuration +(defun winring-ask-delete-configuration () + (interactive) + (if (y-or-n-p "Delete winring configuration? ") + (winring-delete-configuration))) + +(global-set-key (kbd "C-x K") 'winring-ask-delete-configuration) ;; etags (require 'etags-table) diff --git a/emacs.d/lisp/rect-mark.el b/emacs.d/lisp/rect-mark.el deleted file mode 100644 index 6373230..0000000 --- a/emacs.d/lisp/rect-mark.el +++ /dev/null @@ -1,445 +0,0 @@ -;;; rect-mark.el --- Mark a rectangle of text with highlighting. - -;;; Copyright (C) 1994, 1995 Rick Sladkey <jrs@world.std.com> - -;;; This file is not part of GNU Emacs but it is distributed under the -;;; same conditions as GNU Emacs. - -;;; This is free software. -;;; GNU Emacs is free software; you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published -;;; by the Free Software Foundation; either version 2, or (at your -;;; option) any later version. - -;;; GNU Emacs is distributed in the hope that it will be useful, but -;;; WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;;; General Public License for more details. - -;;; You should have received a copy of the GNU General Public License -;;; along with GNU Emacs; see the file COPYING. If not, write to the -;;; Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -;; Author: Rick Sladkey <jrs@world.std.com> -;; Version: 1.4 - -;;; Commentary: - -;; If you use both transient-mark-mode and picture-mode, you will -;; probably realize how convenient it would be to be able to highlight -;; the region between point and mark as a rectangle. Have you ever -;; wished you could see where exactly those other two corners fell -;; before you operated on a rectangle? If so, then this program is -;; for you. - -;; For example, you can set the mark in preparation for a rectangle -;; command with `C-x r C-SPC', watch the highlighted rectangle grow as -;; you move the cursor to the other corner, and then issue the command -;; and the rectangle disappears. Or if point and mark are already set -;; but you want to see what the region would look like as a rectangle, -;; try `C-x r C-x' which exchanges point and mark and makes the -;; highlighted region rectangular. - -;; The default Emacs key-bindings put `point-to-register' on -;; `C-x r C-SPC' but since that command it is already on `C-x r SPC' -;; and since it is irresistably intuitive to put `rm-set-mark' on -;; `C-x r C-SPC', I have taken the liberty of recommending that you -;; override the default key-bindings. - -;; You can also kill or copy rectangles onto the kill ring which is -;; convenient for yanking rectangles into ordinary buffers (i.e. ones -;; not in picture mode) and for pasting rectangles into other window -;; system programs (e.g. xterm). These keys are by default bound to -;; `C-x r C-w' and `C-x r M-w' by analogy to the normal kill and copy -;; counterparts. - -;; Finally, there is mouse support for rectangle highlighting by -;; dragging the mouse while holding down the shift key. The idea is -;; that this behaves exactly like normal mouse dragging except that -;; the region is treated as a rectangle. - -;;; Usage: - -;; Use this section in your "~/.emacs" when rect-mark isn't included -;; as an integral part of Emacs. Don't forget to remove the first -;; three columns. - -;; ;; Support for marking a rectangle of text with highlighting. -;; (define-key ctl-x-map "r\C-@" 'rm-set-mark) -;; (define-key ctl-x-map [?r ?\C-\ ] 'rm-set-mark) -;; (define-key ctl-x-map "r\C-x" 'rm-exchange-point-and-mark) -;; (define-key ctl-x-map "r\C-w" 'rm-kill-region) -;; (define-key ctl-x-map "r\M-w" 'rm-kill-ring-save) -;; (define-key global-map [S-down-mouse-1] 'rm-mouse-drag-region) -;; (autoload 'rm-set-mark "rect-mark" -;; "Set mark for rectangle." t) -;; (autoload 'rm-exchange-point-and-mark "rect-mark" -;; "Exchange point and mark for rectangle." t) -;; (autoload 'rm-kill-region "rect-mark" -;; "Kill a rectangular region and save it in the kill ring." t) -;; (autoload 'rm-kill-ring-save "rect-mark" -;; "Copy a rectangular region to the kill ring." t) -;; (autoload 'rm-mouse-drag-region "rect-mark" -;; "Drag out a rectangular region with the mouse." t) - -;; Use this section in your "~/.emacs" to modify picture mode so that -;; it automatically uses the rect-mark equivalents of many commands. - -;; ;; One vision of a better picture mode. -;; (add-hook 'picture-mode-hook 'rm-example-picture-mode-bindings) -;; (autoload 'rm-example-picture-mode-bindings "rect-mark" -;; "Example rect-mark key and mouse bindings for picture mode.") - -;;; Code: - - -;;;###autoload (define-key ctl-x-map "r\C-@" 'rm-set-mark) -;;;###autoload (define-key ctl-x-map [?r ?\C-\ ] 'rm-set-mark) -;;;###autoload (define-key ctl-x-map "r\C-x" 'rm-exchange-point-and-mark) -;;;###autoload (define-key ctl-x-map "r\C-w" 'rm-kill-region) -;;;###autoload (define-key ctl-x-map "r\M-w" 'rm-kill-ring-save) -;;;###autoload (define-key global-map [S-down-mouse-1] 'rm-mouse-drag-region) - -;; Our state variables, each internal and buffer local. -(defvar rm-mark-active nil) -(defvar rm-overlay-list) -(defvar rm-old-transient-mark-mode) -(defvar rm-force) -(defvar rm-old-global-variables) - -;; A list of our buffer local variables. -(defconst rm-our-local-variables - '(rm-mark-active - rm-overlay-list - rm-old-transient-mark-mode - rm-force - rm-old-global-variables)) - -;; System variables which must temorarily be buffer local. -(defconst rm-temporary-local-variables - '(transient-mark-mode - ;; Alas, we can no longer uninstall a post command hook from a post - ;; command hook (as of 19.28 at least) so we must leave it installed - ;; globally. - ;post-command-hook - deactivate-mark-hook)) - -;; Those commands which don't necessarily deactivate the mark but -;; should. This is a partial list as of Emacs 19.22. Most problems -;; are the result of the pathological case of a zero-width rectangle. -(defconst rm-deactivate-mark-commands - '(clear-rectangle - copy-rectangle - copy-rectangle-to-register - kill-rectangle - open-rectangle - string-rectangle - yank-rectangle - keyboard-quit)) - -;;; Quiet the byte-compiler. -(defvar killed-rectangle) -(defvar picture-mode-map) -(defvar deactivate-mark-hook) - - -;;;###autoload -(defun rm-example-picture-mode-bindings () - "Example rect-mark keyboard and mouse bindings for picture mode." - (define-key picture-mode-map "\C-@" 'rm-set-mark) - (define-key picture-mode-map [?\C-\ ] 'rm-set-mark) - (define-key picture-mode-map [down-mouse-1] 'rm-mouse-drag-region) - (define-key picture-mode-map "\C-x\C-x" 'rm-exchange-point-and-mark) - (define-key picture-mode-map "\C-w" 'rm-kill-region) - (define-key picture-mode-map "\M-w" 'rm-kill-ring-save) - (define-key picture-mode-map "\C-y" 'yank-rectangle) - ;; Prevent `move-to-column-force' from deactivating the mark. - (defun move-to-column-force (column) - (let ((deactivate-mark deactivate-mark)) - (move-to-column (max column 0) t) - (hscroll-point-visible)))) - -;;;###autoload -(defun rm-set-mark (force) - "Set mark like `set-mark-command' but anticipates a rectangle. -This arranges for the rectangular region between point and mark -to be highlighted using the same face that is used to highlight -the region in `transient-mark-mode'. This special state lasts only -until the mark is deactivated, usually by executing a text-modifying -command like \\[kill-rectangle], by inserting text, or by typing \\[keyboard-quit]. - -With optional argument FORCE, arrange for tabs to be expanded and -for spaces to inserted as necessary to keep the region perfectly -rectangular. This is the default in `picture-mode'." - (interactive "P") - (rm-activate-mark force) - (push-mark nil nil t)) - -;;;###autoload -(defun rm-exchange-point-and-mark (force) - "Like `exchange-point-and-mark' but treats region as a rectangle. -See `rm-set-mark' for more details. - -With optional argument FORCE, tabs are expanded and spaces are -inserted as necessary to keep the region perfectly rectangular. -This is the default in `picture-mode'." - (interactive "P") - (rm-activate-mark force) - (exchange-point-and-mark)) - -;;;###autoload -(defun rm-kill-region (start end) - "Like kill-rectangle except the rectangle is also saved in the kill ring. -Since rectangles are not ordinary text, the killed rectangle is saved -in the kill ring as a series of lines, one for each row of the rectangle. -The rectangle is also saved as the killed rectangle so it is available for -insertion with yank-rectangle." - (interactive "r") - (rm-kill-ring-save start end) - (delete-rectangle start end) - (and (interactive-p) - rm-mark-active - (rm-deactivate-mark))) - -;;;###autoload -(defun rm-kill-ring-save (start end) - "Copies the region like rm-kill-region would but the rectangle isn't killed." - (interactive "r") - (setq killed-rectangle (extract-rectangle start end)) - (kill-new (mapconcat (function - (lambda (row) - (concat row "\n"))) - killed-rectangle "")) - (and (interactive-p) - rm-mark-active - (rm-deactivate-mark))) - -;;;###autoload -(defun rm-mouse-drag-region (start-event) - "Highlight a rectangular region of text as the the mouse is dragged over it. -This must be bound to a button-down mouse event." - (interactive "e") - (let* ((start-posn (event-start start-event)) - (start-point (posn-point start-posn)) - (start-window (posn-window start-posn)) - (start-frame (window-frame start-window)) - (bounds (window-edges start-window)) - (top (nth 1 bounds)) - (bottom (if (window-minibuffer-p start-window) - (nth 3 bounds) - ;; Don't count the mode line. - (1- (nth 3 bounds)))) - (click-count (1- (event-click-count start-event)))) - (setq mouse-selection-click-count click-count) - (mouse-set-point start-event) - (rm-activate-mark) - (let (end-event - end-posn - end-point - end-window) - (track-mouse - (while (progn - (setq end-event (read-event) - end-posn (event-end end-event) - end-point (posn-point end-posn) - end-window (posn-window end-posn)) - (or (mouse-movement-p end-event) - (eq (car-safe end-event) 'switch-frame))) - (cond - ;; Ignore switch-frame events. - ((eq (car-safe end-event) 'switch-frame) - nil) - ;; Are we moving within the original window? - ((and (eq end-window start-window) - (integer-or-marker-p end-point)) - (goto-char end-point) - (rm-highlight-rectangle start-point end-point)) - ;; Are we moving on a different window on the same frame? - ((and (windowp end-window) - (eq (window-frame end-window) start-frame)) - (let ((mouse-row (+ (nth 1 (window-edges end-window)) - (cdr (posn-col-row end-posn))))) - (cond - ((< mouse-row top) - (mouse-scroll-subr (- mouse-row top) - nil start-point)) - ((and (not (eobp)) - (>= mouse-row bottom)) - (mouse-scroll-subr (1+ (- mouse-row bottom)) - nil start-point))))) - (t - (let ((mouse-y (cdr (cdr (mouse-position)))) - (menu-bar-lines (or (cdr (assq 'menu-bar-lines - (frame-parameters))) - 0))) - ;; Are we on the menu bar? - (and (integerp mouse-y) (< mouse-y menu-bar-lines) - (mouse-scroll-subr (- mouse-y menu-bar-lines) - nil start-point))))))) - (and (eq (get (event-basic-type end-event) 'event-kind) 'mouse-click) - (eq end-window start-window) - (numberp end-point) - (if (= start-point end-point) - (setq deactivate-mark t) - (push-mark start-point t t) - (goto-char end-point) - (rm-kill-ring-save start-point end-point))) - ))) - - -(defun rm-activate-mark (&optional force) - ;; Turn on rectangular marking mode by temporarily (and in a buffer - ;; local way) disabling transient mark mode and manually handling - ;; highlighting from a post command hook. - (setq rm-force (and (not buffer-read-only) - (or force - (eq major-mode 'picture-mode)))) - ;; Be careful if we are already marking a rectangle. - (if rm-mark-active - nil - ;; Make each of our state variables buffer local. - (mapcar (function make-local-variable) rm-our-local-variables) - (setq rm-mark-active t - rm-overlay-list nil - rm-old-transient-mark-mode transient-mark-mode) - ;; Remember which system variables weren't buffer local. - (setq rm-old-global-variables - (apply (function nconc) - (mapcar (function - (lambda (variable) - (and (not (assoc variable - (buffer-local-variables))) - (list variable)))) - rm-temporary-local-variables))) - ;; Then make them all buffer local too. - (mapcar (function make-local-variable) rm-temporary-local-variables) - ;; Making transient-mark-mode buffer local doesn't really work - ;; correctly as of 19.22: the current buffer's value affects all - ;; displayed buffers. - (setq transient-mark-mode nil) - (add-hook 'post-command-hook 'rm-post-command) - (add-hook 'deactivate-mark-hook 'rm-deactivate-mark))) - -(defun rm-post-command () - ;; An error in a post-command function can be fatal if it re-occurs - ;; on each call, thus the condition-case safety nets. - ;; We have to do things this way because deactivate-mark doesn't - ;; (in general) get called if transient-mark-mode isn't turned on. - (if rm-mark-active - (if (or (not mark-active) - deactivate-mark - (memq this-command rm-deactivate-mark-commands)) - (condition-case nil - (rm-deactivate-mark) - (error nil)) - (condition-case info - (rm-highlight-rectangle (mark) (point)) - (error - (ding) - (message "rect-mark trouble: %s" info) - (condition-case nil - (rm-deactivate-mark) - (error nil))))) - (and (boundp 'rm-overlay-list) - (condition-case nil - (rm-deactivate-mark) - (error nil))))) - -(defun rm-highlight-rectangle (start end) - ;; This function is used to highlight the rectangular region from - ;; START to END. We do this by putting an overlay on each line - ;; within the rectangle. Each overlay extends across all the - ;; columns of the rectangle. We try to reuse overlays where - ;; possible because this is more efficient and results in less - ;; flicker. If rm-force is nil and the buffer contains tabs or - ;; short lines, the higlighted region may not be perfectly - ;; rectangular. - (save-excursion - ;; Calculate the rectangular region represented by point and mark, - ;; putting start in the north-west corner and end in the - ;; south-east corner. We can't effectively use - ;; operate-on-rectangle because it doesn't work for zero-width - ;; rectangles as of 19.22. - (and (> start end) - (setq start (prog1 - end - (setq end start)))) - (let ((start-col (save-excursion - (goto-char start) - (current-column))) - (end-col (save-excursion - (goto-char end) - (current-column))) - (deactivate-mark deactivate-mark)) - (and (> start-col end-col) - (setq start-col (prog1 - end-col - (setq end-col start-col)) - start (save-excursion - (goto-char start) - (move-to-column start-col rm-force) - (point)) - end (save-excursion - (goto-char end) - (move-to-column end-col rm-force) - (point)))) - ;; Force a redisplay so we can do reliable window start/end - ;; calculations. - (sit-for 0) - (let ((old rm-overlay-list) - (new nil) - overlay - (window-start (max (window-start) start)) - (window-end (min (window-end) end))) - ;; Iterate over those lines of the rectangle which are visible - ;; in the currently selected window. - (goto-char window-start) - (while (< (point) window-end) - (let ((row-start (progn - (move-to-column start-col rm-force) - (point))) - (row-end (progn - (move-to-column end-col rm-force) - (point)))) - ;; Trim old leading overlays. - (while (and old - (setq overlay (car old)) - (< (overlay-start overlay) row-start) - (/= (overlay-end overlay) row-end)) - (delete-overlay overlay) - (setq old (cdr old))) - ;; Reuse an overlay if possible, otherwise create one. - (if (and old - (setq overlay (car old)) - (or (= (overlay-start overlay) row-start) - (= (overlay-end overlay) row-end))) - (progn - (move-overlay overlay row-start row-end) - (setq new (cons overlay new) - old (cdr old))) - (setq overlay (make-overlay row-start row-end)) - (overlay-put overlay 'face 'region) - (setq new (cons overlay new))) - (forward-line 1))) - ;; Trim old trailing overlays. - (mapcar (function delete-overlay) old) - (setq rm-overlay-list (nreverse new)))))) - -(defun rm-deactivate-mark () - ;; This is used to clean up after `rm-activate-mark'. - ;; Alas, we can no longer uninstall a post command hook from a post - ;; command hook (as of 19.28 at least) so we must leave it installed - ;; globally. - ;(setq post-command-hook (delq 'rm-post-command post-command-hook)) - (setq deactivate-mark-hook (delq 'rm-deactivate-mark deactivate-mark-hook)) - (setq transient-mark-mode rm-old-transient-mark-mode) - (mapcar (function delete-overlay) rm-overlay-list) - (mapcar (function kill-local-variable) rm-old-global-variables) - (mapcar (function kill-local-variable) rm-our-local-variables) - (and transient-mark-mode - mark-active - (deactivate-mark))) - -(provide 'rect-mark) - -;;; rect-mark.el ends here Binary files differ |