ctagsはプログラムソースを読みこませてクラス名、メソッド名、変数名他各種識別子をインデックスしたtagsファイルを作成するプログラムツールです。
tagsファイルをvimやemacsなどの外部プログラムから読み込むことでタグジャンプが使えるようになり、効率的にソースを追えるようになります。
メジャーなctagsプログラムとして「exuberant ctags」と「universal ctags」があり、前者はもう開発が行われておらず、にも関わらずyum install ctagsすると前者がインストールされてしまう具合の悪さが有ります。
後者の「universal ctags」をCentOS 7にインストールするにはgithubからソースを落としてコンパイルしてインストールする必要があります。
目次
適当なディレクトリにクローン。
git clone https://github.com/universal-ctags/ctags.git
ビルドを始める前に、githubサイトにビルドの際の注意書きがあります。
How to build and install
To build with Autotools, seedocs/autotools.rst
for more information. (To build on GNU/Linux, Autotools is your choice.)ビルドとインストールの仕方
Autotoolsを使ってインストールするにはautotools.rstを見てね。
https://github.com/universal-ctags/ctags
とあるのでdoc/autotools.rstファイルを見てみます。
Building with configure (\*nix including GNU/Linux)
---------------------------------------------------------------------
Like most Autotools-based projects, you need to do::
$ ./autogen.sh
$ ./configure --prefix=/where/you/want # defaults to /usr/local
$ make
$ make install # may require extra privileges depending on where to install
After installation the `ctags` executable will be in `$prefix/bin/`.
`autogen.sh` runs `autoreconf` internally.
If you use a (binary oriented) GNU/Linux distribution, `autoreconf` may
be part of the `autoconf` package. In addition you may have to install
`automake` and/or `pkg-config`, too.
(snip)
- ./autogen.sh
- ./configure
- make
- make install
を実行すればuniversal-ctagsをインスト―ル出来そうですが、autogen.shの中でautoreconfコマンドを使うのでautotools関連のパッケージを入れる必要が有りそうです。実際autogen.shを実行してみるとautoreconfコマンドが見つからずエラーになります。
[root@spock ctags]# ./autogen.sh
+ type autoreconf
./autogen.sh: 5 行: type: autoreconf: 見つかりません
autotools関連コマンドをyumインストール
ということでautoconf、automake、libtoolをyumインストールします。
[root@spock ctags]# yum install autoconf automake libtool
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 6.7 kB 00:00:00
* base: ftp.iij.ad.jp
* epel: fedora.cs.nctu.edu.tw
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ autoconf.noarch 0:2.69-11.el7 を インストール
--> 依存性の処理をしています: m4 >= 1.4.14 のパッケージ: autoconf-2.69-11.el7.noarch
---> パッケージ automake.noarch 0:1.13.4-3.el7 を インストール
--> 依存性の処理をしています: perl(Thread::Queue) のパッケージ: automake-1.13.4-3.el7.noarch
--> 依存性の処理をしています: perl(TAP::Parser) のパッケージ: automake-1.13.4-3.el7.noarch
---> パッケージ libtool.x86_64 0:2.4.2-22.el7_3 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ m4.x86_64 0:1.4.16-10.el7 を インストール
---> パッケージ perl-Test-Harness.noarch 0:3.28-3.el7 を インストール
---> パッケージ perl-Thread-Queue.noarch 0:3.02-2.el7 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
============================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
============================================================================================================================================
インストール中:
autoconf noarch 2.69-11.el7 base 701 k
automake noarch 1.13.4-3.el7 base 679 k
libtool x86_64 2.4.2-22.el7_3 base 588 k
依存性関連でのインストールをします:
m4 x86_64 1.4.16-10.el7 base 256 k
perl-Test-Harness noarch 3.28-3.el7 base 302 k
perl-Thread-Queue noarch 3.02-2.el7 base 17 k
トランザクションの要約
============================================================================================================================================
インストール 3 パッケージ (+3 個の依存関係のパッケージ)
総ダウンロード容量: 2.5 M
インストール容量: 7.2 M
Is this ok [y/d/N]: Y
Downloading packages:
(1/6): autoconf-2.69-11.el7.noarch.rpm | 701 kB 00:00:00
(2/6): automake-1.13.4-3.el7.noarch.rpm | 679 kB 00:00:00
(3/6): libtool-2.4.2-22.el7_3.x86_64.rpm | 588 kB 00:00:00
(4/6): m4-1.4.16-10.el7.x86_64.rpm | 256 kB 00:00:00
(5/6): perl-Thread-Queue-3.02-2.el7.noarch.rpm | 17 kB 00:00:00
(6/6): perl-Test-Harness-3.28-3.el7.noarch.rpm | 302 kB 00:00:00
--------------------------------------------------------------------------------------------------------------------------------------------
合計 17 MB/s | 2.5 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : m4-1.4.16-10.el7.x86_64 1/6
インストール中 : autoconf-2.69-11.el7.noarch 2/6
インストール中 : perl-Thread-Queue-3.02-2.el7.noarch 3/6
インストール中 : perl-Test-Harness-3.28-3.el7.noarch 4/6
インストール中 : automake-1.13.4-3.el7.noarch 5/6
インストール中 : libtool-2.4.2-22.el7_3.x86_64 6/6
検証中 : autoconf-2.69-11.el7.noarch 1/6
検証中 : perl-Test-Harness-3.28-3.el7.noarch 2/6
検証中 : perl-Thread-Queue-3.02-2.el7.noarch 3/6
検証中 : automake-1.13.4-3.el7.noarch 4/6
検証中 : m4-1.4.16-10.el7.x86_64 5/6
検証中 : libtool-2.4.2-22.el7_3.x86_64 6/6
インストール:
autoconf.noarch 0:2.69-11.el7 automake.noarch 0:1.13.4-3.el7 libtool.x86_64 0:2.4.2-22.el7_3
依存性関連をインストールしました:
m4.x86_64 0:1.4.16-10.el7 perl-Test-Harness.noarch 0:3.28-3.el7 perl-Thread-Queue.noarch 0:3.02-2.el7
完了しました!
先程無いよと言われたautoreconfコマンドもインストールされました。
[root@spock ~]# which autoreconf
/bin/autoreconf
[root@spock ~]# autoreconf --version
autoreconf (GNU Autoconf) 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+/Autoconf: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David J. MacKenzie and Akim Demaille.
./autogen.sh
再度autogen.shを実行。今度は成功します。
[root@spock ctags]# ./autogen.sh
+ type autoreconf
autoreconf は /bin/autoreconf です
+ type pkg-config
pkg-config は /bin/pkg-config です
+ '[' -z '' ']'
+ type make
+ MAKE=make
++ make -s -f makefiles/list-optlib2c-input.mak
+ ctags_files='optlib/RSpec.ctags
optlib/cmake.ctags
optlib/ctags-optlib.ctags
optlib/elixir.ctags
(snip)
+ o=optlib/inko.c
+ echo 'optlib2c: translating optlib/inko.ctags to optlib/inko.c'
optlib2c: translating optlib/inko.ctags to optlib/inko.c
+ ./misc/optlib2c optlib/inko.ctags
+ exit 0
./configure
./configureを実行。Makefile他各種が出来ます。インストールする場所を変える場合は–prefix=/インストールするパス、を後ろに続けます。
[root@spock ctags]# ./configure
make && make install
コンパイルとコマンドファイルをインストールします。
[root@spock ctags]# make && make install
(snip)
REPOINFO main/repoinfo.h
make install-recursive
make[1]: ディレクトリ `/tmp/ctags' に入ります
make[2]: ディレクトリ `/tmp/ctags' に入ります
REPOINFO main/repoinfo.h
CCLD ctags
make[3]: ディレクトリ `/tmp/ctags' に入ります
REPOINFO main/repoinfo.h
CCLD ctags
/bin/mkdir -p '/usr/local/bin'
/bin/install -c ctags readtags '/usr/local/bin'
make install-exec-hook
make[4]: ディレクトリ `/tmp/ctags' に入ります
make[4]: `install-exec-hook' に対して行うべき事はありません.
make[4]: ディレクトリ `/tmp/ctags' から出ます
make[3]: ディレクトリ `/tmp/ctags' から出ます
make[2]: ディレクトリ `/tmp/ctags' から出ます
make[1]: ディレクトリ `/tmp/ctags' から出ます
コンパイル成功、/usr/local/bin/ctagsが入りました。
[root@spock ctags]# which ctags
/usr/local/bin/ctags
[root@spock ctags]# ctags --version
Universal Ctags 0.0.0(92b2f21), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Jul 21 2019, 00:26:02
URL: https://ctags.io/
Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +packcc
ctagsコマンドインストール完了です。
[root@spock tmp]# ctags --list-languages
- Ada
- Ant
- Asciidoc
- Asm
- Asp
- Autoconf
- AutoIt
- Automake
- Awk
- Basic
- BETA
- BibTeX
- C
- C#
- C++
- Clojure
- CMake
- Cobol
- CPreProcessor
- CSS
- Ctags
- CUDA
- D
- Diff
- DosBatch
- DTD
- DTS
- Eiffel
- Elixir
- Elm
- Erlang
- Falcon
- Flex
- Fortran
- Fypp
- Gdbinit
- Go
- HTML
- Iniconf
- Inko
- ITcl
- Java
- JavaProperties
- JavaScript
- JSON
- LdScript
- Lisp
- Lua
- M4
- Make
- Man
- Markdown
- MatLab
- Moose
- Myrddin
- NSIS
- ObjectiveC
- OCaml
- OldC [disabled]
- OldC++ [disabled]
- Pascal
- Passwd
- Perl
- Perl6
- PHP
- Pod
- Protobuf
- PuppetManifest
- Python
- PythonLoggingConfig
- QemuHX
- QtMoc
- R
- ReStructuredText
- REXX
- Robot
- RpmSpec
- RSpec
- Ruby
- Rust
- Scheme
- Sh
- SLang
- SML
- SQL
- SystemdUnit
- SystemTap
- SystemVerilog
- Tcl
- TclOO
- Tex
- TTCN
- TypeScript
- Varlink
- Vera
- Verilog
- VHDL
- Vim
- WindRes
- YACC
- YumRepo
- Zephir
使用頻度の高いC、Java、Javascript、Python、Ruby,PHPあたりは普通に対応しているので安心です。
viでタグジャンプする
Javaで適当に書いたspringを使うソースを書きます。
タグは静的に解析されるのでコンパイルは不要です。
~/src/HogeService.java
[root@spock src]# cat HogeService.java
package jp.co.hoge;
import org.springframework.stereotype.Service;
@Service
public class HogeService {
public void execute(){
System.out.println("hogehoge");
}
}
/tmpにでもspring-frameworkのgitクローンしてきます。
[root@spock tmp]# git clone https://github.com/spring-projects/spring-framework.git
両方のディレクトリをctagsで再帰的に解析して~/.tagsファイルを作る。
[root@spock src]# ctags -f ~/.tags -R ~/src /tmp/spring-framework/
~/.vimrcに以下を追加。
set tags=~/.tags
再度~/src/HogeService.javaをviで開き、
「import org.springframework.stereotype.Service」
の「Service」の部分にキャレットを当て、Ctrl + ]します。
Serviceの定義元である以下のソースにvi画面が移動されるはずです。
/tmp/spring-framework/spring-context/src/main/java/org/springframework/stereotype/Service.java
/*
* Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.stereotype;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
/**
* Indicates that an annotated class is a "Service", originally defined by Domain-Driven
* Design (Evans, 2003) as "an operation offered as an interface that stands alone in the
* model, with no encapsulated state."
*
* <p>May also indicate that a class is a "Business Service Facade" (in the Core J2EE
* patterns sense), or something similar. This annotation is a general-purpose stereotype
* and individual teams may narrow their semantics and use as appropriate.
*
* <p>This annotation serves as a specialization of {@link Component @Component},
* allowing for implementation classes to be autodetected through classpath scanning.
*
* @author Juergen Hoeller
* @since 2.5
* @see Component
* @see Repository
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
元のHogeService.javaに戻るにはCtrl + tを実行します。
でももうviでソース書くことないし・・・
ctagsで作成したインデックスファイルはviやemacsだけでなく、ブラウザでソースを追えるOpenGrokなどからも使えます。
スマホからでもソースが追えるOpenGrokの構築は以下で行っています。