Search code examples
windowsperlemacsack

ack does not work when run from "grep-find" in Emacs on Windows


I'm trying to use ack-grep as a replacement for grep + find in Emacs on Windows, but ack-grep exits immediately (successfully) without printing any matches. I've tried just about every conceivable combination of command-line parameters to ack-grep, but nothing seems to work.

M-x grep-find

Enter "ack html" to search for files containing "html". Ack exits immediately, printing nothing:

-*- mode: grep; default-directory: "c:/" -*-
Grep started at Tue Feb 23 23:50:52

ack html

Grep finished (matches found) at Tue Feb 23 23:50:52

Executing the same command "ack html" in cmd.exe works fine (showing lots of various files containing the string "html".

Any ideas?


Solution

  • When running ack under Emacs in Windows, I found it sometimes got confused about whether it was supposed to search files or read from STDIN. Here's the function I use to call ack (use M-x ack). You can put this in .emacs.

    (defvar ack-command "ack --nogroup --nocolor ")
    (defvar ack-history nil)
    (defvar ack-host-defaults-alist nil)
    (defun ack ()
      "Like grep, but using ack-command as the default"
      (interactive)
      ; Make sure grep has been initialized
      (if (>= emacs-major-version 22)
          (require 'grep)
        (require 'compile))
      ; Close STDIN to keep ack from going into filter mode
      (let ((null-device (format "< %s" null-device))
            (grep-command ack-command)
            (grep-history ack-history)
            (grep-host-defaults-alist ack-host-defaults-alist))
        (call-interactively 'grep)
        (setq ack-history             grep-history
              ack-host-defaults-alist grep-host-defaults-alist)))