Emacs: Select Line, between Quotes, Extend Selection
Master these text selection commands, and you almost will never need to set mark.
Select Text between Quotes/Brackets
Select text inside quotes is one of the most frequently needed operation in programing languages code.
(defun xah-select-text-in-quote () "Select text between the nearest left and right delimiters. Delimiters here includes the following chars: \"`<>(){}[]“”‘’‹›«»「」『』【】〖〗《》〈〉〔〕() This command select between any bracket chars, does not consider nesting. For example, if text is (a(b)c▮) the selected char is “c”, not “a(b)c”. URL `http://xahlee.info/emacs/emacs/modernization_mark-word.html' Version 2020-11-24 2021-07-11" (interactive) (let ( $skipChars $p1 ) (setq $skipChars "^\"`<>(){}[]“”‘’‹›«»「」『』【】〖〗《》〈〉〔〕()〘〙") (skip-chars-backward $skipChars) (setq $p1 (point)) (skip-chars-forward $skipChars) (set-mark $p1)))
Select Current Line
This command selects current line.
If there's already a selection, extend selection downward by line.
(defun xah-select-line () "Select current line. If region is active, extend selection downward by line. URL `http://xahlee.info/emacs/emacs/modernization_mark-word.html' Version 2017-11-01" (interactive) (if (region-active-p) (progn (forward-line 1) (end-of-line)) (progn (end-of-line) (set-mark (line-beginning-position)))))
Select Current Block
This lets you select current block of text. (a block here is text between empty lines.)
If there's already a selection, extend selection downward by block.
(defun xah-select-block () "Select the current/next block of text between blank lines. If region is active, extend selection downward by block. URL `http://xahlee.info/emacs/emacs/modernization_mark-word.html' Version 2019-12-26" (interactive) (if (region-active-p) (re-search-forward "\n[ \t]*\n" nil "move") (progn (skip-chars-forward " \n\t") (when (re-search-backward "\n[ \t]*\n" nil "move") (re-search-forward "\n[ \t]*\n")) (push-mark (point) t t) (re-search-forward "\n[ \t]*\n" nil "move"))))
Extend Selection
Here's a multi-purpose command that select different text depending on where cursor is, and if called repeatedly, extend selection.
This command is currently most useful in lisp code. Or, place cursor on a bracket and select the whole including bracket and text in between. (bracket here includes parenthesis and any type of quotation marks.)
(defun xah-extend-selection () "Select the current word, bracket/quote expression, or expand selection. Subsequent calls expands the selection. when there's no selection, • if cursor is on a any type of bracket (including parenthesis, quotation mark), select whole bracketed thing including bracket • else, select current word. when there's a selection, the selection extension behavior is still experimental. But when cursor is on a any type of bracket (parenthesis, quote), it extends selection to outer bracket. URL `http://xahlee.info/emacs/emacs/modernization_mark-word.html' Version 2020-02-04" (interactive) (if (region-active-p) (progn (let (($rb (region-beginning)) ($re (region-end))) (goto-char $rb) (cond ((looking-at "\\s(") (if (eq (nth 0 (syntax-ppss)) 0) (progn ;; (message "left bracket, depth 0.") (end-of-line) ; select current line (set-mark (line-beginning-position))) (progn ;; (message "left bracket, depth not 0") (up-list -1 t t) (mark-sexp)))) ((eq $rb (line-beginning-position)) (progn (goto-char $rb) (let (($firstLineEndPos (line-end-position))) (cond ((eq $re $firstLineEndPos) (progn ;; (message "exactly 1 line. extend to next whole line." ) (forward-line 1) (end-of-line))) ((< $re $firstLineEndPos) (progn ;; (message "less than 1 line. complete the line." ) (end-of-line))) ((> $re $firstLineEndPos) (progn ;; (message "beginning of line, but end is greater than 1st end of line" ) (goto-char $re) (if (eq (point) (line-end-position)) (progn ;; (message "exactly multiple lines" ) (forward-line 1) (end-of-line)) (progn ;; (message "multiple lines but end is not eol. make it so" ) (goto-char $re) (end-of-line))))) (t (error "logic error 42946" )))))) ((and (> (point) (line-beginning-position)) (<= (point) (line-end-position))) (progn ;; (message "less than 1 line" ) (end-of-line) ; select current line (set-mark (line-beginning-position)))) (t ;; (message "last resort" ) nil)))) (progn (cond ((looking-at "\\s(") ;; (message "left bracket") (mark-sexp)) ; left bracket ((looking-at "\\s)") ;; (message "right bracket") (backward-up-list) (mark-sexp)) ((looking-at "\\s\"") ;; (message "string quote") (mark-sexp)) ; string quote ;; ((and (eq (point) (line-beginning-position)) (not (looking-at "\n"))) ;; (message "beginning of line and not empty") ;; (end-of-line) ;; (set-mark (line-beginning-position))) ((or (looking-back "\\s_" 1) (looking-back "\\sw" 1)) ;; (message "left is word or symbol") (skip-syntax-backward "_w" ) ;; (re-search-backward "^\\(\\sw\\|\\s_\\)" nil t) (push-mark) (skip-syntax-forward "_w") (setq mark-active t) ;; (exchange-point-and-mark) ) ((and (looking-at "\\s ") (looking-back "\\s " 1)) ;; (message "left and right both space" ) (skip-chars-backward "\\s " ) (set-mark (point)) (skip-chars-forward "\\s ")) ((and (looking-at "\n") (looking-back "\n" 1)) ;; (message "left and right both newline") (skip-chars-forward "\n") (set-mark (point)) (re-search-forward "\n[ \t]*\n")) ; between blank lines, select next text block (t ;; (message "just mark sexp" ) (mark-sexp) (exchange-point-and-mark)) ;; ))))
You should give these commands keys. [see Emacs: How to Define Keys].
I suggest these keybinding:
xah-select-block
【Alt+6】xah-select-line
【Alt+7】xah-extend-selection
【Alt+8】xah-select-text-in-quote
【Alt+9】
xah-extend-selection
is even more useful together with commands that move cursor to brackets or quotes. [see Emacs: Move Cursor to Bracket]
The above commands are also in ergoemacs-mode [https://ergoemacs.github.io/ ] and xah-fly-keys. [see Emacs: Xah Fly Keys]
Emacs Modernization
- Simple Changes Emacs Should Adopt
- Why Emacs Keys are Painful
- Ban Scratch Buffer
- M-x vs Alt+x Notation
- Menu Idiocy
- Mode Line Problem
- cua-mode Problem
- Inconsistency of Search
- grep in emacs Pain
- Problems of describe-mode
- Problems of Emacs Manual
- Emacs Manual Sucks by Examples
- kill-buffer Problem
- Emacs Spell Checker Pain
- Form Feed ^L
- Single Key Delete Whole Line
- Emacs HTML Mode Sucks
- Emacs No View Image on Windows
- HTML should replace Texinfo
- Support HTML Mail
- Problems of “man”
- Emacs Lisp Mode Syntax Coloring Problem
- Emacs AHK Mode Problems
- Ban Syntax Table
- Make elisp-index-search use Current Symbol
- Texinfo Invalid HTML
- Disappearing FSF URLs, 2006
- Emacs Manual Node Persistency Issues
- Emacs: dired-do-query-replace-regex Replace ALL (fixed)
- Problems of Emacs Supporting Obsolete Systems
- Elisp: Function to Copy/Delete a Dir Recursively (fixed)
- CommonLisp/SchemeLisp Emacs
- Text Editors Popularity
- Cursor Movement Behavior Survey
- Letter-Case Commands Problem
- Select Line/Block/Quote, Extend
- isearch Current Word
- Reformat Line Wrap