Lisp if-statement - emacs初始化文件“.emacs”

时间:2012-02-22 20:38:31

标签: file emacs lisp elisp

我修改了我的.emacs文件,通过以下代码自动备份隐藏文件:

(defun make-backup-file-name (filename)
  (expand-file-name
   (concat "." (file-name-nondirectory filename) "~")
   (file-name-directory filename)))

除了隐藏文件的备份从“.hidden-file.xxx”到“..no-longer-hidden-file.xxx”

之外,它的效果很好

我知道零Lisp,有人可以给我一个快速的解决方法,如:

(if (filename) doesn't-start-with "."
  (concat 
  (else do-nothing))

3 个答案:

答案 0 :(得分:3)

您可以使用(equal (string-to-char filename) ?.)。这会将文件名字符串转换为其第一个字符,并将其与?.进行比较,后者是.的字符表示法。

从它的外观来看,你想要检查(file-name-nondirectory filename)而不仅仅是filename,所以整个陈述将是这样的:

(if (equal (string-to-char (file-name-nondirectory filename)) ?.)
    (concat (file-name-nondirectory filename) "~")
    (concat "." (file-name-nondirectory filename) "~"))

所以整个函数看起来应该是这样的:

(defun make-backup-file-name (filename)
  (expand-file-name
  (if (equal (string-to-char (file-name-nondirectory filename)) ?.)
    (concat (file-name-nondirectory filename) "~")
    (concat "." (file-name-nondirectory filename) "~"))
  (file-name-directory filename)))

您需要在两个分支中执行concat,因为您总是想要附加~

答案 1 :(得分:2)

像这样:

(if (not (string-equal (substring "abcdefg" 0 1) "."))
 (message "foo") 
 (message "bar")
)

由于你在emacs中,打开一个暂存缓冲区并M-x eval-buffer你正在做什么来检查它是否具有正确的语义。 message在调试时非常有用,因为它会将字符串打印到迷你缓冲区。

答案 2 :(得分:0)

你也可以测试(字符串匹配“\`\。”(文件名 - 非目录文件名)),但说实话我想知道为什么你认为“..foo”被认为是“不隐藏” :在我的测试中,`ls'和*都忽略了我的“..test.txt”文件。