From 485eae8409266d2eaa97e999c748fdaa88af87f5 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Tue, 30 Jul 2024 10:47:04 +0200 Subject: [PATCH] Add global menu bar menu * kubed.el (kubed-menu-map): New map with global Kubed menu. (kubed-menu-bar-mode): New minor mode, adds 'kubed-menu-bar' to global menu bar. (kubed-define-resource): Also generate a sub-menu for each resource type. (pod, namespace): Adjust. --- kubed.el | 77 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/kubed.el b/kubed.el index 0850d26..5e4cc54 100644 --- a/kubed.el +++ b/kubed.el @@ -44,7 +44,6 @@ ;;; Todo: ;; - Support filtering resource lists. -;; - Add menu bar menu. ;;; Code: @@ -171,8 +170,11 @@ Other keyword arguments that go between PROPERTIES and COMMANDS are: - `:create (ARGLIST DOCSTRING INTERACTIVE BODY...)': specialize the resource creation command, `kubed-create-RESROURCE'. ARGLIST, DOCSTRING, INTERACTIVE and BODY have the same meaning as in `defun'. -- `:prefix (KEY DEFINITION...)': additional keybinding for the prefix - keymap `kubed-RESOURCE-prefix-map'. +- `:prefix ((KEY LABEL DEFINITION) ...)': additional keybinding for the + prefix keymap `kubed-RESOURCE-prefix-map' and the + `kubed-RESOURCE-menu-map' menu. Each element (KEY LABEL DEFINITION) + says to bind KEY to DEFINITION in `kubed-RESOURCE-menu-map', and to + add DEFINITION to `kubed-RESOURCE-menu-map' with the label LABEL. - `:plural PLURAL': specify plural form of RESOURCE, as a symbol. If you omit this keyword argument, the plural form defaults to RESOURCE followed by \"s\"." @@ -187,6 +189,7 @@ Other keyword arguments that go between PROPERTIES and COMMANDS are: (edt-name (intern (format "kubed-edit-%S" resource))) (crt-name (intern (format "kubed-create-%S" resource))) (map-name (intern (format "kubed-%S-prefix-map" resource))) + (menu-map (intern (format "kubed-%S-menu-map" resource))) (namespaced t) (keyword nil) list-var ents-var hook-var proc-var frmt-var read-crm sure-fun @@ -880,8 +883,7 @@ Optional argument DEFAULT is the minibuffer default argument." resource) (kubed-explain ,(symbol-name plrl-var))) (defvar-keymap ,map-name - :doc ,(format "Prefix keymap for Kubed %s commands." - (symbol-name resource)) + :doc ,(format "Prefix keymap for Kubed %S commands." resource) :prefix ',map-name "l" #',list-cmd "c" #',crt-name @@ -890,7 +892,25 @@ Optional argument DEFAULT is the minibuffer default argument." resource) "g" #',dsp-name "u" #',updt-cmd "E" #',expl-cmd - ,@prf-keys)))) + ,@(mapcan + (pcase-lambda (`(,key ,_label ,cmd)) + (list key `#',cmd)) + prf-keys)) + + (defvar-keymap ,menu-map + :doc ,(format "Keymap with Kubernetes %S related menu entries." resource) + :prefix ',menu-map + "" '("List" . ,list-cmd) + "" '("Create" . ,crt-name) + "" '("Edit" . ,edt-name) + "" '("Delete" . ,dlt-name) + "" '("Display" . ,dsp-name) + "" '("Update" . ,updt-cmd) + "" '("Explain Fields" . ,expl-cmd) + ,@(mapcan + (pcase-lambda (`(,key ,label ,cmd)) + (list key `'(,label . ,cmd))) + prf-keys))))) (setf ;; Teach Imenu about `kubed-define-resource'. @@ -945,10 +965,10 @@ compatibility with earlier Emacs versions." (number-to-string (1+ (seq-count (lambda (c) (= c ?,)) cs))))) :right-align t) (starttime ".status.startTime" 20)) - :prefix ("L" #'kubed-logs - "A" #'kubed-attach - "X" #'kubed-exec - "F" #'kubed-forward-port-to-pod) + :prefix (("L" "Show Logs" kubed-logs) + ("A" "Attach" kubed-attach) + ("X" "Execute" kubed-exec) + ("F" "Forward Port" kubed-forward-port-to-pod)) (dired "C-d" "Start Dired in home directory of first container of" ;; Explicit namespace in Kuberenetes remote file names ;; introduced in Emacs 31. See Bug#59797. @@ -1019,7 +1039,7 @@ Switch to namespace `%s' and proceed?" k8sns)) ph))) (creationtimestamp ".metadata.creationTimestamp" 20)) :namespaced nil - :prefix ("S" #'kubed-set-namespace) + :prefix (("S" "Set" kubed-set-namespace)) :create ((name) "Create Kubernetes namespace with name NAME." (interactive (list (read-string "Create namespace with name: "))) @@ -2081,6 +2101,41 @@ Interactively, prompt for COMMAND with completion for `kubectl' arguments." "P" #'kubed-patch "!" #'kubed-kubectl-command) +(defvar-keymap kubed-menu-map + :doc "Keymap with Kubed menu entries." + :prefix 'kubed-menu-map + "" '("Namespaces..." . kubed-namespace-menu-map) + "" '("Pods..." . kubed-pod-menu-map) + "" '("Persistent Volumes..." . kubed-persistentvolume-menu-map) + "" '("Services..." . kubed-service-menu-map) + "" '("Secrets..." . kubed-secret-menu-map) + "" '("Jobs..." . kubed-job-menu-map) + "" '("Deployments..." . kubed-deployment-menu-map) + "" '("Replica Sets..." . kubed-replicaset-menu-map) + "" '("Stateful Sets..." . kubed-statefulset-menu-map) + "" '("Cron Jobs..." . kubed-cronjob-menu-map) + "" '("Ingress Classes..." . kubed-ingressclass-menu-map) + "" '("Ingresses..." . kubed-ingress-menu-map) + "" '("Patch Resource" . kubed-patch) + "" '("Diff Config with Live" . kubed-diff) + "" '("Invoke kubectl" . kubed-kubectl-command) + "" '("Toggle Namespacing" . kubed-all-namespaces-mode) + "" '("Update Resource Lists" . kubed-update-all) + "" '("Explain Type or Field" . kubed-explain) + "" '("Set Current Context" . kubed-use-context) + "" '("Run Image" . kubed-run) + "" '("Apply Config" . kubed-apply) + "" '("Create Resource" . kubed-create)) + +;;;###autoload +(define-minor-mode kubed-menu-bar-mode + "Add \"Kubernetes\" menu to your menu bar." + :global t + (if kubed-menu-bar-mode + (keymap-set-after (current-global-map) + " " '("Kubernetes" . kubed-menu-map)) + (keymap-global-unset " "))) + (defvar reporter-prompt-for-summary-p) (defun kubed-submit-bug-report () -- 2.39.5