大家好,我是Emacs的新手,刚从 Vim 转过来,请大家帮忙解决一下这个问题,提前谢谢你们
是这样的,我想要在Emacs下创建一个函数,让Emacs直接运行外部终端shell命令,类似 Vim的功能 如下:
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 个赞
VonFry
3
call-process
, start-process
or shell-command
(the last one is not recommanded)
欢迎,这个肯定要有。
执行命令 M-x shell-command
或者直接敲 M-!
然后执行命令,比如 date 会显示日期(一定函数内的直接在底部 echo area 直接展示;超过的话会单独开一个 buffer 展示)。
如果你想把命令的输出追加到当前 buffer 中,先按 C-u
就好了。
这个命令在临时只要执行一个命令的时候很方便。
另外,查看命令的帮忙文档,用 C-h f 然后输入命令或者函数。
tyr
6
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"))
这个是阻塞的。
wsug
12
(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一起启动的,还有这个是异步的不会阻塞
太感谢你了
在执行外部命令时 当前编辑的文件 的 特殊符号 是什么?
比如: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
cireu
17
(shell-command (format "mkdir %s" (file-name-base (buffer-file-name))))
1 个赞
谢谢你,我知道怎么做了
要把 Emacs lisp 语法结合起来使用
原来 file-name-base 和 buffer-file-name 这么大区别
1 个赞