Appendix C Configuration Examples

Question: You have all these complicated configuration options in your package, but which ones do you as the maintainer actually set in your own configuration?

Answer: Not many, beyond custom key bindings. I set most defaults the way that seems best. However, the default settings do not turn on features which:

To see what I mean, here is the entire configuration the old maintainer had in his .emacs:

(setq idlwave-shell-debug-modifiers '(control shift)
      idlwave-store-inquired-class t
      idlwave-shell-automatic-start t
      idlwave-main-block-indent 2
      idlwave-init-rinfo-when-idle-after 2
      idlwave-help-dir "~/lib/emacs/idlwave"
      idlwave-special-lib-alist '(("/idl-astro/" . "AstroLib")
                                  ("/jhuapl/" . "JHUAPL-Lib")
                                  ("/dominik/lib/idl/" . "MyLib")))

However, if you are an Emacs power-user and want IDLWAVE to work completely differently, you can change almost every aspect of it. Here is an example of a much more extensive configuration of IDLWAVE. The user is King!

;;; Settings for IDLWAVE mode

(setq idlwave-block-indent 3)           ; Indentation settings
(setq idlwave-main-block-indent 3)
(setq idlwave-end-offset -3)
(setq idlwave-continuation-indent 1)
(setq idlwave-begin-line-comment "^;[^;]")  ; Leave ";" but not ";;"
                                            ; anchored at start of line.
(setq idlwave-surround-by-blank t)      ; Turn on padding ops =,<,>
(setq idlwave-pad-keyword nil)          ; Remove spaces for keyword '='
(setq idlwave-expand-generic-end t)     ; convert END to ENDIF etc...
(setq idlwave-reserved-word-upcase t)   ; Make reserved words upper case
                                        ; (with abbrevs only)
(setq idlwave-abbrev-change-case nil)   ; Don't force case of expansions
(setq idlwave-hang-indent-regexp ": ")  ; Change from "- " for auto-fill
(setq idlwave-show-block nil)           ; Turn off blinking to begin
(setq idlwave-abbrev-move t)            ; Allow abbrevs to move point
(setq idlwave-query-class '((method-default . nil) ; No query for method
                            (keyword-default . nil); or keyword completion
                            ("INIT" . t)           ; except for these
                            ("CLEANUP" . t)
                            ("SETPROPERTY" .t)
                            ("GETPROPERTY" .t)))

;; Using w3m for help (must install w3m and emacs-w3m)
(autoload 'w3m-browse-url "w3m" "Interface for w3m on Emacs." t)
(setq idlwave-help-browser-function 'w3m-browse-url
      w3m-use-tab nil ; no tabs, location line, or toolbar
      w3m-use-header-line nil
      w3m-use-toolbar nil)

;; Close my help window or frame when w3m closes with 'q'.
(defadvice w3m-close-window (after idlwave-close activate)
  (if (boundp 'idlwave-help-frame)
      (idlwave-help-quit)))

;; Some setting can only be done from a mode hook.  Here is an example:
(add-hook 'idlwave-mode-hook
  (lambda ()
    (setq case-fold-search nil)          ; Make searches case sensitive
    ;; Run other functions here
    (font-lock-mode 1)                   ; Turn on font-lock mode
    (idlwave-auto-fill-mode 0)           ; Turn off auto filling
    (setq idlwave-help-browser-function 'browse-url-w3)

    ;; Pad with 1 space (if -n is used then make the
    ;; padding a minimum of n spaces.)  The defaults use -1
    ;; instead of 1.
    (idlwave-action-and-binding "=" '(idlwave-expand-equal 1 1))
    (idlwave-action-and-binding "<" '(idlwave-surround 1 1))
    (idlwave-action-and-binding ">" '(idlwave-surround 1 1 '(?-)))
    (idlwave-action-and-binding "&" '(idlwave-surround 1 1))

    ;; Only pad after comma and with exactly 1 space
    (idlwave-action-and-binding "," '(idlwave-surround nil 1))
    (idlwave-action-and-binding "&" '(idlwave-surround 1 1))

    ;; Pad only after '->', remove any space before the arrow
    (idlwave-action-and-binding "->"  '(idlwave-surround 0 -1 nil 2))

    ;; Set some personal bindings
    ;; (In this case, makes ',' have the normal self-insert behavior.)
    (local-set-key "," 'self-insert-command)
    (local-set-key [f5] 'idlwave-shell-break-here)
    (local-set-key [f6] 'idlwave-shell-clear-current-bp)

    ;; Create a newline, indenting the original and new line.
    ;; A similar function that does _not_ reindent the original
    ;; line is on "\C-j" (The default for emacs programming modes).
    (local-set-key "\n" 'idlwave-newline)
    ;; (local-set-key "\C-j" 'idlwave-newline) ; My preference.

    ;; Some personal abbreviations
    (define-abbrev idlwave-mode-abbrev-table
      (concat idlwave-abbrev-start-char "wb") "widget_base()"
      (idlwave-keyword-abbrev 1))
    (define-abbrev idlwave-mode-abbrev-table
      (concat idlwave-abbrev-start-char "on") "obj_new()"
      (idlwave-keyword-abbrev 1))
    ))

;;; Settings for IDLWAVE SHELL mode

(setq idlwave-shell-overlay-arrow "=>")        ; default is ">"
(setq idlwave-shell-use-dedicated-frame t)     ; Make a dedicated frame
(setq idlwave-shell-prompt-pattern "^WAVE> ")  ; default is "^IDL> "
(setq idlwave-shell-explicit-file-name "wave")
(setq idlwave-shell-process-name "wave")
(setq idlwave-shell-use-toolbar nil)           ; No toolbar

;; Most shell interaction settings can be done from the shell-mode-hook.
(add-hook 'idlwave-shell-mode-hook
          (lambda ()
            ;; Set up some custom key and mouse examine commands
            (idlwave-shell-define-key-both [s-down-mouse-2]
                                 (idlwave-shell-mouse-examine
                                  "print, size(___,/DIMENSIONS)"))
            (idlwave-shell-define-key-both [f9] (idlwave-shell-examine
                                       "print, size(___,/DIMENSIONS)"))
            (idlwave-shell-define-key-both [f10] (idlwave-shell-examine
                                        "print,size(___,/TNAME)"))
            (idlwave-shell-define-key-both [f11] (idlwave-shell-examine
                                        "help,___,/STRUCTURE"))))