ESS/SAS key bindings.

Thomas Gerds gerds at
Fri Sep 27 12:46:28 CEST 2002

Bo Peng <bpeng at> writes:

> The idea ways (to me) to use ESS/SAS mode would be:
> In batch mode:
> 1. open emacs
> 2. F3, run, F4 go back to program window etc. 
>   Problem: with ess-sas-local-unix-keys, I can not
>   use F4 to go from sh or log window to the program window.
>   This only works for ess-sas-global-unix-keys.
> In interactive mode:
> 1. open emacs
> 2. M-x SAS
> 3. Since ESS know that I am in interactive mode, I would like to use
>   F3 to submit the buffer, F4, F5, F6 switch between program, SAS.lst, 
>   SAS.log window. 
>   Problems: 
>     a) No easy way to switch between windows. (F3, F4 will cause
>        confusion now.)
>     b) Log and lst window do not automatically go to the 
>        beginning of the newest log/output.
>     c) Key bindings for ess-mode-map does not work for sas-mode. 
>        I have to use sas-mode-local-map instead.
> Mixture of batch and interactive mode: Very confusing.
> In general, I would like to customize ESS/SAS with:
> 1. set ess-sas-global-unix-keys when I open a SAS file. I could
>    not find a sas-mode-hook to do this.
> 2. In batch mode, map F4, F5, F6 keys for shell, output and list window
>    so that I can switch between windows easily. (This is less intrusive
>    than ess-sas-global-unix-keys.)
> 3. In interactive mode, map F4, F5, F6 to switch between SAS.lst,
>    SAS.log and the program window.
> Since I am new to ESS/SAS, my wishes might not be appropriate. Any
> suggestion is welcome.

in (x)emacs (buffer) local key bindings are best set in the
corresponding mode hook:

you could define (in your .emacs/init.el) after (require 'ess):

(defun my-ess-mode ()
  (cond ((string= "R" ess-dialect)
	 (message "my-r-mode")
	 ;; customization for ESS[R] here
	 (define-key ess-mode-map 'f8 'push-window-configuration))
	((string= "SAS" ess-dialect)
	 (message "my-SAS-mode")
	 ;; customization for ESS[SAS] here
	 ;; the following is the body of ess-sas-global-unix-keys (modified)
	 (define-key sas-mode-local-map (quote [f2]) 'ess-revert-wisely)
	 (define-key sas-mode-local-map (quote [f3]) 'ess-sas-submit)
	 (define-key sas-mode-local-map [(control f3)] 'ess-sas-submit-region)
	 (define-key sas-mode-local-map (quote [f4]) 'ess-sas-goto-sas)
	 (define-key sas-mode-local-map (quote [f5]) 'ess-sas-goto-log)
	 (define-key sas-mode-local-map [(control f5)] 'ess-sas-append-log)
	 (define-key sas-mode-local-map (quote [f6]) 'ess-sas-goto-lst)
	 (define-key sas-mode-local-map [(control f6)] 'ess-sas-append-lst)
	 (define-key sas-mode-local-map (quote [f7]) 'ess-sas-goto-file-1)
	 (define-key sas-mode-local-map (quote [f8]) 'shell)
	 (define-key sas-mode-local-map (quote [f9]) 'ess-sas-data-view)
	 (define-key sas-mode-local-map (quote [f10]) 'ess-sas-toggle-sas-log-mode)
	 (define-key sas-mode-local-map (quote [f11]) 'ess-sas-goto-file-2)
	 (define-key sas-mode-local-map (quote [f12]) 'ess-sas-graph-view)
	 (if (and ess-sas-edit-keys-toggle
		  (equal emacs-major-version 19) (equal emacs-minor-version 28))
	     (define-key sas-mode-local-map [C-tab] 'ess-sas-backward-delete-tab)
	   (define-key sas-mode-local-map [(control tab)] 'ess-sas-backward-delete-tab))
	 (define-key sas-mode-local-map "\C-c\C-p" 'ess-sas-file-path))
	((string= "STATA" ess-dialect)
	 ;; customization for ESS[STA] here

and then hook this into the appropriate place:

(add-hook 'ess-mode-hook 'my-ess-mode)       

now if you want different keys for SAS interactive mode then probably 
the following helps:

(add-hook 'ess-post-run-hook (lambda ()
          (define-key sas-mode-local-map (quote [f3]) 'ess-eval-region)))

for defining keys local keys also for SAS log and SAS lst the easiest
thing would be to make a local copy of the functions 

(defun SAS-log-mode ()
  "`ess-transcript-mode' for SAS."
  (ess-transcript-minor-mode 1)
  (define-key 'f4 'ess-sas-goto-sas)
  (toggle-read-only t)) ;; to protect the buffer.

(defun SAS-listing-mode()
  "Fundamental mode with `ess-listing-minor-mode' and read-only."
  (ess-listing-minor-mode t)
  (use-local-map sas-mode-local-map)
  (define-key 'f4 'ess-sas-goto-sas)
  (toggle-read-only t)) ;; to protect the buffer.

extended with your key-bindings ... 

hope this helps a bit.


no signature
ess-help mailing list -- To (un)subscribe, send
subscribe	or	unsubscribe
(in the "body", not the subject !)  To: ess-help-request at

More information about the ESS-help mailing list