代码之家  ›  专栏  ›  技术社区  ›  polyglot

在Emacs中,如何在shell命令中插入文件名?

  •  17
  • polyglot  · 技术社区  · 16 年前

    我大量使用shell命令(默认绑定到M-!),但我经常对当前正在编辑的缓冲区进行操作。与其键入缓冲区名称(在shell命令中没有文件名完成,唉!),不如有一个快捷键,比如f3,在我每次按键时为我插入该名称。

    或者,是否有任何lisp代码/包在shell命令中提供文件名补全,类似于bash的做法?我知道普通的M-x shell是可以完成的,但是在minibuffer中输入命令的便利性是很难放弃的;)

    编辑:

    这是我想要的,从 huaiyuan http://osdir.com/ml/emacs.sources/2002-04/msg00022.html

    (define-key minibuffer-local-map
      [f3] (lambda () (interactive) 
           (insert (buffer-name (current-buffer-not-mini)))))
    
    (defun current-buffer-not-mini ()
      "Return current-buffer if current buffer is not the *mini-buffer*
      else return buffer before minibuf is activated."
      (if (not (window-minibuffer-p)) (current-buffer)
          (if (eq (get-lru-window) (next-window))
              (window-buffer (previous-window)) (window-buffer (next-window)))))
    
    3 回复  |  直到 8 年前
        1
  •  11
  •   huaiyuan    16 年前
    (define-key minibuffer-local-map
      [f3] (lambda () (interactive) (insert (buffer-name))))
    

    编辑:

    正如注释部分和其他地方指出的,上面的代码片段不起作用。(对不起,我应该在发布之前测试它。)一些修复程序已经发布;下面是另一个:

    (define-key minibuffer-local-map [f3]
      (lambda () (interactive) 
         (insert (buffer-name (window-buffer (minibuffer-selected-window))))))
    

    关于发布时的文件名完成 shell-command ,也许这个乱七八糟的东西会有用(它在Emacs 23.0.60上对我有用):

    (require 'shell)
    (define-key minibuffer-local-map (kbd "C-i") 'comint-dynamic-complete)
    
        2
  •  7
  •   David Hanak    16 年前

    下面是如何修复怀远的解决方案:

    (define-key minibuffer-local-map [f3]
      (lambda() (interactive) (insert (buffer-file-name (nth 1 (buffer-list))))))
    

    如果“其他”缓冲区没有设置文件名,并且(缓冲区文件名)返回nil,则可能应该添加某种错误检查。