unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* where-are-we: find out the context when reading (any) source code
@ 2010-08-18 15:31 Haojun Bao
  2010-08-18 15:58 ` Leo
  2010-08-18 16:36 ` where-are-we: find out the context when reading (any) source code Andreas Röhler
  0 siblings, 2 replies; 4+ messages in thread
From: Haojun Bao @ 2010-08-18 15:31 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2097 bytes --]

Hi, all

I have wrote a little lisp and a perl script to tell where I am when I'm
reading source code. The lisp code is short: 

    (defun where-are-we ()
      (interactive)
      (save-excursion
        (end-of-line)
        (shell-command-on-region 
         1 (point) 
         (concat "where-are-we " 
                 (or (buffer-file-name) (buffer-name))
                 (format " %s" tab-width)))))

The perl script (also named where-are-we) is attached. When invoked on
the last line of the above lisp code, the output is like following:

    /home/bhj/windows-config/.emacs:1005:              (format " %s" tab-width)))))
        (defun where-are-we ()
          ...
          (save-excursion
            ...
            (shell-command-on-region 
             ...
             (concat "where-are-we " 
                     ...
    =>               (format " %s" tab-width)))))

Another example from reading Android source code:

    /home/bhj/src/android/frameworks/base/libs/ui/EventHub.cpp:474:                             outFlags[codeIndex] = 1;
        /*
         * Inspect the known devices to determine whether physical keys exist for the given
         * framework-domain key codes.
         */
        bool EventHub::hasKeys(size_t numCodes, int32_t* keyCodes, uint8_t* outFlags) {
            for (size_t codeIndex = 0; codeIndex < numCodes; codeIndex++) {
                ...
                for (int n = 0; (n < mFDCount) && (outFlags[codeIndex] == 0); n++) {
                    if (mDevices[n]) {
                        ...
                        if (!err) {
                            ...
                            for (size_t sc = 0; sc < scanCodes.size(); sc++) {
                                if (test_bit(scanCodes[sc], mDevices[n]->keyBitmask)) {
    =>                              outFlags[codeIndex] = 1;

Supposedly this can be useful when reading source code and taking note,
even better if used with remember.el. That way, you can easily write a
scenario analysis about which function called which function and so
on...

Hope you can find it useful.


[-- Attachment #2: where-are-we --]
[-- Type: application/octet-stream, Size: 1974 bytes --]

#!/usr/bin/env perl

# report where we are, in which file, on which line, in what context? (in which class, function/method, etc)

# preferably it is used within Emacs, so...
# we take 2 arg, 1st is the file/buffer name, 2nd is the tab-width buffer-local variable. 
# the 2nd arg help us decide the indentation, and the context.
# then we read standard input, it should be region(0, end-of-line(point)) fed from Emacs buffer.

# output should be like: 

    # /home/bhj/src/android-nv-froyo/frameworks/base/libs/ui/EventHub.cpp:328:     while(1) {
    #    
    #     bool EventHub::getEvent(int32_t* outDeviceId, int32_t* outType,
    #         int32_t* outScancode, int32_t* outKeycode, uint32_t *outFlags,
    #         int32_t* outValue, nsecs_t* outWhen)
    #     {
    #         ...
    #
    # =>      while(1) {

# how we achieve this? 

use Encode;
use utf8;
use strict;

my $line_num = 0;
my @lines = ();
(my $file_name, my $tab_width) = @ARGV;

open(my $file, "-|", "expand -t $tab_width");

while (<$file>) {
  $line_num++;
  chomp;
  $_ = decode_utf8($_);
  push @lines, ($_);
}

@lines = reverse @lines;

$lines[0] =~ m/^\s*/;
my $spaces = length($&);

my @print_lines = ();

my $last_line = shift @lines;
push @print_lines, ("    =>  " . $last_line);

my $limit = 5;
my $outmost = 0;


my $prev_print_line_num = $line_num;
my $last_line_num = $line_num;

for (@lines) {
  $line_num--;
  if ($_ =~ m/^\s*$/) { # skip empty lines
    if ($limit < 5) {
      last;
    } else {
      next;
    }
  }

  $_ =~ m/^\s*/;
  if ($spaces > length($&) or $limit < 5) {
    if ($prev_print_line_num != $line_num+1) {
      push @print_lines, ("        " . (" " x $spaces) . "...");
    }
    $prev_print_line_num = $line_num;
    push @print_lines, ("        " . $_);
    $spaces = length($&);
  }
  if (length($&) == 0) {
    $limit--;
  }
  if ($limit == 0) {
    last;
  }
}

$,="\n";
print "    $file_name:$last_line_num: $last_line\n";
print reverse @print_lines;

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: where-are-we: find out the context when reading (any) source code
  2010-08-18 15:31 where-are-we: find out the context when reading (any) source code Haojun Bao
@ 2010-08-18 15:58 ` Leo
  2010-08-18 16:01   ` where-are-we: find out the context when reading (any) sourcecode Drew Adams
  2010-08-18 16:36 ` where-are-we: find out the context when reading (any) source code Andreas Röhler
  1 sibling, 1 reply; 4+ messages in thread
From: Leo @ 2010-08-18 15:58 UTC (permalink / raw)
  To: emacs-devel

On 2010-08-18 16:31 +0100, Haojun Bao wrote:
> I have wrote a little lisp and a perl script to tell where I am when I'm
> reading source code. The lisp code is short: 
[...]

I think it best to submit to emacswiki.org instead.

Leo




^ permalink raw reply	[flat|nested] 4+ messages in thread

* RE: where-are-we: find out the context when reading (any) sourcecode
  2010-08-18 15:58 ` Leo
@ 2010-08-18 16:01   ` Drew Adams
  0 siblings, 0 replies; 4+ messages in thread
From: Drew Adams @ 2010-08-18 16:01 UTC (permalink / raw)
  To: 'Leo', emacs-devel

> I think it best to submit to emacswiki.org instead.

In addition to Emacs Wiki, don't forget gnu-emacs-sources@gnu.org.

(No comment on whether emacs-devel is also appropriate for this.)




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: where-are-we: find out the context when reading (any) source code
  2010-08-18 15:31 where-are-we: find out the context when reading (any) source code Haojun Bao
  2010-08-18 15:58 ` Leo
@ 2010-08-18 16:36 ` Andreas Röhler
  1 sibling, 0 replies; 4+ messages in thread
From: Andreas Röhler @ 2010-08-18 16:36 UTC (permalink / raw)
  To: Haojun Bao; +Cc: Emacs developers

Am 18.08.2010 17:31, schrieb Haojun Bao:
> Hi, all
>
> I have wrote a little lisp and a perl script to tell where I am when I'm
> reading source code. The lisp code is short:
>
>      (defun where-are-we ()
>        (interactive)
>        (save-excursion
>          (end-of-line)
>          (shell-command-on-region
>           1 (point)
>           (concat "where-are-we "
>                   (or (buffer-file-name) (buffer-name))
>                   (format " %s" tab-width)))))
>
> The perl script (also named where-are-we) is attached. When invoked on
> the last line of the above lisp code, the output is like following:
>
>      /home/bhj/windows-config/.emacs:1005:              (format " %s" tab-width)))))
>          (defun where-are-we ()
>            ...
>            (save-excursion
>              ...
>              (shell-command-on-region
>               ...
>               (concat "where-are-we "
>                       ...
>      =>                (format " %s" tab-width)))))
>
> Another example from reading Android source code:
>
>      /home/bhj/src/android/frameworks/base/libs/ui/EventHub.cpp:474:                             outFlags[codeIndex] = 1;
>          /*
>           * Inspect the known devices to determine whether physical keys exist for the given
>           * framework-domain key codes.
>           */
>          bool EventHub::hasKeys(size_t numCodes, int32_t* keyCodes, uint8_t* outFlags) {
>              for (size_t codeIndex = 0; codeIndex<  numCodes; codeIndex++) {
>                  ...
>                  for (int n = 0; (n<  mFDCount)&&  (outFlags[codeIndex] == 0); n++) {
>                      if (mDevices[n]) {
>                          ...
>                          if (!err) {
>                              ...
>                              for (size_t sc = 0; sc<  scanCodes.size(); sc++) {
>                                  if (test_bit(scanCodes[sc], mDevices[n]->keyBitmask)) {
>      =>                               outFlags[codeIndex] = 1;
>
> Supposedly this can be useful when reading source code and taking note,
> even better if used with remember.el. That way, you can easily write a
> scenario analysis about which function called which function and so
> on...
>
> Hope you can find it useful.
>
>    

Hi, thanks,

a home-brew I use quite often because of its copying is

(defun copy-buffer-file-name ()
   "Display and copy buffer-file-name or default-directory. "
   (interactive)
   (let ((pfn (buffer-file-name))
         (verz default-directory))
     (if pfn
         (kill-new pfn)
       (kill-new verz)))
   (message "%s" (car kill-ring)))


Andreas

--
https://code.launchpad.net/~a-roehler/python-mode
https://code.launchpad.net/s-x-emacs-werkstatt/




^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-08-18 16:36 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-18 15:31 where-are-we: find out the context when reading (any) source code Haojun Bao
2010-08-18 15:58 ` Leo
2010-08-18 16:01   ` where-are-we: find out the context when reading (any) sourcecode Drew Adams
2010-08-18 16:36 ` where-are-we: find out the context when reading (any) source code Andreas Röhler

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).