Emacs 如何使grep find始终在有*ansi术语的窗口中打开*

Emacs 如何使grep find始终在有*ansi术语的窗口中打开*,emacs,grep,elisp,Emacs,Grep,Elisp,当我在一个项目上工作时,我总是在一个窗口中使用带有bashshell的ansi术语。是否可以指示grep find始终在我有*ansi term*缓冲区的窗口中打开(如果存在) 我有一个函数,可以运行grep find,而不是git repo。我只需要在有*ansi term*的窗口中指示函数打开,您可以使用FIFO。在你的任期内 mkfifo ~/ansi while :; do cat ~/ansi; done 在其他地方 grep xyz abc > ~/ansi 这似乎符合您的

当我在一个项目上工作时,我总是在一个窗口中使用带有bashshell的ansi术语。是否可以指示grep find始终在我有*ansi term*缓冲区的窗口中打开(如果存在)


我有一个函数,可以运行grep find,而不是git repo。我只需要在有*ansi term*

的窗口中指示函数打开,您可以使用FIFO。在你的任期内

mkfifo ~/ansi
while :; do cat ~/ansi; done
在其他地方

grep xyz abc > ~/ansi

这似乎符合您的要求,但我只做了非常简短的测试

(defadvice find-grep (around switch-to-ansi-term activate)
  (let ((b (get-buffer "*ansi-term*")))
    (and b (select-window (get-buffer-window b t))) )
  ad-do-it
  (and b (delete-window)) )

我创建了这两个函数:

(defun windows-buffer-match (regex)
  "return window for open buffer that match regex"
  (let ((list '()))
    (walk-windows (lambda (window)
                    (let ((buffer (window-buffer window)))
                      (if (string-match regex (buffer-name buffer))
                          (setq list (cons window list))))))
    list))

(defun window-match-jump (regex)
  (interactive "sBuffer: ")
  (let ((windows (windows-buffer-match regex)))
    (if (not (null windows))
        (select-window (car windows)))))
正如@tripleee在他的回答中所建议的,我将其与devadvice一起使用:

(defadvice find-grep (around switch-to-ansi-term activate)
  (window-match-jump (regexp-quote "*ansi-term*")))

此外,此函数还可用于在窗口中打开名称不同于ansi术语的grep。

您的意思是使用相同的窗口、使用相同的框架还是使用ansi术语所选命令的相同目录?@juanleon,正如我在问题中所写的相同窗口emacs window。我从来没有提到框架或目录。如果你真的是指Emacs手册定义的窗口,你想用*grep*缓冲区代替*ansi term*缓冲区吗?还是希望它拆分*ansi term*窗口并在另一半中显示*grep*输出缓冲区?或者,您实际上是想拆分正在查看*ansi term*窗口的框架吗?如果它不是活动的怎么办?@tripleee我想替换它,当我按q时,我想返回我的*ansi term*,现在它看起来像*grep*在随机窗口中显示。-1问题具体询问如何使find grep在特定窗口中打开其输出缓冲区,我认为OP真的意味着帧?,不是如何通过一种变通方法来达到模糊相似的效果。@tripleee在没有其他答案的情况下,将其标记为比其他答案更糟糕有点苛刻。有时答案并不完美,但它们仍然可以提供如何做或解决问题的线索。现在我发布了一个相互竞争的答案,我想取消注释,但我不能。我仍然支持反对票,因为我觉得这并没有试图回答实际问题,只是讨论了一个相当粗糙的解决方案,它要求你放弃M-x find grep的功能,它基本上是用batwater IMHO扔掉婴儿。因为否则它会分裂窗口,留下*ansi term*可见。我犹豫了一下,但这是你的要求。但它需要有条件的和b-更新的答案。谢谢你让我想得更多-:我认为这对我的案例不起作用,因为find grep不会在我的案例中拆分窗口。但我已经使用了你的Devadvice想法,并将其与我创建的函数一起使用。请随意打开删除窗口,显然。还有一点需要注意的是,如果我有几个ansi术语,它们被命名为*ansi term**ansi term*不是有效的正则表达式-你需要用反斜杠转义星号。这看起来像是对“选择窗口”“获取缓冲区”窗口的一个相当痛苦的改造。。。我的答案里有密码。而且,即使已经找到了匹配项,它也不必继续行走。如果您真的想按正则表达式进行匹配,那么返回匹配列表会更有意义。@tripleee如果我的窗口包含*ansi term*,那么我没有得到关于*ansi term*的错误,get buffer也不会返回当前缓冲区,所以我需要使用match。另一个问题是,如果我有隐藏的*ansi-term*和可见的*ansi-term*,您的代码将被破坏,它将尝试获取隐藏的缓冲区,并且无法工作。@tripleee我更新了答案,我使用了两个函数,并引用了regex。看起来好多了。但最终还是会有一个隐藏的“ansi术语”缓冲区,不是吗?