TAGSを使ってみる。

exuberant-ctagsの導入

 sudo aptitude install exuberant-ctags

.emacsの設定

とりあえず使うのは以下の2つだけ(他は覚えられません><)

  • find-tag (M-.)
  • pop-tag-mark (M-*)

使い難い位置だったので、keybindを変える。

(global-set-key "\C-c\C-k" 'find-tag)	
(global-set-key "\C-ck" 'pop-tag-mark)

jqueryのTAGSファイルを作る。

ctags --verbose -e jquery.js --languages=javascript > ctags.log

やっぱりanythingが使いたい

tag-findが使っている変数の名前が分からない><(なので、candidatesに何を指定すれば良いか分からない)

とりあえず、以下のようなrubyのコードを書いて代用。

#!/usr/bin/env ruby1.9
# -*- encoding: utf-8 -*-
# "list_from_TAGS.rb"

def f io
  io.inject([])do |re, line|
    re << $1 if line =~ /^\s*([\w\.$@]+?) =/
    re
  end
end

def layout a
  '("' << a.join(%Q{" "}) << '")'
end

file = ARGV.shift
File.open(file){ |rf| print layout(f(rf))}

たぶん、上手く動いていないところがありそう。

.emacsに以下を追加
  (defun set-tags-file-name (path) (interactive "fpath:")
    (setq tags-file-name path))

  (defun anything-find-tag () (interactive)
    (unless tags-file-name
      (call-interactively 'set-tags-file-name))
    (let ((anything-sources (list anything-c-source-tags))
      (anything))) 

  (defvar anything-now-tags-file "unknown")
  (defvar anything-tags-source nil)
  (defvar anything-c-source-tags
    '((name . "Current TAGS context")
      (init . (lambda ()
		(setq anything-tags-source (get-anything-tags-context))))
      (candidates . (lambda ()
		      (unless (equal anything-now-tags-file tags-file-name)
			(setq anything-now-tags-file tags-file-name)
			(setq anything-tags-source (get-anything-tags-context)))
		      anything-tags-source))
      (action . (("Find-tags" . (lambda (candidates) (find-tag candidates)))))))

  (defun get-anything-tags-context () 
    (let ((command (concat "list_from_TAGS.rb " 
			   (expand-file-name tags-file-name))))
      (sort (car (read-from-string (shell-command-to-string  command)))
	    'string-lessp)))
  )

(global-set-key "\C-c\C-k" 'anything-find-tag)	
;;find-tagを止めてこちらに変更

後で調べる

  • find-tagが見ている場所