emacs
in this
case.)emacs
functions,
which I usually add to my ~/.emacs
configuration file.
Before start, I prefer using Emacs in the terminal mode, and the following
bash
alias is useful to have in the .bashrc
file:
alias em='emacs -nw'
Going back to the .emacs
file, I do not use Emacs Lisp that
often, so one item to aways remember is that the line comments start with
a semi-colon (;
):
; Line comment
I prefer not to have syntax highlighting:
(global-font-lock-mode 0)and I like to see column numbers:
(column-number-mode t)
Macro repeat [f8]. Recording a macro is a useful feature of Emacs.
We start recording with C-x (
and stop recording with
C-x )
. All operations between the start and stop are now
recorded and can be repeated with C-x e
. This key sequence
actually calls the Emacs function call-last-kbd-macro
and
I find it useful to link it to one of the keyboard function keys,
f8
in particular, in the following way:
(global-set-key [f8] 'call-last-kbd-macro)
Moving line up and down [Alt+Up] [Alt+Down].
It is frequently very useful to be able to easily move aline of text
up or down in a text file. We a use shortcuts Alt+Up
and Alt+Down
(press Alt key and with arrow keys Up and Down move the line). This
is achieved with the following Emacs set-up code:
;; Moving a line of text (defun move-line (n) "Move the current line up or down by N lines." (interactive "p") (let ((col (current-column)) start end) (beginning-of-line) (setq start (point)) (end-of-line) (forward-char) (setq end (point)) (let ((line-text (delete-and-extract-region start end))) (forward-line n) (insert line-text) ;; restore point to original column in moved line (forward-line -1) (forward-char col)))) (defun move-line-up (n) "Move the current line up by N lines." (interactive "p") (move-line (if (null n) -1 (- n)))) (defun move-line-down (n) "Move the current line down by N lines." (interactive "p") (move-line (if (null n) 1 n))) ; Alt-up Alt-down (global-set-key (kbd "<A-up>") 'move-line-up) (global-set-key (kbd "<A-down>") 'move-line-down) (global-set-key (kbd "<M-up>") 'move-line-up) (global-set-key (kbd "<M-down>") 'move-line-down) ; in tmux below is required (global-set-key (kbd "ESC <up>") 'move-line-up) (global-set-key (kbd "ESC <down>") 'move-line-down)
Save, recompile, and reopen [f5] [f6].
Emacs has nice compile
and recompile
functions,
which I frequently use to compile programs but also to do all kinds of
"executions" such as: any make
recipes, compile and test run,
script test run, web-site updates, and so on. The old IDEs such as Turbo
Pascal, Microsoft Visual-something, and others used F5 keyboard hotkey to
do "Run"; i.e., execute a progam. So, I wire f5
in a similar way:
; f5 used to recompile (global-set-key [f5] (lambda () (interactive) (save-buffer) (if (fboundp 'recompile) (recompile) (compile (read-string "Compile command: " compile-command)))))When we press
f5
for the first time, it will prompt us to edit
the compile command, and it will be used later for each new invocation of
f5
.
Frequently I need to save file, recompile and reopen it, especially when using Starfish:
; f6 = Recompile and re-open (global-set-key [f6] 'recompile-and-reopen) (setq reopen-after-compile nil) ; flag to activate re-open hook (setq reopen-finish-added nil) ; indicator that hook is added (defun recompile-and-reopen () "Save file, recompile, and re-open it" (interactive nil) (save-buffer (current-buffer)) (setq fileName (buffer-file-name)) (setq reopen-after-compile t) (if (not reopen-finish-added) (progn (add-hook 'compilation-finish-functions #'(lambda (buf str) (if (and reopen-after-compile (string-match "finished" str)) (progn ; I was trying to use here (revert-buffer t t) somehow ; but it causes infinite recursion. Warning about updating ; file from disk is not removed yet. (delete-other-windows) (find-file fileName) (message "---------- File Compiled and Reopened ----------") (sleep-for 1) (message "") )) (setq reopen-after-compile nil) )) (setq reopen-finish-added t) )) (if (fboundp 'recompile) (recompile) (compile (read-string "Compile command: " compile-command))) (message "---------- DONE ----------") (sleep-for 1) (message "") )