From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Marcin Borkowski Newsgroups: gmane.emacs.help Subject: Re: Counting SLOC in Emacs Date: Fri, 28 Nov 2014 17:00:42 +0100 Message-ID: <871tonjpuw.fsf@wmi.amu.edu.pl> References: <877fyfk1qn.fsf@wmi.amu.edu.pl> <8761dzjvcl.fsf@wmi.amu.edu.pl> <874mtjjt31.fsf@wmi.amu.edu.pl> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1417190488 27643 80.91.229.3 (28 Nov 2014 16:01:28 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 28 Nov 2014 16:01:28 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Fri Nov 28 17:01:23 2014 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1XuNys-00031Q-72 for geh-help-gnu-emacs@m.gmane.org; Fri, 28 Nov 2014 17:01:14 +0100 Original-Received: from localhost ([::1]:44987 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XuNyr-00074C-L1 for geh-help-gnu-emacs@m.gmane.org; Fri, 28 Nov 2014 11:01:13 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:37530) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XuNyg-00073v-Al for help-gnu-emacs@gnu.org; Fri, 28 Nov 2014 11:01:03 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XuNya-0006Ju-FE for help-gnu-emacs@gnu.org; Fri, 28 Nov 2014 11:01:02 -0500 Original-Received: from msg.wmi.amu.edu.pl ([2001:808:114:2::50]:36747) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XuNya-0006JC-8f for help-gnu-emacs@gnu.org; Fri, 28 Nov 2014 11:00:56 -0500 Original-Received: from localhost (localhost [127.0.0.1]) by msg.wmi.amu.edu.pl (Postfix) with ESMTP id 4F57342068 for ; Fri, 28 Nov 2014 17:00:53 +0100 (CET) Original-Received: from msg.wmi.amu.edu.pl ([127.0.0.1]) by localhost (msg.wmi.amu.edu.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SML2cNoj-9rO for ; Fri, 28 Nov 2014 17:00:53 +0100 (CET) Original-Received: from localhost (unknown [IPv6:2001:808:114:6:9d5b:51e1:6d47:a8a9]) by msg.wmi.amu.edu.pl (Postfix) with ESMTPSA id 2002542062 for ; Fri, 28 Nov 2014 17:00:53 +0100 (CET) In-reply-to: X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:808:114:2::50 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:101278 Archived-At: On 2014-11-28, at 15:49, Stefan Monnier wrote: >>> And don't re-call use-region-p here, in the off-chance that it returns >>> something else than in the first call. E.g. you can use (if (and (= >>> beg (point-min)) (= end (point-max))) "buffer" "region") instead. >> I don't think it's probable (or even possible), but definitely my >> solution was not very elegant. I wonder whether (let)ting >> (use-region-p) to a temporary variable wouldn't be better. > > Yes, it should be passed as an additional argument (you could pass > `region' or `buffer' as argument, with nil meaning "not interactive, > just return the count without displaying a message"). > >> Anyway, thanks for your review! I will write a blog post about this >> function (googling for "emacs count sloc" doesn't yield anything >> useful, let's change it! ;-) ). > > Of course, you'll bump into further problems: > > (* foo bar > * baz *) > > will count as 1 lines, IIUC. And similarly > > printf ("toto\n"); (* foo bar > * baz *) > > will count as 2 lines. You might want to try something like: Hm. Didn't think of this. (I'm not really accustomed to multi-line comments, I guess.) > (defun count-sloc-region (beg end kind) > "Count source lines of code in region (or (narrowed part of) > the buffer when no region is active). SLOC means that empty > lines and comment-only lines are not taken into consideration." > (interactive > (if (use-region-p) > (list (region-beginning) (region-end) 'region) > (list (point-min) (point-max) 'buffer))) > (save-excursion > (goto-char beg > (let ((count 0)) > (while (< (point) end) > (cond > ((nth 4 (syntax-ppss)) ;; BOL is already inside a comment. > (let ((pos (point))) > (goto-char (nth 8 (syntax-ppss))) > (forward-comment (point-max)) > (if (< (point) pos) (goto-char pos)))) ;; Just paranoia. > (t (forward-comment (point-max)))) > (setq count (1+ count)) > (forward-line)) > (when kind > (message "SLOC in %s: %s." kind count)))))) Wow, thanks! I'm planning to run a code reading seminar for some ambitious students at my faculty. I'm wondering whether it could be a good idea to study this;). (In fact, not really - at least not in the beginning - let them learn some more typical stuff before exposing young minds to Emacs Lisp with its peculiarities, like `interactive'. We'll start with Python and JS, though some Common Lisp is also planned.) > -- Stefan Best, -- Marcin Borkowski http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski Faculty of Mathematics and Computer Science Adam Mickiewicz University