occur mode

若只是需要在Emacs所打开的buffer中查询某字段,则occur命令一个对GNU grep的很好的替代.

  • occur命令

    M-x occur会让你输入一个正则表达式,然后在 当前buffer 中进行内容匹配,在Occur Output buffer中显示匹配正则表达式的行,并对匹配部分进行加亮处理.

    M-x multi-occur会让你选择要在哪些buffer中进行内容匹配

    M-x multi-occur-in-matching-buffers会在buffer name符合某正则的buffer中进行内容匹配

    M-x occur-rename-buffer 对默认的*Occur* outputbuffer进行重命名,命名规则为*Occur:匹配的文件名列表,用/分隔*

  • occur-mode的子命令

    • r命令重命名*occur output* buffer

    • g命令重现做一次正则匹配查询

    • M-g M-n / M-g M-p 遍历*occur output* buffer中匹配行的原所在文件位置

    • C-c C-f 开启Next-Error-Follow minor mode

      在开启Next-Error-Follow minor mode后,可用使用M-n和M-p来代替M-g M-n / M-g M-p

    • q命令退出*occur output* buffer

  • 让occur命令作用于某个major mode的所有buffer中

    (eval-when-compile                                                    
      (require 'cl))                                                      
    
    (defun get-buffers-matching-mode (mode)                               
      "Returns a list of buffers where their major-mode is equal to MODE" 
      (let ((buffer-mode-matches '()))                                    
        (dolist (buf (buffer-list))                                        
          (with-current-buffer buf                                         
            (if (eq mode major-mode)                                       
                (add-to-list 'buffer-mode-matches buf))))                  
        buffer-mode-matches))                                              
    
    (defun multi-occur-in-this-mode ()                                    
      "Show all lines matching REGEXP in buffers with this major mode."   
      (interactive)                                                       
      (multi-occur                                                        
       (get-buffers-matching-mode major-mode)                             
       (car (occur-read-primary-args))))                                  
    
    ;; global key for `multi-occur-in-this-mode' - you should change this.
    (global-set-key (kbd "C-<f2>") 'multi-occur-in-this-mode)