警告: 我是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
,有一个可能连接的弹出列表,输入连接号进入迷你缓冲区,然后根据迷你缓冲输入执行相应的功能。
答案 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