GNU Globalのインストール手順のメモ(root権限無し, Pygmentsパーサ+vimプラグイン)

この記事はGNU Globalのインストール手順のメモです。

- 版数:
  - GNU Global 6.6.8
  - Pygments 2.2.0

- 環境
  - vim 8.0 (2016 Sep 12, compiled Jan 20 2022 02:47:53)
  - Ubuntu 18.04.6 LTS (Bionic Beaver)
  - root権限なし(sudo不可)
  - プロキシ下

# 手順

## Pygmentsパーサのインストール

```
pip install --proxy ${HTTP_PROXY} --user Pygments
```
- `--proxy ${HTTP_PROXY}`はプロキシ下でない方には不要です。  
- プロキシ下の方は環境変数`HTTP_PROXY`を適切に設定してください。  
  - (参考)https://qiita.com/uzresk/items/bc7c4a9dc764390cd5ce

## GNU Globalのインストール

### ビルド

```
cd /tmp/
wget https://ftp.gnu.org/pub/gnu/global/global-6.6.8.tar.gz
tar axf global-6.6.8.tar.gz
cd global-6.6.8/
./configure --prefix=${HOME}/.local/global
make -j $(nproc)
make install
```
- `${HOME}/.local/global`は一例です。好きな場所を指定してください。


### `global`,`gtags`コマンドのパスを通す

```
mkdir -p ${HOME}/.local/bin/
cd ${HOME}/.local/bin/
export PATH=${PATH}:${HOME}/.local/bin/

ln -sf ${HOME}/.local/global/bin/global ./global
ln -sf ${HOME}/.local/global/bin/gtags  ./gtags
```

- `${HOME}/.local/bin/`は一例です。好きな場所を指定してください。
- `${HOME}/.local/global`も[ビルド](#ビルド)で指定したディレクトリに倣ってください。
- `export PATH=${PATH}:${HOME}/.local/bin/`は`${HOME}/.bash_profile`にも追記しておくのが通例です。

### 動作確認

- `global --version`と`gtags --version`を実行した結果が以下のようになればOKです。

```
$ global --version
global (Global) 6.6.8
Powered by Berkeley DB 1.85.
Copyright (c) 1996-2021 Tama Communications Corporation
License GPLv3+: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ gtags --version
gtags (Global) 6.6.8
Powered by Berkeley DB 1.85.
Copyright (c) 1996-2021 Tama Communications Corporation
License GPLv3+: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$
```


### デフォルトのパーサをpygmentsに変更

```
cp ${HOME}/.local/global/share/gtags/gtags.conf ${HOME}/.globalrc
vim ${HOME}/.globalrc
```
- `${HOME}/.local/global`は[ビルド](#ビルド)で指定したディレクトリに倣ってください。
-  `vim ${HOME}/.globalrc`で以下のように編集してください。
```
# Please refer to gtags.conf(5) for details.
#
default:\
        :tc=native:
```
↓
```
# Please refer to gtags.conf(5) for details.
#
default:\
        :tc=pygments:
```

- GNU Globalの対応言語はデフォルトでは5種類(C, Yacc, Java, PHP4 and assembly)ですが、上記を行うことで、C#,Python,Ruby,Fortran,Perl,Verilogなどにも対応できます。
  - (参考) https://www.gnu.org/software/global/


## vimの設定

### vimプラグインの導入

```
mkdir -p ~/.vim/plugin
cp -f ${INSTALL_DIR}/share/gtags/gtags.vim ~/.vim/plugin/
```
- (参考)https://www.gnu.org/software/global/manual/global.html#Preparation_0028Vim_0029

### キーバインドの設定

```
cat << EOF >> ${HOME}/.vimrc

"// -- GNU Global ----
"   Ctrl + h カレントバッファのオブジェクト一覧をvimのquickfixウィンドウに表示
"   Ctrl + n quickfixウィンドウの一覧の次候補へ移動
"   Ctrl + p quickfixウィンドウの一覧の前候補へ移動
"   Ctrl + m 関数の定義<->参照 相互ジャンプ
"   Ctrl + u 関数の参照にジャンプ
"   Ctrl + g カーソル下のkeywordでgrep
"   Ctrl + k 続けてkeywordを入力しgrep
"   Ctrl + o ジャンプ元に戻る
map <C-h> :Gtags -f %<CR>
map <C-n> :cn<CR>
map <C-p> :cp<CR>
map <C-m> :GtagsCursor<CR>
map <C-u> :Gtags -r <C-r><C-w><CR>
map <C-g> :Gtags -g <C-r><C-w><CR>
map <C-k> :Gtags -g 
EOF
```

## 動作確認

一例として、今回インストールしたGNU Globalのソースコードを題材に動作確認します。

### タグの生成
```
cd /tmp/global-6.6.8/
gtags
```
- `GPATH`, `GTAGS`, `GRTAGS`というファイルが生成されるはずです。
```
$ ls -t
★GRTAGS★    globash         libparser   config.h      gtags.conf     configure      head.in　　    Doxyfile.in  README.PATCHES     geco.rc           vim74-gtags-cscope.patch  depcomp
★GPATH★     htags           libutil     script        Makefile       aclocal.m4     AUTHORS      FAQ          acinclude.m4       gtags-cscope.vim  ltmain.sh                 install-sh
★GTAGS★     gtags           libglibc    doc           config.status  BUILD_TOOLS    COPYING      LICENSE      configure.ac       gtags.pl          INSTALL                   missing
global        gozilla         config.log  htags-server  m4             THANKS         COPYING.LIB  Makefile.am  convert.pl         gtags.vim         compile
libdb         plugin-factory  libtool     htags-refkit  Makefile.in    gtags.conf.in  ChangeLog    NEWS         elvis-2.2_0.patch  mainpage.dox      config.guess
gtags-cscope  libltdl         stamp-h1    Doxyfile      config-h.in    gtags.el       DONORS       README       elvis.rc           reconf.sh         config.sub
$
```

### vimで動作確認

- 一例として`./global/global.c`をvimで開いてみます。
```
vim ./global/global.c
# vimで./global/global.cを開けたら、Ctrl + hを押下
```

- 下記のような画面が表示されればOKです。
- ![Screenshot from 2022-05-15 03-55-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88310/576ac856-dca6-7c94-9651-a8ca409e58d9.png)

# 参考にさせていただいたWebページ
- http://blog.matsumoto-r.jp/?p=2369
- https://mickey-happygolucky.hatenablog.com/entry/2019/04/01/115817
- https://www.tamacom.com/handbook/index.html
- https://qiita.com/sakaia/items/c4a11c4e2e43ae3b4d97
- https://qiita.com/yoshizow/items/9cc0236ac0249e0638ff
- https://qiita.com/suzutsuki0220/items/1e755fd98e5b12af3e2d