elisp函数帮助(学习elisp):弹出服务器列表,提示用户输入,然后执行连接功能

时间:2018-02-02 15:13:21

标签: shell emacs

警告: 我是elisp世界的NOOB。我正在寻找建议,从哪里开始寻找有关以下查询的定向自学教材。我愿意接受:“这似乎是最愚蠢/最难/过于复杂/非lispy的方式,为什么不尝试x”。感谢您的帮助。

查询: 我想实现类似于我使用但在elisp中的shell脚本。我可以分享shell脚本,如果这让我的问题更清晰。我正在使用emacs在Windows上使用plink连接到远程服务器。我有很多功能,例如:

(defun server ()
  (setq explicit-shell-file-name "/bin/bash")
  (interactive)
  (let ((default-directory "/plink:un@ip:~/"))
    (shell)))

我想将所有这些组合成一个Emacs命令connect。我想打电话给M-x connect,有一个可能连接的弹出列表,输入连接号进入迷你缓冲区,然后根据迷你缓冲输入执行相应的功能。

1 个答案:

答案 0 :(得分:0)

使用completing-read从多个选项中进行选择,并完成。这就是我开始解决您的实际问题的方法:

(defvar jpk/connect-list '("foo" "bar" "127.0.0.1"))
(defun jpk/connect (host)
  (interactive (list (completing-read "Server: " jpk/connect-list nil t)))
  (let* ((explicit-shell-file-name "/bin/bash")
         (user "un")
         (method "plink")
         (default-directory (format "/%s:%s@%s:~/"
                                    method user host)))
    (shell (format "*shell:%s@%s*" user host))))

(旁白:find-file + tramp已在~/.ssh/config中定义的主机上完成。但我不知道它在Windows上的效果如何。)

如果您仍想沿着多功能路线前进,首先要意识到您已在M-x中完成,也许这已经足够了。如果不是,completing-read会返回字符串,将字符串转换为符号的方式为intern。然后使用call-interactively调用该函数。

(defun connect-foo ()
  (interactive)
  (message "Connecting to foo..."))

(let ((host "foo")) ;; this could be from `completing-read` as above
  (call-interactively (intern (format "connect-%s" host)))) ;; run connect-foo