Emacs Lisp编程实践——实现循环切换类型的函数

今天来实现一种函数,这种函数有一个特点就是:每次调用这个函数的效果都不同,在调用了若干次之后,又会从第一种效果从头开始,像是一个循环圈。这种场景对于循环设置某个状态变量的值很有用。

利用函数属性可以实现这样的函数,下面是两个demo:

;; 实现在黑、白两种颜色之前切换当前的背景颜色
(defun my-toggle-bg-color ()
  "Toggle change background color between two colors."
  (interactive)
  (if (get 'my-toggle-bg-color 'state)
      (progn
    (set-background-color "white")
    (put 'my-toggle-bg-color 'state nil))
    (progn
      (set-background-color "black")
      (put 'my-toggle-bg-color 'state t))))

多次使用M-x调用my-toggle-bg-color函数,可以发现当前的背景颜色就在黑、白两种颜色之间切换。

;; 实现在白、黑、红、黄、蓝5种颜色之前切换当前的背景颜色
(defun my-cycle-bg-color (@n)
  "Cycle change background color among more than two colors."
  (interactive "p")
  (let* (($colors (list "white" "black" "red" "yellow" "blue"))
     ($idx-before (if (get 'my-cycle-bg-color 'state)
              (get 'my-cycle-bg-color 'state)
            0))
     ($idx-now (% (+ $idx-before @n) (length $colors)))
     ($color-now (nth $idx-now $colors)))
    (set-background-color $color-now)
    (put 'my-cycle-bg-color 'state $idx-now)
    (message "background color changed to: %s" $color-now)))

多次使用M-x调用my-cycle-bg-color函数,可以发现当前的背景颜色就在5种颜色之间切换。

此外,还可以使用C-u命令传入一个数值,改变每次切换的步长(默认步长为1)。

你可能感兴趣的:(Emacs Lisp编程实践——实现循环切换类型的函数)