我正在尝试做一些看似简单的事情:创建一个Emacs函数来为我创建一个TAGS文件。执行此操作有简单的说明here
(defun create-tags (dir-name)
"Create tags file."
(interactive "DDirectory: ")
(eshell-command
(format "find %s -type f -name \"*.[ch]\" | etags -" dir-name)))
问题是我需要“cpp”文件而不是“c”。这意味着我的find命令必须更改为:
find %s -type f -iname "*.cpp" -or -iname "*.h"
在命令行上运行良好。我遇到的问题是,eshell似乎根本不喜欢这样。当我执行此功能时,我会继续:
File not found - "*.h": Invalid argument
。
this question的答案表明正确使用shell-quote-argument
可能会解决这些问题,但我无法找到有效的解决方案。例如,这会产生相同的错误:
(format "find %s -type f -iname %s -or -iname %s | etags -"
dir-name
(shell-quote-argument "*.cpp")
(shell-quote-argument "*.h"))
答案 0 :(得分:1)
您正在尝试将posix语法与Windows find
命令一起使用。这有两个原因:
find
的行为类似于grep
,而是使用dir
。希望它能帮到你。
答案 1 :(得分:1)
在评论中得到了sds和Daniele的大力帮助,我终于弄明白了这个问题。
我正在做的事情有两个问题:
对于那些感兴趣的人,Windows下的工作命令是:
(defun create-tags (dir-name)
"Create tags file."
(interactive "DDirectory: ")
(shell-command
(format "cd %s & dir /b /s *.h *.cpp | %s -"
dir-name
(shell-quote-argument "C:\\Program Files\\Emacs\\emacs-25.0\\bin\\etags.exe"))))
唯一的怪癖是,当Emacs提示你输入一个目录时,你必须确保给它一个DOS shell可以处理的目录。 ~/dirname
无效。对于那些拥有更好的emacs-fu的人而言,我可能已经解决了这个问题。