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 13:25:24 +0200 Message-ID: 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="35981"; mail-complaints-to="usenet@ciao.gmane.io" To: 66604@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Oct 18 13:27:03 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 1qt4hV-0008z3-Qi for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 18 Oct 2023 13:26:57 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qt4hC-0002E8-BQ; Wed, 18 Oct 2023 07:26:38 -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 1qt4hA-0002Cy-VD for bug-gnu-emacs@gnu.org; Wed, 18 Oct 2023 07:26: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 1qt4hA-0005KP-Mf for bug-gnu-emacs@gnu.org; Wed, 18 Oct 2023 07:26:36 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qt4ha-0007Yq-CD for bug-gnu-emacs@gnu.org; Wed, 18 Oct 2023 07:27:02 -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 11:27:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 66604 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.169762837028985 (code B ref -1); Wed, 18 Oct 2023 11:27:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 18 Oct 2023 11:26:10 +0000 Original-Received: from localhost ([127.0.0.1]:33351 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qt4gj-0007XQ-Uu for submit@debbugs.gnu.org; Wed, 18 Oct 2023 07:26:10 -0400 Original-Received: from lists.gnu.org ([2001:470:142::17]:56580) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qt4gg-0007Wj-J6 for submit@debbugs.gnu.org; Wed, 18 Oct 2023 07:26:08 -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 1qt4g8-0000rm-4v for bug-gnu-emacs@gnu.org; Wed, 18 Oct 2023 07:25:32 -0400 Original-Received: from mail-ed1-x52b.google.com ([2a00:1450:4864:20::52b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qt4g5-0005Dd-4k for bug-gnu-emacs@gnu.org; Wed, 18 Oct 2023 07:25:31 -0400 Original-Received: by mail-ed1-x52b.google.com with SMTP id 4fb4d7f45d1cf-53db360294fso11786687a12.3 for ; Wed, 18 Oct 2023 04:25:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697628326; x=1698233126; darn=gnu.org; h=mime-version:message-id:date:subject:to:from:from:to:cc:subject :date:message-id:reply-to; bh=s8LCg7E8LTBByyBsvdGBNWTDC+lrfySyM2z8IBoBF5g=; b=Ei3Z4HMqQ7RPrg4nEPwdcFtbBKs48eqQ0W/ypTr9/uH53/z/Qrukhgan2bXxkgE6Lb d82iHXVbggDJwmy0bITnaJfs8BRMJHYfcx0YCigViFxNARVo3Pz5GT5/ZNixXNcpN9sz 539fzurIJuB6FvS2lUXLgVSBoiH9jhwRC43s0eG+T64ilEuJNv1UT9TQD4fAEuiwOLwp QovrstZN2EtfUj9adR3GW00+c6M8neUH6huRvJpdNwKNN5CEYIUwMQLNsqE92ZIbiSoS mrkq3sT70jS4oOrDQPcAyCpj688VUSQt6Lhar+KHlw//0mCIGj8PZVelqJGlrKwynpvv yyyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697628326; x=1698233126; h=mime-version:message-id:date:subject:to:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=s8LCg7E8LTBByyBsvdGBNWTDC+lrfySyM2z8IBoBF5g=; b=nVYwe8QTy4u8o2hrcKGzN7zBacE+fKC5Gw2golrytH8iM0pWAQETjQeGujGj/+63yV /DJnzJD7eJHi73+qQhfqTweSFwoz+fT/4jMX2B2AfOWzxFEyJEiO2rSUkS3zSKyhplhw BrJOrZrPVY3l1UdD6gh3V1nQIw6U5dSAd6BNQtsEL6JGfoTRT8qik31XEUpIj2zZKPIc b41ZWxh7UfJySy4UYxuBT42Yp/NsnOUVCElDLGl/rOjPKuu2nVXvZtHWVY37mz/oX0+O rEmX8CmmBX1uB0Cz3akD3lpxxlgbuLZJmDKXJUMaFpxJuTluSACDSMgkynqqf5LjkaE1 cXRA== X-Gm-Message-State: AOJu0Ywfrx9kcFofrdEyayBNfbybMPIQH4vOKBaJ5MoyJnGySPHy3O/p 34Y4jfkXgNMP169r60J02RIEY84o0qc= X-Google-Smtp-Source: AGHT+IG0nNZS3vGY950ZflCWHfnxt8Q+A99Q0OQZLmO9jzlI59GbjPARLlARWlJI9msfFCPigxVuNQ== X-Received: by 2002:a50:cd95:0:b0:53d:b7e7:301b with SMTP id p21-20020a50cd95000000b0053db7e7301bmr3957298edi.24.1697628326364; Wed, 18 Oct 2023 04:25:26 -0700 (PDT) Original-Received: from Mini.fritz.box (p4fe3a178.dip0.t-ipconnect.de. [79.227.161.120]) by smtp.gmail.com with ESMTPSA id t29-20020a50ab5d000000b0053ed70ebd7csm2694070edc.31.2023.10.18.04.25.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Oct 2023 04:25:25 -0700 (PDT) Received-SPF: pass client-ip=2a00:1450:4864:20::52b; envelope-from=gerd.moellmann@gmail.com; helo=mail-ed1-x52b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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:272646 Archived-At: --=-=-= Content-Type: text/plain Tags: patch This is my first version of lldb command completions, which turned out to be a lot more fiddly than I initially thought. Comments welcome :-). --=-=-= Content-Type: text/patch Content-Disposition: attachment; filename=0001-Gud-LLDB-completions.patch >From 6f3b987ebbf8eeabd054c967e673899d3da203dc 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 * etc/emacs_lldb.py: Remove xcomplete. * lisp/progmodes/gud.el: Implement lldb command completions. --- etc/emacs_lldb.py | 30 --------------- lisp/progmodes/gud.el | 87 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 32 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..a9c1c25a505 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,83 @@ 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 + (concat + "script --language python -- " + "def gud_complete(c): " + "ci = lldb.debugger.GetCommandInterpreter(); " + "sl = lldb.SBStringList(); " + "ci.HandleCompletion(c, len(c), len(c),-1, sl); " + "print('gud-completions: ('); " + "[print(f'\"{sl.GetStringAtIndex(i)}\" ') " + " for i in range(sl.GetSize())]; " + "print(')')") + "LLDB command to define a Python function for completion. +Must be a single line.") + +(defun gud-lldb-initialize () + "Initialize the LLDB process as needed for this debug session." + (gud-basic-call gud-lldb-def-python-completion-function)) + ;;;###autoload (defun lldb (command-line) "Run lldb passing it COMMAND-LINE as arguments. @@ -3979,11 +4056,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 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 --=-=-=--