使用ivy查看cscope的历史记录

我在emacs中使用cscope来查看代码,每次我在代码中跳跃时是非常快速的。但是每次都只能是把之前的mark给pop出来才能回到刚才的位置。没有可以浏览所有访问记录的功能。

我自己实现了一个很urgly的方法:

(require 'ivy)
(defun peng-ring-to-filename-and-position (marker)
  "change ring to string format `filename:position'"
  (let* ((buffername (marker-buffer marker))
         (position (marker-position marker)))
    (format "%s:%s" buffername position)))

(defun peng-add-content (file-name-and-position)
  "change `filename:position' to
`filename:position:content-of-line'"
  (let* ((rlist (split-string file-name-and-position ":"))
         (buffer (car rlist))
         (position (string-to-int (cadr rlist)))
         content)
    
    (progn
      (set-buffer buffer)
      (goto-char position)
      (setq content (buffer-substring-no-properties
                    (line-beginning-position)
                    (line-end-position)))
      (message "%s:%s:%s" buffer
               position
               content))))

(defun peng-walk-through-cscope-ring ()
  (interactive)
  (let* ((mymarker cscope-marker-ring)
         (file-name-and-position (mapcar 'peng-ring-to-filename-and-position (ring-elements mymarker)))
         (result (ivy-read "where do you want to jump: "
                           (mapcar 'peng-add-content file-name-and-position)))
         (rlist (split-string result ":"))
         (buffer (car rlist))
         (position (string-to-int (cadr rlist))))
    (progn
      (switch-to-buffer buffer)
      (goto-char position))))

这样,调用 peng-walk-through-cscope-ring。可以使用ivy来查看到历史,选择对应的项后就直接跳过去了。

使用tag应该也是一样的,把上样的 cscope-marker-ring改成对应的ring就可以了。有兴趣的可以试一下。

back-button是不是更通用?

通常我也是回退多些,但是有时候source insight里面你查看函数调用关系的时候,一层层找出来可以一次就跳到开头或者结尾。我用cscope的话,每次一层一层找出来。想回去又得一层一层退回。有时又需要这样来回切换。。。所以我就自己搞了一下。