From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 85928 invoked by alias); 23 Jun 2015 14:01:55 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 85835 invoked by uid 89); 23 Jun 2015 14:01:55 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.2 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-oi0-f49.google.com Received: from mail-oi0-f49.google.com (HELO mail-oi0-f49.google.com) (209.85.218.49) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 23 Jun 2015 14:01:52 +0000 Received: by oigb199 with SMTP id b199so7472976oig.3 for ; Tue, 23 Jun 2015 07:01:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=bXQ0EDoUVWq6HFhlICb8zEBKUUH5C9Eb+O9lEDX6Qz8=; b=RYO53HPbyQV5Q0yJ3rf9pJTmca8S0PpZYWlq8TTZgR1Lgf/P0nnNNJ+PYTPftGLYhu e+M62WoovEvdkCu2DJ60EoVf8EKRi7w8/HLOnK/xOtcs006+sLvSdelYEZdowQkAHGFj 1j4aaKMwpKxxZ7Iz8PUOILfdqdiVfRQw+fsI7VtsF2FkSKLjoDT0nZ+GVGYOzU7ubIat IRzBm4higzFdWjtpdi5Owd4nZOsqqOvFfP9Vq0MPVZusRJ0wn9M0SdPk8bytfWs7w0hH 0Akhok6oIEHMfYAcQSt/p/LPa83r+UFPKw3vVAmhSQAPWDRdw1v15GvCacoyIusjiJiW tQDw== X-Gm-Message-State: ALoCoQmLWe/XPwUiiMV3HAfFYDBRbVQYdczrh/ZnKaqrmEx9xPtidVzVAAORnRSf5PnxycGoMegs MIME-Version: 1.0 X-Received: by 10.60.80.229 with SMTP id u5mr30154275oex.27.1435068110195; Tue, 23 Jun 2015 07:01:50 -0700 (PDT) Received: by 10.182.89.99 with HTTP; Tue, 23 Jun 2015 07:01:50 -0700 (PDT) In-Reply-To: <1434943800-9274-1-git-send-email-patrick@parcs.ath.cx> References: <1434943800-9274-1-git-send-email-patrick@parcs.ath.cx> Date: Tue, 23 Jun 2015 14:01:00 -0000 Message-ID: Subject: Re: [PATCH] Add tab completion for TUI's "focus" command From: Doug Evans To: Patrick Palka Cc: gdb-patches Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2015-06/txt/msg00463.txt.bz2 On Sun, Jun 21, 2015 at 10:30 PM, Patrick Palka wrote: > The implementation is pretty straightforward, though there's the > question of what the completion list should show when the TUI has not > yet been initalized. Hi. What does "not yet been initialized" mean here? > At that point no TUI window is considered visible > thus the completion list will be composed of only the "next" and "prev" > keywords (which are always added to the completion list). But > technically the commands "focus cmd" and "focus src" will work even when > the TUI is not yet initialized because the initialization done in the > meantime will make these windows visible by default. So should the > entries "cmd" and "src" be added to the completion list as special > cases when the TUI is not yet initialized? > > gdb/ChangeLog: > > * tui/tui-win.c (focus_completer): New static function. > (_initialize_tui_win): Set the completion function of the > "focus" command to focus_completer. > > gdb/testsuite/ChangeLog: > > * gdb.base/completion.exp: Test the completion of the "focus" > command. > --- > gdb/testsuite/gdb.base/completion.exp | 18 +++++++++++ > gdb/tui/tui-win.c | 59 ++++++++++++++++++++++++++++++++++- > 2 files changed, 76 insertions(+), 1 deletion(-) > > diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp > index 4c31bfc..5c20f26 100644 > --- a/gdb/testsuite/gdb.base/completion.exp > +++ b/gdb/testsuite/gdb.base/completion.exp > @@ -878,3 +878,21 @@ if {![skip_tui_tests]} { > } > } > } > +if {![skip_tui_tests]} { > + with_test_prefix "focus command" { > + set test "test completion" > + send_gdb "focus\t\t\t" I think I understand the purpose of three tabs here, but I'm wondering what happens if we add a "focus-foo" command. Seems like it'd be more robust to replace the first tab with a space. > + gdb_test_multiple "" "$test" { > + -re "next *prev *\r\n$gdb_prompt focus $" { > + pass "$test" > + } > + } > + send_gdb "\003" > + set test "quit command input after testing completion" > + gdb_test_multiple "" "$test" { > + -re "$gdb_prompt $" { > + pass "$test" > + } > + } > + } > +} > diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c > index 8c0685b..8860ca7 100644 > --- a/gdb/tui/tui-win.c > +++ b/gdb/tui/tui-win.c > @@ -354,6 +354,61 @@ tui_set_var_cmd (char *null_args, int from_tty, struct cmd_list_element *c) > tui_rehighlight_all (); > } > > +/* Complete possible window names to focus on. TEXT is the complete text > + entered so far, WORD is the word currently being completed. */ > + > +static VEC (char_ptr) * > +focus_completer (struct cmd_list_element *ignore, > + const char *text, const char *word) > +{ > + VEC (const_char_ptr) *completion_name_vec = NULL; > + VEC (char_ptr) *matches_vec; > + int win_type; > + > + for (win_type = SRC_WIN; win_type < MAX_MAJOR_WINDOWS; win_type++) > + { > + const char *completion_name = NULL; > + > + /* We can't focus on an invisible window. */ > + if (tui_win_list[win_type] == NULL > + || !tui_win_list[win_type]->generic.is_visible) > + continue; > + > + switch (win_type) > + { > + case SRC_WIN: > + completion_name = "src"; > + break; > + case DISASSEM_WIN: > + completion_name = "asm"; > + break; > + case DATA_WIN: > + completion_name = "regs"; > + break; > + case CMD_WIN: > + completion_name = "cmd"; > + break; > + default: > + break; > + } > + > + if (completion_name != NULL) > + VEC_safe_push (const_char_ptr, completion_name_vec, completion_name); > + } > + > + VEC_safe_push (const_char_ptr, completion_name_vec, "next"); > + VEC_safe_push (const_char_ptr, completion_name_vec, "prev"); > + VEC_safe_push (const_char_ptr, completion_name_vec, NULL); > + > + matches_vec > + = complete_on_enum (VEC_address (const_char_ptr, completion_name_vec), > + text, word); > + > + VEC_free (const_char_ptr, completion_name_vec); > + > + return matches_vec; > +} > + > /* Function to initialize gdb commands, for tui window > manipulation. */ > > @@ -365,6 +420,7 @@ _initialize_tui_win (void) > { > static struct cmd_list_element *tui_setlist; > static struct cmd_list_element *tui_showlist; > + struct cmd_list_element *focus_cmd; > > /* Define the classes of commands. > They will appear in the help list in the reverse of this order. */ > @@ -393,7 +449,7 @@ regs : the register display\n")); > add_com_alias ("wh", "winheight", class_tui, 0); > add_info ("win", tui_all_windows_info, > _("List of all displayed windows.\n")); > - add_com ("focus", class_tui, tui_set_focus_command, _("\ > + focus_cmd = add_com ("focus", class_tui, tui_set_focus_command, _("\ > Set focus to named window or next/prev window.\n\ > Usage: focus { | next | prev}\n\ > Valid Window names are:\n\ > @@ -402,6 +458,7 @@ asm : the disassembly window\n\ > regs : the register display\n\ > cmd : the command window\n")); > add_com_alias ("fs", "focus", class_tui, 0); > + set_cmd_completer (focus_cmd, focus_completer); > add_com ("+", class_tui, tui_scroll_forward_command, _("\ > Scroll window forward.\n\ > Usage: + [win] [n]\n")); > -- > 2.4.4.410.g43ed522.dirty >