From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Gerd =?UTF-8?Q?M=C3=B6llmann?= Newsgroups: gmane.emacs.bugs Subject: bug#66604: [PATCH] Gud LLDB completions Date: Wed, 18 Oct 2023 17:24:07 +0200 Message-ID: References: <13AC7AD2-230A-4FAC-81D9-75FBE53456F8@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="22062"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: 66604@debbugs.gnu.org To: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Oct 18 17:24:54 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qt8Pl-0005PV-7S for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 18 Oct 2023 17:24:53 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qt8PV-00009o-SR; Wed, 18 Oct 2023 11:24:37 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qt8PT-00007N-Uc for bug-gnu-emacs@gnu.org; Wed, 18 Oct 2023 11:24:36 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qt8PT-0001Uj-Ki for bug-gnu-emacs@gnu.org; Wed, 18 Oct 2023 11:24:35 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qt8Pt-0004Ct-Kk for bug-gnu-emacs@gnu.org; Wed, 18 Oct 2023 11:25:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Gerd =?UTF-8?Q?M=C3=B6llmann?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 18 Oct 2023 15:25:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 66604 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 66604-submit@debbugs.gnu.org id=B66604.169764268416135 (code B ref 66604); Wed, 18 Oct 2023 15:25:01 +0000 Original-Received: (at 66604) by debbugs.gnu.org; 18 Oct 2023 15:24:44 +0000 Original-Received: from localhost ([127.0.0.1]:34489 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qt8Pc-0004CA-81 for submit@debbugs.gnu.org; Wed, 18 Oct 2023 11:24:44 -0400 Original-Received: from mail-ed1-x535.google.com ([2a00:1450:4864:20::535]:61544) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qt8Pa-0004Bs-3j for 66604@debbugs.gnu.org; Wed, 18 Oct 2023 11:24:42 -0400 Original-Received: by mail-ed1-x535.google.com with SMTP id 4fb4d7f45d1cf-523100882f2so11566635a12.2 for <66604@debbugs.gnu.org>; Wed, 18 Oct 2023 08:24:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697642649; x=1698247449; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=4R4uKJZToZ0pc3Ow90TzeyrZLsMH8MHakmNKSBAvv7c=; b=EpwzaziYk2KALKT3GF5anjVLE6gBzLyEPchD/kpFe2KZlqk7xQhh3AwCeFnvVBbaW6 OU3jOi9pAEqeqeFOcskLuP7sEQSexkY6AzwTO2UIYeKt3e/5TuoXGuUMaX6cx7XwK6um A/AgM7G97dno56d+NJ7VgHc9/S7+p3qQdVhhnMneLOBRUJTo85pvKyGFF+6kL4ZJK9jA fQXyvbKtJpjyJje24qKowWmW+lYBySw84f5rwvD8svcVWcvjbhAyljDWhqEXHxvTob5L zBDjWcqu6X+eO/r6ZOgN6TcQWYSYOSNVo3GWgmgjch8v8koBwI3EXqCtCZ/QQadoPeV5 pSwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697642649; x=1698247449; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=4R4uKJZToZ0pc3Ow90TzeyrZLsMH8MHakmNKSBAvv7c=; b=NQ1Puji+yli/2lSaoSzCtR10XnkMlEyp/QaEnE9pgh6GAf8t8l2qDFrms/ztsFgsUf ceQAL9ttzJEaCDSkvq6PUknqSzhBe7MvFJ41BBCMqUo3D5iFnehxk0I84OI3qVlj3jf3 OK+7q6KUcdSbAvQTgKsg1x83nMYg4bwMP8NIsKd4VN2copnd9SKIdg2RXAG+AhQApo6R agwzyOCfWEpb8J8ZHFEIP+0Z1ZucWhalTKz+9f8ABFCXxzXdFnR3oi4J2CIP5cNCIN0t 0xPbPXqMqgE1NtjMw9Gd34GuTakbUhsQ1Ww6O4baZl0zCiZJ5AQ0YJeJnHe7wdhN5jeS Y4HA== X-Gm-Message-State: AOJu0YzDouVdoJbnj2SuxWiOa/IepsdWpZJ/3E2+I1LL8slwUbSwOa/E 66UlRqj5g2YWRLV57FbxLbuaY6SP7ew= X-Google-Smtp-Source: AGHT+IFYUqLmNNuXnqAXw4YbzMGenh9+NcDkrbvjfi2Ie6+2KIcjbXpu8HmT3ZbE/1N29OxNuLQMCw== X-Received: by 2002:a17:906:dac4:b0:9a1:c659:7c56 with SMTP id xi4-20020a170906dac400b009a1c6597c56mr4527969ejb.22.1697642648664; Wed, 18 Oct 2023 08:24:08 -0700 (PDT) Original-Received: from Mini.fritz.box (p4fe3a178.dip0.t-ipconnect.de. [79.227.161.120]) by smtp.gmail.com with ESMTPSA id b5-20020a1709062b4500b0099297782aa9sm1875207ejg.49.2023.10.18.08.24.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Oct 2023 08:24:08 -0700 (PDT) In-Reply-To: ("Mattias =?UTF-8?Q?Engdeg=C3=A5rd?="'s message of "Wed, 18 Oct 2023 17:14:19 +0200") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:272663 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Mattias Engdeg=C3=A5rd writes: > 18 okt. 2023 kl. 16.42 skrev Gerd M=C3=B6llmann : > >> So, in the attached patch, I've sent something in addition after that, >> to make it look a bit prettier. > > Thank you, it works all right. > >> Should be fixed in the attached patch. > > This too. > > By the way, I can confirm that changing default-directory (M-x cd) in > the *gud* buffer to where the source is located allows Emacs to find > the source of the current frame. Changing frame-format is probably the > way forward here. And the attachment forgotten, of course --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Gud-LLDB-completions-bug-66604.patch Content-Description: patch v3 >From c8e335ede44ffa1f7f65ba141cbf9866b2db83c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerd=20M=C3=B6llmann?= Date: Wed, 18 Oct 2023 09:24:45 +0200 Subject: [PATCH] Gud LLDB completions (bug#66604) * etc/emacs_lldb.py: Remove xcomplete. * lisp/progmodes/gud.el: Implement lldb command completions. --- etc/emacs_lldb.py | 30 -------------- lisp/progmodes/gud.el | 94 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 91 insertions(+), 33 deletions(-) diff --git a/etc/emacs_lldb.py b/etc/emacs_lldb.py index f2c7a7987c7..fa8d95d7b5b 100644 --- a/etc/emacs_lldb.py +++ b/etc/emacs_lldb.py @@ -203,35 +203,6 @@ def xdebug_print(debugger, command, result, internal_dict): """Print Lisp_Objects using safe_debug_print()""" debugger.HandleCommand(f"expr safe_debug_print({command})") -# According to SBCommanInterpreter.cpp, the return value of -# HandleCompletions is as follows: -# -# Index 1 to the end contain all the completions. -# -# At index 0: -# -# If all completions have a common prefix, this is the shortest -# completion, with the common prefix removed from it. -# -# If it is the completion for a whole word, a space is added at the -# end. -# -# So, the prefix is what could be added to make the command partially -# complete. -# -# If there is no common prefix, index 0 has an empty string "". - -def xcomplete(debugger, command, result, internal_dict): - """Print completions for COMMAND.""" - interpreter = debugger.GetCommandInterpreter() - string_list = lldb.SBStringList() - interpreter.HandleCompletion(command, len(command), len(command), - -1, string_list) - list = "" - for i in range(string_list.GetSize()): - list += '"' + string_list.GetStringAtIndex(i) + '" ' - result.AppendMessage("(" + list + ")") - ######################################################################## # Formatters @@ -336,7 +307,6 @@ def enable_type_category(debugger, category): def __lldb_init_module(debugger, internal_dict): define_command(debugger, xbacktrace) define_command(debugger, xdebug_print) - define_command(debugger, xcomplete) define_type_summary(debugger, "Lisp_Object", type_summary_Lisp_Object) define_type_synthetic(debugger, "Lisp_Object", Lisp_Object_Provider) enable_type_category(debugger, "Emacs") diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el index ea5a3580629..71adbcf1599 100644 --- a/lisp/progmodes/gud.el +++ b/lisp/progmodes/gud.el @@ -3850,7 +3850,7 @@ gud-tooltip-tips ;; 'gud-lldb-history' and 'gud-gud-lldb-command-name' are required -;; because gud-symbol uses their values if they are present. Their +;; because 'gud-symbol' uses their values if they are present. Their ;; names are deduced from the minor-mode name. (defvar gud-lldb-history nil) @@ -3859,7 +3859,7 @@ gud-gud-lldb-command-name :type 'string) (defun gud-lldb-marker-filter (string) - "Deduce interesting stuff from output STRING." + "Deduce interesting stuff from process output STRING." (cond (;; Process 72668 stopped ;; * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 ;; frame #0: ...) at emacs.c:1310:9 [opt] @@ -3879,6 +3879,88 @@ gud-lldb-marker-filter (setq gud-overlay-arrow-position nil))) string) +;; According to SBCommanInterpreter.cpp, the return value of +;; HandleCompletions is as follows: +;; +;; Index 1 to the end contain all the completions. +;; +;; At index 0: +;; +;; If all completions have a common prefix, this is the shortest +;; completion, with the common prefix removed from it. +;; +;; If it is the completion for a whole word, a space is added at the +;; end. +;; +;; So, the prefix is what could be added to make the command partially +;; complete. +;; +;; If there is no common prefix, index 0 has an empty string "". + +(defun gud-lldb-fetch-completions () + "Return the data to complete the LLDB command before point." + (let* ((process (get-buffer-process gud-comint-buffer)) + (start (process-mark process)) + (end (point)) + (to-complete (buffer-substring-no-properties start end)) + (output-buffer (get-buffer-create "*lldb-completions*"))) + ;; Send the completion command with output to our buffer + (with-current-buffer output-buffer + (erase-buffer)) + (comint-redirect-send-command-to-process + (format "script --language python -- gud_complete('%s')" + to-complete) + output-buffer process nil t) + ;; Wait for output + (unwind-protect + (while (not comint-redirect-completed) + (accept-process-output process)) + (comint-redirect-cleanup)) + ;; Process the completion output. + (with-current-buffer output-buffer + (goto-char (point-min)) + (when (search-forward "gud-completions:" nil t) + (read (current-buffer)))))) + +(defun gud-lldb-completions (_context _command) + "Completion table for LLDB commands." + (gud-gdb-completions-1 (gud-lldb-fetch-completions))) + +(defun gud-lldb-completion-at-point () + "Return the data to complete the LLDB command before point." + (let* ((end (point)) + (line-start (comint-line-beginning-position)) + (start (save-excursion + (skip-chars-backward "^ " line-start) + (point)))) + (list (copy-marker start t) end + (completion-table-dynamic + (apply-partially #'gud-lldb-completions + (buffer-substring line-start start)))))) + +(defvar gud-lldb-def-python-completion-function + " +def gud_complete(s): + interpreter = lldb.debugger.GetCommandInterpreter() + string_list = lldb.SBStringList() + interpreter.HandleCompletion(s, len(s), len(s), -1, string_list) + print('gud-completions: (') + for i in range(string_list.GetSize()): + print(f'\"{string_list.GetStringAtIndex(i)}\" ') + print(')') +" + "LLDB command to define a Python function for completion.") + +(defun gud-lldb-send-python (python) + (gud-basic-call "script --language python --") + (mapc #'gud-basic-call (split-string python "\n")) + (gud-basic-call "exit()")) + +(defun gud-lldb-initialize () + "Initialize the LLDB process as needed for this debug session." + (gud-lldb-send-python gud-lldb-def-python-completion-function) + (gud-basic-call "script --language python -- print('Gud initialized')")) + ;;;###autoload (defun lldb (command-line) "Run lldb passing it COMMAND-LINE as arguments. @@ -3979,11 +4061,17 @@ lldb nil "Run the program.") + (add-hook 'completion-at-point-functions + #'gud-lldb-completion-at-point + nil 'local) + (keymap-local-set "" #'completion-at-point) + (gud-set-repeat-map-property 'gud-gdb-repeat-map) (setq comint-prompt-regexp (rx line-start "(lldb)" (0+ blank))) + (setq comint-process-echoes t) (setq paragraph-start comint-prompt-regexp) (setq gud-running nil) - (setq gud-filter-pending-text nil) + (gud-lldb-initialize) (run-hooks 'lldb-mode-hook)) (provide 'gud) -- 2.42.0 --=-=-=--