📄 hideif.el
字号:
;;; Find-Range;;; The workhorse, it delimits the #if region. Reasonably simple:;;; Skip until an #else or #endif is found, remembering positions. If;;; an #else was found, skip some more, looking for the true #endif.(defun hif-find-range () "Returns a Range structure describing the current #if region.Point is left unchanged."; (message "hif-find-range at %d" (point)) (save-excursion (beginning-of-line) (let ((start (point)) (else-p nil) (else nil) (end nil)) ;; Part one. Look for either #endif or #else. ;; This loop-and-a-half dedicated to E. Dijkstra. (hif-find-next-relevant) (while (hif-looking-at-ifX) ; Skip nested ifdef (hif-ifdef-to-endif) (hif-find-next-relevant)) ;; Found either a #else or an #endif. (cond ((hif-looking-at-else) (setq else-p t) (setq else (point))) (t (setq end (point)) ; (save-excursion (end-of-line) (point)) )) ;; If found #else, look for #endif. (if else-p (progn (hif-find-next-relevant) (while (hif-looking-at-ifX) ; Skip nested ifdef (hif-ifdef-to-endif) (hif-find-next-relevant)) (if (hif-looking-at-else) (error "Found two elses in a row? Broken!")) (setq end (point)) ; (save-excursion (end-of-line) (point)) )) (hif-make-range else-p start end else)))) ;;; A bit slimy.;;; NOTE: If there's an #ifdef at the beginning of the file, we can't;;; hide it. There's no previous newline to replace. If we added;;; one, we'd throw off all the counts. Feh.(defun hif-hide-line (point) "Hide the line containing point. Does nothing ifhide-ifdef-lines is nil." (if hide-ifdef-lines (save-excursion (goto-char point) (let ((modp (buffer-modified-p))) (unwind-protect (progn (beginning-of-line) (if (not (= (point) 1)) (hide-ifdef-region (1- (point)) (point)))) (set-buffer-modified-p modp)) )) )) ;;; Hif-Possibly-Hide;;; There are four cases. The #ifX expression is "taken" if it;;; the hide-ifdef-evaluator returns T. Presumably, this means the code;;; inside the #ifdef would be included when the program was;;; compiled. ;;;;;; Case 1: #ifX taken, and there's an #else.;;; The #else part must be hidden. The #if (then) part must be;;; processed for nested #ifX's.;;; Case 2: #ifX taken, and there's no #else.;;; The #if part must be processed for nested #ifX's.;;; Case 3: #ifX not taken, and there's an #else.;;; The #if part must be hidden. The #else part must be processed;;; for nested #ifs.;;; Case 4: #ifX not taken, and there's no #else.;;; The #ifX part must be hidden.;;;;;; Further processing is done by narrowing to the relevant region;;; and just recursively calling hide-ifdef-guts.;;;;;; When hif-possibly-hide returns, point is at the end of the;;; possibly-hidden range.(defun hif-recurse-on (start end) "Call hide-ifdef-guts after narrowing to end of START line and ENDline." (save-excursion (save-restriction (goto-char start) (end-of-line) (narrow-to-region (point) end) (hide-ifdef-guts))))(defun hif-possibly-hide () "Called at #ifX expression, this hides those parts that should behidden, according to judgement of hide-ifdef-evaluator."; (message "hif-possibly-hide") (sit-for 1) (let ((test (hif-canonicalize)) (range (hif-find-range))); (message "test = %s" test) (sit-for 1) (hif-hide-line (hif-range-end range)) (if (funcall hide-ifdef-evaluator test) (cond ((hif-range-else-p range) ; case 1 (hif-hide-line (hif-range-else range)) (hide-ifdef-region (hif-range-else range) (1- (hif-range-end range))) (hif-recurse-on (hif-range-start range) (hif-range-else range))) (t ; case 2 (hif-recurse-on (hif-range-start range) (hif-range-end range)))) (cond ((hif-range-else-p range) ; case 3 (hif-hide-line (hif-range-else range)) (hide-ifdef-region (hif-range-start range) (1- (hif-range-else range))) (hif-recurse-on (hif-range-else range) (hif-range-end range))) (t ; case 4 (hide-ifdef-region (point) (1- (hif-range-end range)))) )) (hif-hide-line (hif-range-start range)) ; Always hide start. (goto-char (hif-range-end range)) (end-of-line) ))(defun hide-ifdef-guts () "Does the work of hide-ifdefs, except for the work that's pointlessto redo on a recursive entry."; (message "hide-ifdef-guts") (save-excursion (goto-char (point-min)) (while (hif-find-any-ifX) (hif-possibly-hide))));===%%SF%% hide-ifdef-hiding (End) ===;===%%SF%% exports (Start) ===(defvar hide-ifdef-initially nil "*Non-nil if hide-ifdefs should be called when hide-ifdef-mode is first activated.")(defvar hide-ifdef-hiding nil "Non-nil if text might be hidden.")(defvar hide-ifdef-read-only nil "*Set to non-nil if you want buffer to be read-only while hiding text.")(defvar hif-outside-read-only nil "Internal variable. Saves the value of buffer-read-only while hiding.")(defvar hide-ifdef-lines nil "*Set to t if you don't want to see the #ifX, #else, and #endif lines.")(defun hide-ifdef-toggle-read-only () "Toggle hide-ifdef-read-only." (interactive) (setq hide-ifdef-read-only (not hide-ifdef-read-only)) (message "Hide-Read-Only %s" (if hide-ifdef-read-only "ON" "OFF")) (if hide-ifdef-hiding (setq buffer-read-only (or hide-ifdef-read-only hif-outside-read-only))) (hif-update-mode-line) )(defun hide-ifdef-toggle-outside-read-only () "Replacement for toggle-read-only within hide-ifdef-mode." (interactive) (setq hif-outside-read-only (not hif-outside-read-only)) (message "Read only %s" (if hif-outside-read-only "ON" "OFF")) (setq buffer-read-only (or (and hide-ifdef-hiding hide-ifdef-read-only) hif-outside-read-only) ) (hif-update-mode-line) ) (defun hide-ifdef-define (var) "Define a VAR so that #ifdef VAR would be included." (interactive "SDefine what? ") (hif-set-var var t) (if hide-ifdef-hiding (hide-ifdefs)))(defun hide-ifdef-undef (var) "Undefine a VAR so that #ifdef VAR would not be included." (interactive "SUndefine what? ") (hif-set-var var nil) (if hide-ifdef-hiding (hide-ifdefs)))(defun hide-ifdefs () "Hide the contents of some #ifdefs. Assume that defined symbols havebeen added to hide-ifdef-env. The text hidden is the text that would notbe included by the C preprocessor if it were given the file with thosesymbols defined.Turn off hiding by calling show-ifdef." (interactive) (message "Hiding...") (if (not hide-ifdef-mode) (hide-ifdef-mode 1)) ; turn on hide-ifdef-mode (if hide-ifdef-hiding (show-ifdefs)) ; Otherwise, deep confusion. (if buffer-read-only (toggle-read-only)) ; make it writable temporarily (setq selective-display t) (setq hide-ifdef-hiding t) (hide-ifdef-guts) (if (or hide-ifdef-read-only hif-outside-read-only) (toggle-read-only) ; make it read only ) (message "Hiding done") )(defun show-ifdefs () "Cancel the effects of hide-ifdef. The contents of all #ifdefs is shown." (interactive) (if buffer-read-only (toggle-read-only)) ; make it writable temporarily (setq selective-display nil) ; defaults (hif-show-all) (if hif-outside-read-only (toggle-read-only)) ; make it read only (setq hide-ifdef-hiding nil) )(defun hif-find-ifdef-block () "Utilitiy for hide and show ifdef-block. Set top and bottom of ifdef block." (let (max-bottom) (save-excursion (beginning-of-line) (if (not (or (hif-looking-at-else) (hif-looking-at-ifX))) (up-ifdef)) (setq top (point)) (hif-ifdef-to-endif) (setq max-bottom (1- (point))) ) (save-excursion (beginning-of-line) (if (not (hif-looking-at-endif)) (hif-find-next-relevant)) (while (hif-looking-at-ifX) (hif-ifdef-to-endif) (hif-find-next-relevant) ) (setq bottom (min max-bottom (1- (point)))) )) )(defun hide-ifdef-block () "Hide the ifdef block (true or false part) enclosing or before the cursor." (interactive) (if (not hide-ifdef-mode) (hide-ifdef-mode 1)) (if buffer-read-only (toggle-read-only)) (setq selective-display t) (let (top bottom) (hif-find-ifdef-block) ; set top and bottom - dynamic scoping (hide-ifdef-region top bottom) (if hide-ifdef-lines (progn (hif-hide-line top) (hif-hide-line (1+ bottom)))) (setq hide-ifdef-hiding t) ) (if (or hide-ifdef-read-only hif-outside-read-only) (toggle-read-only)) )(defun show-ifdef-block () "Show the ifdef block (true or false part) enclosing or before the cursor." (interactive) (let ((old-read-only buffer-read-only)) (if old-read-only (toggle-read-only)) (if hide-ifdef-lines (save-excursion (beginning-of-line) (hif-show-ifdef-region (1- (point)) (progn (end-of-line) (point)))) (let (top bottom) (hif-find-ifdef-block) (hif-show-ifdef-region (1- top) bottom)) ) ; restore read only status since we dont know if all is shown. (if old-read-only (toggle-read-only)) ));;; defininition alist support(defvar hide-ifdef-define-alist nil "A global assoc list of pre-defined symbol lists")(defun hif-compress-define-list (env) "Compress the define list ENV into a list of defined symbols only." (let ((defs (mapcar '(lambda (arg) (if (hif-lookup (car arg)) (car arg))) env)) (new-defs nil)) (while defs (if (car defs) (setq new-defs (cons (car defs) new-defs))) (setq defs (cdr defs))) new-defs ))(defun hide-ifdef-set-define-alist (name) "Set the association for NAME to hide-ifdef-env." (interactive "SSet define list: ") (setq hide-ifdef-define-alist (cons (cons name (hif-compress-define-list hide-ifdef-env)) hide-ifdef-define-alist)) )(defun hide-ifdef-use-define-alist (name) "Set hide-ifdef-env to the define list specified by NAME." (interactive "SUse define list: ") (let ((define-list (assoc name hide-ifdef-define-alist))) (if define-list (setq hide-ifdef-env (mapcar '(lambda (arg) (cons arg t)) (cdr define-list))) (error "No define list for %s" name)) (if hide-ifdef-hiding (hide-ifdefs)) ) );===%%SF%% exports (End) ===
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -