我在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就可以了。有兴趣的可以试一下。