help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: What's your favourite *under_publicized* editing feature of Emacs?


From: Oleksandr Gavenko
Subject: Re: What's your favourite *under_publicized* editing feature of Emacs?
Date: Wed, 09 Feb 2011 01:10:35 +0200
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6

On 2011-02-06 22:11, Oleksandr Gavenko wrote:
On 2011-01-29 14:55, Javier Sanz wrote:
Some that come to my mind:
- Using define-generic-mode, I've defined a major mode for my app
logs, which highlights errors and warnings in different colors and
makes them easier to see.
How large your log files?

I set 'grep-mode' on my log file (which follow GNU
error coding convention). On 50-100 KiB logs it take
10 sec to highlight matches. On larger files I type
C-g to stop matching for highlighting.

Performance penalty because I use grep-mode which based on compilation-mode.

In private mail Javier Sanz show me his log mode based on
'define-generic-mode'.

I check and found that font-lock mechanism is pretty fast.

This become start point to develop some code by hand.

And I realize that compilation-mode is dumb as it try
set on all matched file/line pairs text properties to
allow move to another file by RET.

Instead I highlight required patterns and make GOTO error
function which analyse only current line:


;;; my-log-mode.el --- major mode for error logs

;; Copyright (C) 2010 by Oleksandr Gavenko <gavenkoa@gmail.com>

;; You can do anything with this file without any warranty.

;; Author: Oleksandr Gavenko <gavenkoa@gmail.com>
;; Maintainer: Oleksandr Gavenko <gavenkoa@gmail.com>
;; Created: 2011-02-09
;; Version: 0.1
;; Keywords: logging

;;; Commentary:
;;
;; Very pure release.

;;; Code:

(defun my-log-goto (point)
  ""
  (interactive "d")
(let ( start stop line fname fline (fregex "^\\([^:]+\\):\\([[:digit:]]+\\):") )
    (save-excursion
      (move-beginning-of-line 1)
      (setq start (point))
      (move-end-of-line 1)
      (setq stop (point))
      (setq line (filter-buffer-substring start stop))
      (string-match fregex line)
      (setq fname (match-string 1 line))
      (when fname
        (setq fline (string-to-int (match-string 2 line)))
        )
      )
    (when (and fname (file-exists-p fname))
      (find-file-other-window fname)
      (goto-line fline)
      )
    ))

(setq my-log-mode-map (make-sparse-keymap))
(define-key my-log-mode-map (kbd "RET") 'my-log-goto)

(require 'generic-x)

;;;###autoload
(define-generic-mode
  'my-log-mode
  nil
  nil
  '(
    ("^\\([^:]+\\):\\([[:digit:]]+\\):[^
]+$" (1 font-lock-keyword-face) (2 font-lock-type-face))
    ("^\\([^:]\\{1,10\\}\\):[^
]+$" (1 font-lock-function-name-face))
    )
  ;; '("\\.log$")
  nil
  (list
   (lambda nil
     ;; (setq buffer-read-only t)
     (use-local-map my-log-mode-map)
     (modify-syntax-entry ?' ".")
     (modify-syntax-entry ?\" ".")
     ))
  )

;;; my-log-mode.el ends here

--
Best regards!




reply via email to

[Prev in Thread] Current Thread [Next in Thread]