This page is a overview of how text manipulation is done using emacs lisp.
In emacs, a user can program it using the embedded language (called Emacs Lisp, or elisp) so that he can have custom functions to insert texts, templates, process files, and many other features of emacs. This page gives a overview of how this environment works.
Emacs provides you with a text-edit programing framework. More specifically, a set of functions for text manipulation.
For example, there is a lisp function that returns the cursor position in a buffer. A function that returns the beginning/ending position of the text selection. Functions that move the cursor to a given position, or delete a block of text of given positions. Functions that insert a string at a given position. Functions that open or save files. Functions that list opened files. Functions that list buffer names. Function that returns the current mode of a given buffer. Functions that activate modes. Functions that make a section of text into a particular color or font, … and much more.
So, programing emacs to manipulate text, is a matter of calling these functions provided in Emacs.
Here are some examples of simple elisp functions.
;; current cursor position is called “point”. ;; The first char in buffer is 1 ;; This returns the current cursor position (point) ;; returns the position of the beginning/end of region (region-beginning) (region-end) ;; position for beginning/ending of current line (line-beginning-position) (line-end-position) ;; returns the position for the beginning/end of buffer, taking account of narrow-to-region (point-min) (point-max)
;; move cursor to position 392 (goto-char 392) ;; move cursor by n chars (forward-char n) (backward-char n) ;; move cursor to the location of myStr ;; returns the new position (search-forward myStr) ; end of myStr (search-backward myStr) ; beginning of myStr ;; move cursor to the location matched by a regex ;; returns the new position (re-search-forward myRegex) (re-search-backward myRegex) ;; move cursor to the first char that's not “a to z” ;; Returns the distance traveled. (skip-chars-forward "a-z") (skip-chars-backward "a-z")
;; delete 9 chars starting at current cursor pos (delete-char 9) ;; deleting text (delete-region myStartPos myEndPos) ;; insert string at current cursor position (insert "hi i ♥ u.") ;; get the string from buffer (setq myStr (buffer-substring myStartPos myEndPos)) ;; change case (capitalize-region myStartPos myEndPos)
;; length (length "abc") ; returns 3 ;; gets a substring (substring myStr startIndex endIndex) ;; change a given string using regex (replace-regexp-in-string myRegex myReplacement myStr)
;; return the name of current buffer (buffer-name) ;; return the full path of current file (buffer-file-name) ;; switch to the buffer named myBufferName (set-buffer myBufferName) ;; save current buffer (save-buffer) ;; close a buffer (kill-buffer myBuffName) ;; close the current buffer (kill-this-buffer) ;; temporarily sets a buffer as current to work with (with-current-buffer myBuffer ;; do something here … )
;; open a file (in a buffer) (find-file myPath) ;; same as “Save As”. ; close current buffer and open the new saved (write-file myPath) ;; insert file into current position (insert-file-contents myPath) ;; append a text block to file (append-to-file myStartPos myEndPos myPath) ;; renaming file (rename-file fileName newName) ;; copying file (copy-file oldName newName) ;; deleting file (delete-file fileName) ;; get dir path (file-name-directory myFullPath) ;; get filename part (file-name-nondirectory myFullPath) ;; get filename's suffix (file-name-extension myFileName) ;; get filename sans suffix (file-name-sans-extension myFileName)
This code illustrates how to insert a string, then position cursor somewhere inside.
(defun insert-p-tag () "Insert <p></p> at cursor point." (interactive) (insert "<p></p>") (backward-char 4))
Type the above, then select the whole code, call
eval-region 【Alt+x】. To execute the command, call “insert-p-tag”.
For many simple and practical elisp examples, see Elisp Examples.
For a basic intro of elisp, see: Emacs Lisp Basics.
The above gives you many examples of text-processing functions in elisp.
The other area of elisp programing, is to program emacs itself, to create major or minor modes and their interface. For example, creating menus, interpreting keyboard inputs, changing behavior of mouse buttons, syntax coloring, manipulating windows, displaying image files, creating a file manager (dired), creating a interactive command line interface (shell), programing network clients (⁖ ftp, irc, http), creating user interface (menus, buttons, toolbars, status bar), creating keyword completion, etc. In summary, these type of tasks we can call it “Programing a Major Mode”.
Tasks of writing a mode is slightly more complex, because it involves understanding many of emacs's systems. For example, keyboard/mouse input event system, display system (windows and fonts), user interface system (menu, windows, scroll bar, tool bar), major/minor mode's structure.
For most people, text edit programing is far more useful to learn, because that's what text editor users need to do in their jobs, and most major modes have already been written for them.
For writing a major mode, you should first have good elisp experience in text processing first. Here's a basic example of writing a major mode: How to Write a Emacs Major Mode for Syntax Coloring.blog comments powered by Disqus