I am writing an Emacs Lisp function which needs to know the character directly under point in the line below, returning nil when no such character exists. I thus defined the function char-below, which seems to work well except that it breaks down in case the line below has tabs.
(defun char-below () (condition-case nil (aref (buffer-substring-no-properties (line-beginning-position 2) (line-end-position 2)) (- (point) (line-beginning-position))) (error nil))) Is there a built-in elisp function to accomplish this? If not, is there a cleverer way to write char-below, accounting for the presence of tabs?
EDIT: I tried a solution based on next-line but there seems to be a problem with using next-line in Lisp code, as observed in its doc-string:
"This function is for interactive use only; in Lisp code use
forward-lineinstead."
A way to illustrate the problem is by defining the following key-binding, using the char-below function proposed by Erik Sjöstrand, which is supposed to display the character below in the message area and move forward one char.
(global-set-key (kbd "<f12>") (lambda () (interactive) (message (char-below)) (forward-char))) Curiously, repeated pressed of the key f12 thus defined keep messaging the same character below the position point was at the time of the FIRST invocation of f12.
I think this is because next-line uses goal columns, and somehow the goal column is not updated when the above key is repeated.
EDIT 2
By the way, Erik initially proposed the function char-below as follows
(defun char-below () (ignore-errors (save-excursion (next-line) (string (following-char))))) and this is the function that causes the error I mentioned above. Since then Eric has edited his function inserting the command (setq temporary-goal-column nil) which fixes this issue.