⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hideif.el

📁 早期freebsd实现
💻 EL
📖 第 1 页 / 共 3 页
字号:
;;; 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 + -