繁体   English   中英

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

[英]Lisp if-statement - emacs initialization file “.emacs”

我修改了.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))

您可以使用(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 ,因为您总是想附加~

像这样:

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

由于您处于emacs中,因此请打开暂存缓冲区和Mx eval-buffer ,以检查其是否具有正确的语义。 message在调试中很有用,因为它将字符串打印到迷你缓冲区。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM