;;; pcmpl-tailscale.el --- Completions For Tailscale -*- lexical-binding: t; -*- ;; Copyright (C) 2024 Thanos Apollo ;; Author: Thanos Apollo ;; Keywords: comm extensions ;; URL: https://git.thanosapollo.com/pcmpl-tailscale ;; Version: 0.0.1 ;; Package-Requires: ((emacs "27.2")) ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Under development ;;; Code: (require 'pcomplete) (require 'cl-lib) (defvar pcmpl-tailscale-subcommands '("up" "down" "set" "login" "logout" "switch" "configure" "netcheck" "ip" "status" "ping" "nc" "ssh" "funnel" "serve" "version" "web" "file" "bugreport" "cert" "lock" "licenses" "exit-node" "update" "whois")) (defvar pcmpl-tailscale-subcommand-set-flags '("--exit-node" "--accept-dns" "--ssh" "--auto-update" "--exit-node-allow-lan-access" "--nickname" "--hostname" "--operator" "--shields-up" "--advertise-routes" "--advertise-exit-node" "--advertise-connector" "--advertise-risk")) (defun pcmpl-tailscale-get-exit-nodes () "Return a list of ip addresses of pcmpl-tailscale exit nodes." (let* ((output (shell-command-to-string "tailscale exit-node list")) (exit-nodes (split-string output "\n"))) ;; Split output into lines. (cl-loop for ip in exit-nodes when (string-match "\\([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+\\)" ip) collect (match-string 0 ip)))) ;;;###autoload (defun pcomplete/tailscale () "Completion for `tailscale'." (pcomplete-here pcmpl-tailscale-subcommands) (cond ((string= (pcomplete-arg 1) "set") (pcomplete-here pcmpl-tailscale-subcommand-set-flags) (cond ((pcomplete-match "--exit-node" 1) (pcomplete-here (pcmpl-tailscale-get-exit-nodes))))) ((string= (pcomplete-arg 1) "exit-node") (pcomplete-here '("list"))))) (provide 'pcmpl-tailscale) ;;; pcmpl-tailscale.el ends here