Skip to content

Latest commit

 

History

History
91 lines (76 loc) · 3.51 KB

elisp-tips.org

File metadata and controls

91 lines (76 loc) · 3.51 KB

elisp-tips

button

如何更改button label

一个button其实就是一个overlay,通过修改button-start到button-end之间的文字即可更改button label.

(defun set-button-label (btn label)
  ""
  (replace-regexp ".+" label nil (button-start btn) (button-end btn)))

navigate

使用宏`easy-mmode-define-navigation’可以快速生成导航命令

(easy-mmode-define-navigation BASE RE &optional NAME ENDFUN NARROWFUN &rest BODY)

该宏生成`BASE-next’和`BASE-prev’两个导航命令.

参数RE为正则表达式,决定了导航的位置.

其他参数详细说明,参见该宏的doc-string

directory-variables

如何将directory-local variables应用到non-file buffer中

使用函数`hack-dir-local-variables-non-file-buffer’可以将`default-directory’目录及其父目录的directory-local variable应用到当前的non file buffer中.

cl

使用cl-check-type可以方便地对参数类型作检查

(cl-check-type FORM TYPE &optional STRING)

校验FORM的值是否为TYPE类型,若不是则抛出error,以STRING为error的描述.

url

如何使用url.el访问带认证的url

当访问一些Restful api时,常常需要输入认证信息,当用curl访问时可以使用-u option

curl -u user:password https://gnu.org

要模拟这种情况有两种方案可以尝试:

  1. 访问类似 https://username:[email protected] 这种url
  2. 通过设置`url-request-extra-headers’变量来实现
    (let ((url-request-method "PUT")
          (url-request-extra-headers
           `(("Authorization" . ,(concat "Basic "
                                         (base64-encode-string "username:password")))))
          (url-retrieve-synchronously "https://gnu.org")))
        

buffer

如何替换某一buffer从位置start到end之间的内容?

要实现这一目的有多种方法,例如

(goto-char start)
(delete-region start end)
(insert new-content)

或者

(goto-char start)
(re-search-forward ".+" end)
(replace-match new-content)

但我觉得最lisp style的一种方法是用setf:

(setf (buffer-substring start end) new-content)

eshell

如何修改命令的执行输出

hooks`eshell-preoutput-filter-functions’中的函数会在命令的输出结果插入eshell之前调用.

这些函数接受一个参数:命令的输出结果字符串,并且其返回值也应该是一个字符串,该返回的字符串才是真正插入到eshell中的内容.

如何判断eshell中上一次命令是否执行成功

通过执行函数`eshell-exit-success-p’可以获取eshell中上一次命令执行的完成状态.

若上一次执行的是一段lisp代码,则所谓成功表示该段lisp代码返回non-nil.

若上一次执行的是一个外部程序,则所谓成功表示该外部程序的退出码为0.

其他

如何查看最后一次操作的命令对应的elisp代码?

该命令会显示最后一次操作的命令对应的elisp代码,你可以修改该代码并按回车执行该代码,也可以按C-g取消执行.

如何计算两个字符串的编辑距离?

org已经有了现成的函数了`org-babel-edit-distance’

关于interactive的注意事项

  1. 使用(interactive “r”)则表示执行该命令前,必须要有一个active region
  2. 尽量不要使用`called-interactively-p’,因为该函数存在BUG,可能结果不准.