【发布时间】:2011-03-21 22:05:03
【问题描述】:
我正在寻找一个命令行工具,它可以从输入中删除所有 cmets 文件并返回剥离的输出。支持流行就好了 编程语言,如 c、c++、python、php、javascript、html、css 等。它 必须具有语法意识,而不是基于正则表达式,因为后者会捕获 源代码字符串中的模式也是如此。有没有这样的工具?
我完全知道 cmets 是有用的信息,并且经常离开它们 因为他们是个好主意。只是我的重点是不同的用例。
【问题讨论】:
我正在寻找一个命令行工具,它可以从输入中删除所有 cmets 文件并返回剥离的输出。支持流行就好了 编程语言,如 c、c++、python、php、javascript、html、css 等。它 必须具有语法意识,而不是基于正则表达式,因为后者会捕获 源代码字符串中的模式也是如此。有没有这样的工具?
我完全知道 cmets 是有用的信息,并且经常离开它们 因为他们是个好主意。只是我的重点是不同的用例。
【问题讨论】:
我不知道有这样的工具 - 这与说没有。
我曾经开始设计一个,但很快就发疯了——C 和 C++ 中的注释规则没有帮助。
/\
* Comment? *\
/
(答案:是的!)
"/\
* Comment? *\
/"
(答案:不!)
要合理地完成工作,您必须注意:
这些结合起来使这项工作几乎不可能完成。
我最终得到了一个程序,scc,用于剥离 C 和 C++ cmets。它的酷刑测试包括比上面显示的 cmets 更糟糕的例子——而且它做得不错。但是将其扩展为 shell、Perl 或 Python 或(随你选择)是非常重要的,所以我没有这样做。
【讨论】:
cloc,一个免费的 Perl 脚本,可以做到这一点。
从源代码中删除注释
如何判断 cloc 是否正确识别 cmets?说服自己 cloc 做正确事情的一种方法是使用其
--strip-comments选项从文件中删除 cmets 和空行,然后将精简后的文件与原始文件进行比较。
【讨论】:
foo.py 的目录中执行命令perl /path/to/cloc-1.51.pl --strip-comments=n . 将创建一个删除了cmets 和空行的foo.py.n 文件。我想看一个你声称不起作用的例子(我相信 cloc 的开发人员也会这样做)。
你可能会诱使GNU Source-highlight 这样做。
【讨论】:
你想要的可以用 emacs 脚本来完成。
我为您编写了这个脚本,它完全符合您的要求,并且可以轻松扩展到任何语言。
文件名:kill-cmets
#!/usr/bin/python
import subprocess
import sys
import os
target_file = sys.argv[1]
command = "emacs -batch -l ~/.emacs-batch " + \
target_file + \
" --eval '(kill-comment (count-lines (point-min) (point-max)))'" + \
" -f save-buffer"
#to load a custom .emacs script (for more syntax support),
#use -l <file> in the above command
#print command
fnull = open(os.devnull, 'w')
subprocess.call(command, shell = True, stdout = fnull, stderr = fnull)
fnull.close()
使用它只需调用:
kill-comments <file-name>
要向其中添加任何语言,请编辑 ~/.emacs-batch 并添加该语言的主要模式。 您可以在http://www.emacswiki.org 找到几乎所有您想要的语法感知模式。
例如,这是我的 ~/.emacs-batch 文件。它扩展了上述脚本以从 javascript 文件中删除 cmets。 (我的 ~/.el 目录中有javascript.el)
(setq load-path (append (list (concat (getenv "HOME") "/.el")) load-path))
(load "javascript")
(setq auto-mode-alist (cons '("\\.js$" . javascript-mode) auto-mode-alist))
通过添加 javascript,这将从您提到的所有文件类型以及更多文件类型中删除 cmets。
祝你好运,编码愉快!
【讨论】:
Paul Dixon 的 response to this question 从脚本中剥离 cmets 可能值得一看。
【讨论】:
目前还没有这样的工具。
【讨论】: