summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--emacs35
-rw-r--r--emacs.d/lisp/rect-mark.el445
3 files changed, 483 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..77755ac
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+emacs.d/auto-save-list/
+emacs.d/history
+emacs.d/saveplace
+emacs.d/semantic
diff --git a/emacs b/emacs
index b464a33..c31c101 100644
--- a/emacs
+++ b/emacs
@@ -209,7 +209,7 @@
; load-path anpassen
(setq load-path (cons "/usr/share/maxima/5.9.0/emacs" load-path))
-(setq load-path (append load-path (list "~/.emacs.d/lisp" )))
+(setq load-path (cons "~/.emacs.d/lisp" load-path))
(autoload 'maxima-mode "maxima" "Maxima mode" t)
(autoload 'maxima "maxima" "Maxima interactive" t)
@@ -306,6 +306,39 @@
(setq template-query nil)
(require 'template-simple)
+; remember last position in file
+(setq save-place-file "~/.emacs.d/saveplace")
+(setq-default save-place t)
+(require 'saveplace)
+
+; clever autocomplete mode
+(require 'ido)
+(ido-mode t)
+(setq
+ ido-ignore-buffers '("\\` " "^\*Mess" "^\*Back" ".*Completion" "^\*Ido")
+ ido-case-fold t
+ ido-use-filename-at-point nil
+ ido-use-url-at-point nil
+ ido-enable-flex-matching t
+ ido-max-prospects 6
+ ido-confirm-unique-completion t)
+
+; rectagle select
+(require 'rect-mark)
+(global-set-key (kbd "C-x r C-SPC") 'rm-set-mark)
+(global-set-key (kbd "C-w")
+ '(lambda(b e) (interactive "r")
+ (if rm-mark-active
+ (rm-kill-region b e) (kill-region b e))))
+(global-set-key (kbd "M-w")
+ '(lambda(b e) (interactive "r")
+ (if rm-mark-active
+ (rm-kill-ring-save b e) (kill-ring-save b e))))
+(global-set-key (kbd "C-x C-x")
+ '(lambda(&optional p) (interactive "p")
+ (if rm-mark-active
+ (rm-exchange-point-and-mark p) (exchange-point-and-mark p))))
+
; servermode (to edit files with emacsclient)
(server-start)
diff --git a/emacs.d/lisp/rect-mark.el b/emacs.d/lisp/rect-mark.el
new file mode 100644
index 0000000..6373230
--- /dev/null
+++ b/emacs.d/lisp/rect-mark.el
@@ -0,0 +1,445 @@
+;;; 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