(add-to-list 'cperl-mode-hook (lambda () (substitute-key-definition 'save-buffer 'cperl-save-buffer cperl-mode-map global-map))) (defun cperl-save-buffer (&optional args) (interactive "p") (if (buffer-modified-p) (perltidy-buffer)) (save-buffer t)) (defun perltidy-buffer () (interactive) (let ((orig-point (point))) (shell-command-on-region (point-min) (point-max) "perltidy -st" nil t shell-command-default-error-buffer) (goto-char (if (<= orig-point (point-max)) orig-point (point-max)))))