From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.help Subject: Re: Counting SLOC in Emacs Date: Fri, 28 Nov 2014 09:49:27 -0500 Message-ID: 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 1425581654 26655 80.91.229.3 (5 Mar 2015 18:54:14 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 5 Mar 2015 18:54:14 +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 15:50:57 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 1XuMsr-0004kX-Cg for geh-help-gnu-emacs@m.gmane.org; Fri, 28 Nov 2014 15:50:57 +0100 Original-Received: from localhost ([::1]:44768 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XuMsq-0005Sb-TE for geh-help-gnu-emacs@m.gmane.org; Fri, 28 Nov 2014 09:50:56 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:45281) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XuMsX-0005SH-NZ for help-gnu-emacs@gnu.org; Fri, 28 Nov 2014 09:50:45 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XuMsQ-0001eZ-7I for help-gnu-emacs@gnu.org; Fri, 28 Nov 2014 09:50:37 -0500 Original-Received: from plane.gmane.org ([80.91.229.3]:57342) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XuMsP-0001eK-Vc for help-gnu-emacs@gnu.org; Fri, 28 Nov 2014 09:50:30 -0500 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1XuMsM-0004VW-DI for help-gnu-emacs@gnu.org; Fri, 28 Nov 2014 15:50:26 +0100 Original-Received: from 69-165-162-82.dsl.teksavvy.com ([69.165.162.82]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 28 Nov 2014 15:50:26 +0100 Original-Received: from monnier by 69-165-162-82.dsl.teksavvy.com with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 28 Nov 2014 15:50:26 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 53 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 69-165-162-82.dsl.teksavvy.com User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (gnu/linux) Cancel-Lock: sha1:QTul0feGlEKFmpRCOudR1qIymsY= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 80.91.229.3 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:103035 >> 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: (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)))))) -- Stefan