yatex
annotate yatexhlp.el @ 463:a4d49700b1c5
Artument error fixed
author | HIROSE Yuuji <yuuji@gentei.org> |
---|---|
date | Wed, 31 May 2017 21:56:49 +0859 |
parents | e009c4f86ede |
children | c0827f80b18e |
rev | line source |
---|---|
yuuji@395 | 1 ;;; yatexhlp.el --- YaTeX helper for LaTeX -*- coding: sjis -*- |
yuuji@287 | 2 ;;; |
yuuji@382 | 3 ;;; (c)1994,1998,2004,2014,2015 by HIROSE Yuuji.[yuuji@yatex.org] |
yuuji@395 | 4 ;;; Last modified Fri Jan 16 10:31:49 2015 on firestorm |
yuuji@366 | 5 ;;; $Id$ |
yuuji@16 | 6 |
yuuji@287 | 7 ;;; Code: |
yuuji@46 | 8 (let ((help-file (concat "YATEXHLP." |
yuuji@46 | 9 (cond (YaTeX-japan "jp") |
yuuji@46 | 10 (t "eng")))) |
yuuji@46 | 11 (help-dir |
yuuji@49 | 12 (cond |
yuuji@68 | 13 ((and (boundp 'site-directory) site-directory) site-directory) |
yuuji@80 | 14 ((string-match "\\.app/" doc-directory) ;For Emacs.app(Darwin) |
yuuji@382 | 15 (expand-file-name "../site-lisp/yatex" doc-directory)) |
yuuji@382 | 16 (YaTeX-emacs-19 |
yuuji@382 | 17 (expand-file-name "../../site-lisp/yatex" doc-directory)) |
yuuji@49 | 18 (t exec-directory)))) |
yuuji@16 | 19 (defvar YaTeX-help-file |
yuuji@46 | 20 (expand-file-name help-file help-dir) |
yuuji@16 | 21 "*Help file of LaTeX/TeX commands or macros.") |
yuuji@16 | 22 (defvar YaTeX-help-file-private |
yuuji@16 | 23 (expand-file-name (concat "~/" help-file)) |
yuuji@68 | 24 "*Private help file of LaTeX/TeX macros.")) |
yuuji@68 | 25 |
yuuji@16 | 26 (defvar YaTeX-help-delimiter "\C-_" "Delimiter of each help entry.") |
yuuji@16 | 27 (defvar YaTeX-help-entry-map (copy-keymap YaTeX-mode-map) |
yuuji@16 | 28 "Key map used in help entry.") |
yuuji@16 | 29 (defvar YaTeX-help-file-current nil |
yuuji@16 | 30 "Holds help file name to which the description in current buffer should go.") |
yuuji@16 | 31 (defvar YaTeX-help-command-current nil |
yuuji@16 | 32 "Holds command name on which the user currently write description.") |
yuuji@16 | 33 (defvar YaTeX-help-saved-config nil |
yuuji@16 | 34 "Holds window configruation before the editing of manual.") |
yuuji@16 | 35 (defvar YaTeX-help-synopsis |
yuuji@16 | 36 (cond (YaTeX-japan "【書式】") |
yuuji@16 | 37 (t "[[ Synopsis ]]")) |
yuuji@16 | 38 "Section header of synopsis.") |
yuuji@16 | 39 (defvar YaTeX-help-description |
yuuji@16 | 40 (cond (YaTeX-japan "【説明】") |
yuuji@16 | 41 (t "[[ Description ]]")) |
yuuji@16 | 42 "Section header of description.") |
yuuji@16 | 43 |
yuuji@80 | 44 (defvar YaTeX-help-mode-map nil "Keymap used in YaTeX-help buffer") |
yuuji@80 | 45 (if YaTeX-help-mode-map nil |
yuuji@80 | 46 (setq YaTeX-help-mode-map (make-sparse-keymap)) |
yuuji@80 | 47 (let ((map YaTeX-help-mode-map)) |
yuuji@80 | 48 (suppress-keymap map) |
yuuji@353 | 49 (define-key map "j" (function (lambda () (interactive) (scroll-up 1)))) |
yuuji@353 | 50 (define-key map "k" (function (lambda () (interactive) (scroll-up -1)))) |
yuuji@80 | 51 (define-key map "n" 'next-line) |
yuuji@80 | 52 (define-key map "p" 'previous-line) |
yuuji@80 | 53 (define-key map " " 'scroll-up) |
yuuji@80 | 54 (define-key map "\C-?" 'scroll-down) |
yuuji@80 | 55 (define-key map "o" 'other-window) |
yuuji@80 | 56 (define-key map "h" 'describe-bindings) |
yuuji@80 | 57 (define-key map "q" 'YaTeX-help-quit) |
yuuji@80 | 58 (define-key map "<" 'beginning-of-buffer) |
yuuji@80 | 59 (define-key map ">" 'end-of-buffer))) |
yuuji@80 | 60 |
yuuji@80 | 61 (defun YaTeX-help-quit () |
yuuji@80 | 62 "Close help and return to privious buffer" |
yuuji@80 | 63 (interactive) |
yuuji@80 | 64 (bury-buffer (current-buffer)) |
yuuji@80 | 65 (set-window-configuration YaTeX-help-saved-config)) |
yuuji@80 | 66 |
yuuji@23 | 67 (defvar YaTeX-help-reference-regexp "<refer\\s +\\([^>]+\\)>" |
yuuji@23 | 68 "Regexp of reference format of YaTeX-help file.") |
yuuji@23 | 69 (defvar YaTeX-help-buffer "** YaTeX HELP **" "Help buffer name for yatexhlp") |
yuuji@23 | 70 |
yuuji@23 | 71 (defun YaTeX-help-entries () |
yuuji@23 | 72 "Return the alist which contains all the entries in YaTeX-help file." |
yuuji@23 | 73 (let (entries entry) |
yuuji@23 | 74 (save-excursion |
yuuji@23 | 75 (mapcar |
yuuji@23 | 76 (function |
yuuji@23 | 77 (lambda (help) |
yuuji@23 | 78 (if (file-exists-p help) |
yuuji@23 | 79 (progn |
yuuji@23 | 80 (set-buffer (find-file-noselect help)) |
yuuji@23 | 81 (save-excursion |
yuuji@23 | 82 (goto-char (point-min)) |
yuuji@23 | 83 (while (re-search-forward |
yuuji@23 | 84 (concat "^" (regexp-quote YaTeX-help-delimiter) |
yuuji@23 | 85 "\\(.+\\)$") nil t) |
yuuji@23 | 86 (setq entry (buffer-substring |
yuuji@23 | 87 (match-beginning 1) (match-end 1))) |
yuuji@23 | 88 (or (assoc entry entries) |
yuuji@23 | 89 (setq entries (cons (list entry) entries))))))))) |
yuuji@23 | 90 (list YaTeX-help-file YaTeX-help-file-private))) |
yuuji@80 | 91 entries)) |
yuuji@23 | 92 |
yuuji@80 | 93 (defvar YaTeX-help-entries nil |
yuuji@80 | 94 "Helo entries alist.") |
yuuji@80 | 95 (setq YaTeX-help-entries (YaTeX-help-entries)) |
yuuji@23 | 96 |
yuuji@23 | 97 (defun YaTeX-help-resolve-reference (buffer1 buffer2 &optional done-list) |
yuuji@23 | 98 "Replace reference format in buffer1 with refered contents in buffer2." |
yuuji@23 | 99 (let (ref ref-list beg end) |
yuuji@23 | 100 (save-excursion |
yuuji@23 | 101 (switch-to-buffer buffer1) |
yuuji@23 | 102 (goto-char (point-min)) |
yuuji@23 | 103 (while (re-search-forward YaTeX-help-reference-regexp nil t) |
yuuji@23 | 104 (setq ref (buffer-substring (match-beginning 1) (match-end 1)) |
yuuji@23 | 105 ref-list (cons (list ref) ref-list)) |
yuuji@23 | 106 (replace-match "") |
yuuji@23 | 107 (if (assoc ref done-list) nil ;already documented. |
yuuji@23 | 108 (switch-to-buffer buffer2) |
yuuji@23 | 109 (save-excursion |
yuuji@23 | 110 (goto-char (point-min)) |
yuuji@23 | 111 (if (re-search-forward |
yuuji@23 | 112 (concat (regexp-quote YaTeX-help-delimiter) |
yuuji@23 | 113 (regexp-quote ref) |
yuuji@23 | 114 "$") nil t) |
yuuji@23 | 115 (progn |
yuuji@23 | 116 (setq beg (progn (forward-line 2) (point)) |
yuuji@23 | 117 end (progn |
yuuji@23 | 118 (re-search-forward |
yuuji@23 | 119 (concat "^" (regexp-quote YaTeX-help-delimiter)) |
yuuji@23 | 120 nil 1) |
yuuji@23 | 121 (goto-char (match-beginning 0)) |
yuuji@23 | 122 (forward-line -1) |
yuuji@23 | 123 (while (and (bolp) (eolp) (not (bobp))) |
yuuji@23 | 124 (forward-char -1)) |
yuuji@23 | 125 (point))) |
yuuji@23 | 126 (switch-to-buffer buffer1) |
yuuji@23 | 127 (insert-buffer-substring buffer2 beg end)))) |
yuuji@23 | 128 (switch-to-buffer buffer1))) |
yuuji@23 | 129 (if beg (YaTeX-help-resolve-reference |
yuuji@80 | 130 buffer1 buffer2 (append done-list ref-list)))))) |
yuuji@23 | 131 |
yuuji@23 | 132 (defun YaTeX-refer-help (command help-file &optional append) |
yuuji@16 | 133 "Refer the COMMAND's help into HELP-FILE. |
yuuji@16 | 134 \[Help-file format\] |
yuuji@16 | 135 <DELIM><LaTeX/TeX command without escape character(\\)><NL> |
yuuji@16 | 136 <Synopsis><NL> |
yuuji@16 | 137 <Documentation><TERM> |
yuuji@16 | 138 Where: <DELIM> is the value of YaTeX-help-delimiter. |
yuuji@16 | 139 <NL> is newline. |
yuuji@16 | 140 <TERM> is newline or end of buffer." |
yuuji@16 | 141 (let ((hfbuf (find-file-noselect help-file)) |
yuuji@23 | 142 (hbuf (get-buffer-create YaTeX-help-buffer)) |
yuuji@16 | 143 (curwin (selected-window)) |
yuuji@16 | 144 sb se db de) |
yuuji@16 | 145 (set-buffer hfbuf) |
yuuji@16 | 146 (goto-char (point-min)) |
yuuji@16 | 147 (if (null |
yuuji@23 | 148 (let ((case-fold-search nil)) |
yuuji@23 | 149 (re-search-forward |
yuuji@23 | 150 (concat (regexp-quote YaTeX-help-delimiter) |
yuuji@23 | 151 (regexp-quote command) |
yuuji@23 | 152 "$") nil t))) |
yuuji@16 | 153 nil ;if not found, return nil |
yuuji@16 | 154 (forward-line 1) |
yuuji@16 | 155 (setq sb (point) |
yuuji@16 | 156 se (progn (forward-line 1) (point)) |
yuuji@16 | 157 db (point) |
yuuji@16 | 158 de (progn |
yuuji@23 | 159 (re-search-forward |
yuuji@23 | 160 (concat "^" (regexp-quote YaTeX-help-delimiter)) nil 1) |
yuuji@23 | 161 (- (point) (length YaTeX-help-delimiter)))) |
yuuji@23 | 162 (YaTeX-showup-buffer |
yuuji@354 | 163 hbuf 'YaTeX-showup-buffer-bottom-most t) |
yuuji@59 | 164 (set-buffer hbuf) |
yuuji@80 | 165 (setq buffer-read-only nil) |
yuuji@23 | 166 (if append (goto-char (point-max)) (erase-buffer)) |
yuuji@16 | 167 (insert YaTeX-help-synopsis "\n") |
yuuji@16 | 168 (insert-buffer-substring hfbuf sb se) |
yuuji@16 | 169 (insert "\n" YaTeX-help-description "\n") |
yuuji@16 | 170 (insert-buffer-substring hfbuf db de) |
yuuji@23 | 171 (YaTeX-help-resolve-reference hbuf hfbuf (list (list command))) |
yuuji@16 | 172 (goto-char (point-min)) |
yuuji@80 | 173 (setq buffer-read-only t) |
yuuji@80 | 174 (set-buffer-modified-p nil) |
yuuji@80 | 175 (YaTeX-help-mode) |
yuuji@16 | 176 (select-window curwin) |
yuuji@80 | 177 t))) |
yuuji@80 | 178 |
yuuji@80 | 179 (defun YaTeX-help-mode () |
yuuji@80 | 180 (interactive) |
yuuji@80 | 181 (use-local-map YaTeX-help-mode-map) |
yuuji@80 | 182 (setq major-mode 'yatex-help-mode |
yuuji@80 | 183 mode-name "YaTeX-HELP")) |
yuuji@80 | 184 |
yuuji@16 | 185 (defun YaTeX-help-newline (&optional arg) |
yuuji@16 | 186 (interactive "P") |
yuuji@16 | 187 (if (and (= (current-column) 1) (= (preceding-char) ?.) (eolp)) |
yuuji@16 | 188 (let ((cbuf (current-buffer))) |
yuuji@16 | 189 (beginning-of-line) |
yuuji@53 | 190 (delete-region (point) (progn (forward-line 1) (point))) |
yuuji@16 | 191 (save-excursion |
yuuji@16 | 192 (YaTeX-help-add-entry |
yuuji@16 | 193 YaTeX-help-command-current YaTeX-help-file-current)) |
yuuji@16 | 194 (set-window-configuration YaTeX-help-saved-config) |
yuuji@16 | 195 (bury-buffer cbuf)) |
yuuji@80 | 196 (newline arg))) |
yuuji@80 | 197 |
yuuji@16 | 198 (defun YaTeX-help-add-entry (command help-file) |
yuuji@16 | 199 (let ((hfbuf (find-file-noselect help-file)) |
yuuji@16 | 200 (dbuf (current-buffer)) beg end) |
yuuji@16 | 201 (goto-char (point-min)) |
yuuji@16 | 202 (re-search-forward (concat "^" (regexp-quote YaTeX-help-synopsis))) |
yuuji@16 | 203 (forward-line 1) (setq beg (point)) |
yuuji@16 | 204 (end-of-line) (setq end (point)) |
yuuji@16 | 205 (set-buffer hfbuf) |
yuuji@16 | 206 (goto-char (point-min)) |
yuuji@16 | 207 (insert YaTeX-help-delimiter command "\n") |
yuuji@16 | 208 (insert-buffer-substring dbuf beg end) |
yuuji@16 | 209 (insert "\n") |
yuuji@16 | 210 (set-buffer dbuf) |
yuuji@16 | 211 (re-search-forward (concat "^" (regexp-quote YaTeX-help-description))) |
yuuji@16 | 212 (forward-line 1) |
yuuji@16 | 213 (setq beg (point)) |
yuuji@16 | 214 (setq end (point-max)) |
yuuji@16 | 215 (set-buffer hfbuf) |
yuuji@16 | 216 (insert-buffer-substring dbuf beg end) |
yuuji@16 | 217 (insert "\n\n") |
yuuji@16 | 218 (forward-line -1) |
yuuji@16 | 219 (delete-blank-lines) |
yuuji@16 | 220 (let ((make-backup-files t)) |
yuuji@16 | 221 (basic-save-buffer)) |
yuuji@23 | 222 (bury-buffer hfbuf) |
yuuji@80 | 223 (setq YaTeX-help-entries (cons (list command) YaTeX-help-entries)))) |
yuuji@80 | 224 |
yuuji@16 | 225 (defun YaTeX-help-prepare-entry (command help-file) |
yuuji@16 | 226 "Read help description on COMMAND and add it to HELP-FILE." |
yuuji@16 | 227 (let ((buf (get-buffer-create "**Description**")) |
yuuji@16 | 228 (conf (current-window-configuration))) |
yuuji@23 | 229 (YaTeX-showup-buffer |
yuuji@354 | 230 buf 'YaTeX-showup-buffer-bottom-most t) |
yuuji@16 | 231 (make-local-variable 'YaTeX-help-file-current) |
yuuji@16 | 232 (make-local-variable 'YaTeX-help-command-current) |
yuuji@16 | 233 (make-local-variable 'YaTeX-help-saved-config) |
yuuji@16 | 234 (setq YaTeX-help-file-current help-file |
yuuji@16 | 235 YaTeX-help-command-current command |
yuuji@16 | 236 YaTeX-help-saved-config conf |
yuuji@16 | 237 mode-name "Text" |
yuuji@16 | 238 major-mode 'text) |
yuuji@16 | 239 (erase-buffer) |
yuuji@16 | 240 (insert YaTeX-help-synopsis "\n\n" YaTeX-help-description "\n\n") |
yuuji@16 | 241 (define-key YaTeX-help-entry-map "\r" 'YaTeX-help-newline) |
yuuji@16 | 242 (use-local-map YaTeX-help-entry-map) |
yuuji@16 | 243 (message |
yuuji@16 | 244 (cond (YaTeX-japan "入力を終えたら . のみ入力してRET") |
yuuji@80 | 245 (t "Type only `.' and RET to exit."))))) |
yuuji@80 | 246 |
yuuji@16 | 247 (defun YaTeX-enrich-help (command) |
yuuji@16 | 248 "Add the COMMAND's help to help file." |
yuuji@16 | 249 (if (y-or-n-p (format "No help on `%s'. Create help?" command)) |
yuuji@16 | 250 (YaTeX-help-prepare-entry |
yuuji@16 | 251 command |
yuuji@16 | 252 (if (y-or-n-p "Add help to global documentation?") |
yuuji@80 | 253 YaTeX-help-file YaTeX-help-file-private)))) |
yuuji@16 | 254 |
yuuji@16 | 255 (defun YaTeX-help-sort (&optional help-file) |
yuuji@16 | 256 "Sort help file HELP-FILE. |
yuuji@16 | 257 If HELP-FILE is nil or called interactively, sort current buffer |
yuuji@16 | 258 as a help file." |
yuuji@16 | 259 (interactive) |
yuuji@16 | 260 (if help-file (set-buffer (find-file-noselect help-file))) |
yuuji@16 | 261 (sort-regexp-fields |
yuuji@80 | 262 nil "\\(\\sw+\\)\\([^]+\\|\\s'\\)" "\\1" (point-min) (point-max))) |
yuuji@16 | 263 |
yuuji@23 | 264 (defun YaTeX-apropos-file (keyword help-file &optional append) |
yuuji@23 | 265 (let ((hb (find-file-noselect help-file)) |
yuuji@23 | 266 (ab (get-buffer-create YaTeX-help-buffer)) |
yuuji@23 | 267 (sw (selected-window)) |
yuuji@23 | 268 (head (concat "^" (regexp-quote YaTeX-help-delimiter))) |
yuuji@23 | 269 pt command) |
yuuji@354 | 270 (YaTeX-showup-buffer ab 'YaTeX-showup-buffer-bottom-most) |
yuuji@23 | 271 (select-window (get-buffer-window ab)) |
yuuji@23 | 272 (set-buffer ab) ;assertion |
yuuji@80 | 273 (setq buffer-read-only nil) |
yuuji@23 | 274 (or append (erase-buffer)) |
yuuji@23 | 275 (set-buffer hb) |
yuuji@23 | 276 (goto-char (point-min)) |
yuuji@23 | 277 (while (re-search-forward keyword nil t) |
yuuji@23 | 278 (setq pt (point)) |
yuuji@23 | 279 (re-search-backward head nil t) |
yuuji@23 | 280 (setq command (buffer-substring (match-end 0) (point-end-of-line))) |
yuuji@23 | 281 (switch-to-buffer ab) |
yuuji@23 | 282 (goto-char (point-max)) |
yuuji@23 | 283 (insert-char ?- (1- (window-width))) |
yuuji@23 | 284 (insert (format "\n<<%s>>\n" command)) |
yuuji@23 | 285 (YaTeX-refer-help command help-file t) ;append mode |
yuuji@80 | 286 (setq buffer-read-only nil) |
yuuji@23 | 287 (set-buffer hb) |
yuuji@23 | 288 (goto-char pt) |
yuuji@23 | 289 (if (re-search-forward head nil 1) |
yuuji@23 | 290 (goto-char (1- (match-beginning 0))))) |
yuuji@80 | 291 (setq buffer-read-only t) |
yuuji@23 | 292 (select-window sw) |
yuuji@80 | 293 pt)) |
yuuji@23 | 294 |
yuuji@23 | 295 ;;;###autoload |
yuuji@23 | 296 (defun YaTeX-apropos (key) |
yuuji@23 | 297 (interactive "sLaTeX apropos (regexp): ") |
yuuji@58 | 298 (if (string= "" key) (error "Nothing to show")) |
yuuji@80 | 299 (setq YaTeX-help-saved-config (current-window-configuration)) |
yuuji@23 | 300 (or (YaTeX-apropos-file key YaTeX-help-file) |
yuuji@23 | 301 (YaTeX-apropos-file key YaTeX-help-file-private t) |
yuuji@80 | 302 (message "No matches found."))) |
yuuji@23 | 303 |
yuuji@16 | 304 ;;;###autoload |
yuuji@339 | 305 (defun YaTeX-help (&optional macro) |
yuuji@339 | 306 "Show help buffer of LaTeX/TeX commands or macros. |
yuuji@339 | 307 Optional argument MACRO, if supplied, is directly selected to keyword." |
yuuji@16 | 308 (interactive) |
yuuji@16 | 309 (let (p beg end command) |
yuuji@16 | 310 (save-excursion |
yuuji@16 | 311 (if (looking-at YaTeX-ec-regexp) |
yuuji@16 | 312 (goto-char (match-end 0))) |
yuuji@16 | 313 (setq p (point)) ;remember current position. |
yuuji@16 | 314 (cond |
yuuji@339 | 315 (macro nil) |
yuuji@16 | 316 ((YaTeX-on-begin-end-p) |
yuuji@16 | 317 ;;if on \begin or \end, extract its environment. |
yuuji@16 | 318 (setq command |
yuuji@16 | 319 (cond ((match-beginning 1) |
yuuji@16 | 320 (buffer-substring (match-beginning 1) (match-end 1))) |
yuuji@16 | 321 ((match-beginning 2) |
yuuji@16 | 322 (buffer-substring (match-beginning 2) (match-end 2)))))) |
yuuji@16 | 323 ((search-backward YaTeX-ec (point-beginning-of-line) t) |
yuuji@16 | 324 (goto-char (setq beg (match-end 0))) |
yuuji@23 | 325 (re-search-forward YaTeX-TeX-token-regexp (point-end-of-line) t) |
yuuji@16 | 326 (setq end (point)) |
yuuji@16 | 327 (if (and (<= beg p) (<= p end)) |
yuuji@16 | 328 (setq command (buffer-substring beg end))))) |
yuuji@16 | 329 (if (or (string= command "begin") (string= command "end")) |
yuuji@16 | 330 (progn |
yuuji@16 | 331 (search-forward "{" (point-end-of-line)) |
yuuji@16 | 332 (setq beg (point)) |
yuuji@16 | 333 (search-forward "}" (point-end-of-line)) |
yuuji@16 | 334 (setq command (buffer-substring beg (match-beginning 0))))) |
yuuji@16 | 335 (setq command |
yuuji@339 | 336 (or macro |
yuuji@339 | 337 (completing-read |
yuuji@339 | 338 "Describe (La)TeX command: " |
yuuji@339 | 339 YaTeX-help-entries nil nil command))));end excursion |
yuuji@339 | 340 |
yuuji@80 | 341 (setq YaTeX-help-saved-config (current-window-configuration)) |
yuuji@16 | 342 (or (YaTeX-refer-help command YaTeX-help-file) |
yuuji@16 | 343 (YaTeX-refer-help command YaTeX-help-file-private) |
yuuji@80 | 344 (YaTeX-enrich-help command)))) |