No Emacs, como inserir o nome do arquivo no comando shell?

Eu uso muito o comando shell (o padrão é vinculado a M-!), Mas muitas vezes estou fazendo coisas no buffer que estou editando no momento. Em vez de digitar o nome do buffer (e nenhuma conclusão de nome de arquivo está disponível no comando shell, infelizmente!), Seria bom ter uma tecla de atalho, digamos f3, para inserir esse nome sempre que eu pressionar a tecla.

O problema é que não quero vincular a chave globalmente (uso f3 para outras coisas em outro contexto), apenas no minibuffer quando o comando shell estiver solicitando. É fácil escrever uma função lisp para inserir o nome atual do buffer, mas qual o mapa de teclas do modo que devo modificar para vincular uma chave a essa função?

Como alternativa, existe algum código / pacote lisp que forneça a conclusão do nome de arquivo no comando shell, semelhante ao bash? Eu sei que o shell M-x normal faz a conclusão, mas é difícil desistir da conveniência de inserir um comando no minibuffer;)

Editar:

aqui está o que eu queria, tirado dehuaiyuanresposta de algumas correções inspiradas / roubadas dehttp://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)))))

questionAnswers(3)

yourAnswerToTheQuestion