如何在Emacs创建函数直接运行外部终端shell的命令并返回结果? 自动执行几个外部终端shell命令?

大家好,我是Emacs的新手,刚从 Vim 转过来,请大家帮忙解决一下这个问题,提前谢谢你们 :grinning:

是这样的,我想要在Emacs下创建一个函数,让Emacs直接运行外部终端shell命令,类似 Vim的功能 如下: :point_down:

map <Leader>5 :call CompileRunClang()<CR>
func! CompileRunClang()
		exec "w"
		if &filetype == 'c'
				exec '!clang % -o %<'
				exec '!./%<'
				exec '!rm %<'
		elseif &filetype == 'cpp'
				exec '!g++ % -o %<'
				exec '!./%<'
				exec '!rm %<'
		elseif &filetype == 'python'
				exec '!python %'
		endif
endfunc

这样Vim就可以直接在外部终端执行shell命令,并返回结果,类似下图

不一定要根据文件类型进行执行,我就想要能直接执行外部命令就好
Emacs 有这种功能吗?我实在找不到了
请问 Emacs 怎么设置??

1 个赞

M-x :eshell

call-process, start-process or shell-command (the last one is not recommanded)

Quick-run 应该可以解决你的需求 https://github.com/emacsorphanage/quickrun/tree/master

欢迎,这个肯定要有。

执行命令 M-x shell-command 或者直接敲 M-! 然后执行命令,比如 date 会显示日期(一定函数内的直接在底部 echo area 直接展示;超过的话会单独开一个 buffer 展示)。

如果你想把命令的输出追加到当前 buffer 中,先按 C-u 就好了。

这个命令在临时只要执行一个命令的时候很方便。

另外,查看命令的帮忙文档,用 C-h f 然后输入命令或者函数。

M+! 执行命令,结果显示在minibuffer中,如果结果很长会默认新开一个buffer显示 ;

C+u M+! 执行命令并把结果写入当前buffer。

如果想知道emacs是怎么做的,C+h k M+! emacs会告诉你具体用的是什么函数做的,可以阅读函数的介绍,然后自己定义自己的函数拓展成自己想要的样子,比如像你Vim配置的处理不同类型,依次执行多命令之类的。

欢迎来到emacs~

怎么创建一个函数执行 几个 外部终端命令?
或者说有什么内置的函数可以执行? 比如说我想 创建一个按键 去执行这个函数,然后这个函数执行 几个 外部终端命令:
比如 按 顺序 执行一下外部终端shell命令:

mkdir Hello
rm -r Hello

请问怎么去做??

很感谢,我试着去创建一个函数试试

很感谢推荐,但这不是我想要的
我想要的是创建一个函数,然后这个函数去执行几个外部终端命令

(defun f()
""
(shell-command-to-string "mkdir Hello")
(shell-command-to-string "rm -rf Hello")
)

类似这样:

(defun my-shell-command ()
  (interactive) ; 如果不需要定义成命令,这句可以不要。
  (shell-command "date; sleep 2; date"))

这个是阻塞的。

(defun win10-httpd()
  (interactive)
  (progn 
    (shell "shell-httpd")
    (insert "d:")(comint-send-input)
    (insert "d:/client/apache/bin/httpd.exe")(comint-send-input)  )  )

这是我的,因为这个外部程序启动后就需要一直在线不能停止,于是这个(win10-httpd)我是写进配置文件和emacs一起启动的,还有这个是异步的不会阻塞

太感谢你了 :grinning_face_with_smiling_eyes:

在执行外部命令时 当前编辑的文件特殊符号 是什么?
比如:Emacs 正在 编辑的文件为 test.txt
%s 为 test
%ss 为 txt
这样我就可以执行外部命令时根据当前编辑的文件实现某些功能
创建一个名为 test 文件夹
(shell-command “mkdir %s”)

在Emacs 中 test 的特殊符号是什么?

谢谢,已解决

你去 Google 一下 emacs filename 就有了:buffer-file-name不能指望每个函数大家都告诉你,主要我感觉你又要问怎么 format 字符串了

1 个赞

似乎并不能使用???
(shell-command "mkdir " file-name-base)
返回:

Symbol’s value as variable is void : file-name-base

(shell-command (format "mkdir %s" (file-name-base (buffer-file-name))))

1 个赞

谢谢你,我知道怎么做了
要把 Emacs lisp 语法结合起来使用
原来 file-name-base 和 buffer-file-name 这么大区别

1 个赞