8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

elisp:在当前文件上调用命令

Flash Thunder 1月前

28 0

我想在 emacs 中设置一个键,用于对缓冲区中的文件执行 shell 命令,并在没有提示的情况下还原缓冲区。shell 命令是:p4 edit 'currentfilename.ext'(global-set-key [\C-...

我想在 emacs 中设置一个键,对缓冲区中的文件执行 shell 命令,并在没有提示的情况下还原缓冲区。shell 命令是: p4 edit 'currentfilename.ext'

(global-set-key [\C-E] (funcall 'revert-buffer 1 1 1)) 
;; my attempt above to call revert-buffer with a non-nil 
;; argument (ignoring the shell command for now) -- get an init error:
;; Error in init file: error: "Buffer does not seem to be associated with any file"

对 elisp 来说完全是新东西。根据 emacs 手册 ,revert-buffer 的定义如下:

Command: revert-buffer &optional ignore-auto noconfirm preserve-modes

谢谢!

帖子版权声明 1、本帖标题:elisp:在当前文件上调用命令
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Flash Thunder在本站《bash》版块原创发布, 转载请注明出处!
最新回复 (0)
  • intA 1月前 0 只看Ta
    引用 2

    您是否想恢复缓冲区,因为它已经被编辑,或者因为 shell 命令破坏了缓冲区的内容?

  • 您看到的实际错误是因为您错误地指定了全局设置键,即函数调用。您想要的是:

    (global-set-key (kbd "C-S-e") '(lambda () (revert-buffer t t t)))
    

    funcall 实际上在 .emacs 加载时进行了评估,这就是导致错误的原因。

    然后,为了获得整个内容,您可以创建一个如下命令:

    (defun call-something-on-current-buffers-file ()
      "run a command on the current file and revert the buffer"
      (interactive)
      (shell-command 
       (format "/home/tjackson/bin/dummy.sh %s" 
           (shell-quote-argument (buffer-file-name))))
      (revert-buffer t t t))
    (global-set-key (kbd "C-S-e") 'call-something-on-current-buffers-file)
    

    显然,自定义命令,并根据需要添加错误检查。

  • 您需要以某种方式为 shell 引用文件名... comint-quote-filename 看起来可以完成这项工作,但不幸的是,只有当您已经在 shell 缓冲区中时,它才会执行此操作。这就是我所得到的。

  • 感谢您的回复。我得到:Symbol 的函数定义是 void:comint-quote-filename。我将其替换为 shell-quote-argument,效果很好。附注:emacs 手册指出:\'要避免的键:[Ctrl]+[Shift]+[letter]。在文本终端中,它无法区分这种组合的移位版本和非移位版本。如果您总是在 GUI 环境中使用 emacs,则效果很好。\'所以我将其更改为,并且它识别了密钥。

  • @Jasie 我知道必须有一个内置的引用,我已经更新了答案以使用 shell-quote-argument。(要修复 void 函数定义错误,您只需添加(require 'comint)),但 shell-quote-argument 更好。

  • @TreyJackson 这非常好,如果我需要将输出弹出到一个可以通过按“q”关闭的窗口中,我该怎么做?

  • 也许使用次要模式“auto-revert-mode”是一种选择。只需在当前缓冲区上启用它:

    M-x "auto-revert-mode"
    

    并始终确保在执行外部命令之前缓冲区已被保存。

  • 这很好,但默认的自动恢复模式时间是 5 秒(太慢了)。如果我将其更改为 1 秒,它将每秒检查每个缓冲区,这是不必要的。

  • \'它会检查每个缓冲区\' 不,它只会检查启用它的缓冲区。检查 auto-revert-mode 的文档:Ch f auto-revert-mode RET。

返回
作者最近主题: