Emacs Lisp: 将列表转换为字符串

4

我正在涉猎Emacs Lisp语言,并尝试编写以下函数:

(defun buffer-file-name-body ()
  (last (split-string (buffer-file-name) "/")))

我想要做的是从(buffer-file-name)提供的完整路径中仅提取文件名和扩展名。然而,此实现返回一个项目列表("scratch.el")... 我尝试了几种方法,如将(last)的结果通过(string)传递,但会引发错误... 当我搜索Emacs List convert list to string时,谷歌没有返回任何有用的结果。我该怎么做?

1
你的意思是你有一个列表 '("scranch.el"),需要从中提取 "scratch.el" 吗? - fvwmer
2
是的,没错...一个简单的CAR足够了吗? - λ Jonas Gorauskas
是的,它可以。我刚刚测试过了。 - λ Jonas Gorauskas
如果你使用了 (car (last ...)),那么我认为你做得很好。对于其他 Emacs Lisp 的问题,你可能想查看 EmacsWiki 获取一些有用的提示:http://emacswiki.org/emacs/ElispCookbook#toc56 - Michael H.
2
请将解决方案发布为答案并接受它。谢谢。 - tripleee
5
你可能想查看内置函数 file-name-nondirectory。(另外,如果让我给个小提示,你的函数会在没有访问文件的缓冲区(例如 scratch)上出错。) - Thomas
1个回答

5

听起来你想要的是(file-name-nondirectory (buffer-file-name))这个函数,它会以字符串的形式返回文件名(不包含目录信息)。


尽管最初的问题是将List转换为String,而CAR可能是一个好的解决方案,但使用(file-name-nondirectory)更适用于这种情况,并且是更清晰的解决方案... - λ Jonas Gorauskas
2
@HowardWest 嘿,伙计,很好地跟随了我的上面的评论。请再次注意,(buffer-file-name) 对于没有访问文件的缓冲区返回nil,而file-name-nondirectory无法处理nil参数。 - Thomas
@Thomas 如果你回答这个问题,我会把它标记为被接受的答案... :) - λ Jonas Gorauskas
2
@JonasGorauskas 别担心。我认为这甚至不是你实际问题的正确答案,因为它不告诉你如何从列表中提取字符串值。这可能是你想要的,但它没有回答你所问的问题。如果有什么的话,fvwmer 应该得到赞誉,因为他给出了正确的答案。 - Thomas
我理解这个问题是:“我想要实现的是从(buffer-file-name)给出的完整路径中提取文件名和扩展名”。 - Howard West
天啊,我的前表达式也是(last (split-string 以仅获取文件名。file-name-nondirectory拯救了我的生命。 - azzamsa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接