linux下vim+ctags用法


[/home/brimmer/src]$ctags-R"-R"は、ソースコードルートディレクトリのすべてのサブディレクトリのソースプログラムを含む再帰的に作成されることを意味します.「tags」ファイルには、これらのオブジェクトのリストが含まれています.lは#defineで定義されたマクロl列挙型変数の値l関数の定義、プロトタイプおよび宣言l名前空間(namespace)lタイプ定義(typedefs)l変数(定義および宣言を含む)lクラス(class)、構造(struct)、列挙タイプ(enum)、および連合(union)lクラス、構造、連合におけるメンバー変数または関数VIMは、この「tags」ファイルを使用して、上にマークされたオブジェクトを位置決めします.次に、これらのオブジェクトを位置決めする方法を説明します.1)コマンドラインを使用します.vimを実行するときに「-t」パラメータを追加します.たとえば:[/home/brimmer/src]$vim-t foo_barこのコマンドは、「foo_bar」(変数または関数またはその他)を定義するファイルを開き、カーソルをこの行に配置します.2)vimエディタで「ta」コマンドを使用します.たとえば、ta foo_bar 3)最も便利な方法は,変数名や関数名にカーソルを合わせて「Ctrl-」を押すことである.「Ctrl-o」で元の場所に戻ります.注意:vimを実行する場合は、「tags」ファイルがあるディレクトリで実行する必要があります.そうでなければ、vimを実行するときに「:set tags=」コマンドで「tags」ファイルのパスを設定し、vimが「tags」ファイルを見つけることができます.関数内でカーソルを移動する[{前の1列目の"{"}]次の1列目の"{"{前の空の行に移動}次の空白行gdに移動現在のカーソルが指すローカル変数の定義に移動*現在のカーソルが指す単語が次に現れる場所に移動#現在のカーソルが指す単語が前回現れた場所に移動
Vimの作成者はコンピュータプログラマーなので、Vimには識別子が定義され、使用されている場所にジャンプするプログラムの作成を支援する機能がたくさんあるのは不思議ではありません.別のウィンドウで宣言などをプレビューします.次の章では、さらに多くの機能について説明します.|29.1|ラベル|29.2|プレビューウィンドウ|29.3|コード間移動|29.4|グローバル識別子の検索|29.5|ローカル識別子の検索
 
29.1


      

? 。 C C++
。 。Vim ,

C , :

ctags *.c

"ctags" 。 Unix 。 ,
"Exuberant ctags":

http://ctags.sf.net



:tag startlist

"startlist", 。
CTRL-] 。 C
。 , "write_block" 。
"write_line"。 "write_line" ? "write_line"
CTRL-], 。
"write_line" "write_char"。 。
"write_char" CTRL-], "write_char" 。

+-------------------------------------+
|void write_block(char **s; int cnt) |
|{ |
| int i; |
| for (i = 0; i < cnt; ++i) |
| write_line(s[i]); |
|} | |
+-----------|-------------------------+
|
CTRL-] |
| +----------------------------+
+--> |void write_line(char *s) |
|{ |
| while (*s != 0) |
| write_char(*s++); |
|} | |
+--------|-------------------+
|
CTRL-] |
| +------------------------------------+
+--> |void write_char(char c) |
|{ |
| putchar((int)(unsigned char)c); |
|} |
+------------------------------------+

":tags" :
:tags
# TO tag FROM line in file/text
1 1 write_line 8 write_block.c
2 1 write_char 7 write_line.c
>

。 CTRL-T 。 , "write_line"
"write_char" 。
, 。 ,
。 。 :

:tag

。 :":3tag"。 CTRL-T

, CTRL-] , CTRL-T ,
":tags" 。



":tag" 。
? ":split" ":tag" 。Vim


:stag tagname

:

CTRL-W ]

, 。



, 。Vim

'tags' , 。 :

:set tags=./tags,./../tags,./*/tags

Vim 。
, 。 , "~/proj/src"
, "~/proj/sub/tags" 。 ,Vim
, :

:set tags=~/proj/**/tags



Vim , 。 。
, 。 。
"Exuberant ctags" 。 :

cd ~/proj
ctags -R .

"Exuberant ctags" , C C++
, Eiffel Vim 。 ctags 。
Vim :

:set tags=~/proj/tags



( ) , ":tags" 。
, 。


:tnext

。 ,


:tselect tagname

Vim :

# pri kind tag file
1 F f mch_init os_amiga.c
mch_init()
2 F f mch_init os_mac.c
mch_init()
3 F f mch_init os_msdos.c
mch_init(void)
4 F f mch_init os_riscos.c
mch_init()
Enter nr of choice (<CR> to abort):

( )。




:tfirst
:[count]tprevious [count]
:[count]tnext [count]
:tlast

,[count] 。



。 <Tab>:

:tag write_<Tab>

。 , <Tab> 。

。 Vim 。

"block" 。 :

:tag /block

: <Tab>。Vim "block"

"/" Vim 。
。 , "write_" :

:tselect /^write_

"^" "write_" , "write_" 。
,"$" 。



CTRL-] ,
。 。
( Exuberant ctags):

ctags --c-types=f -f functions *.c

Vim :

vim
:vsplit functions

。 。 ":setlocal ts=99"

, mapping:

:nnoremap <buffer> <CR> 0ye<C-W>w:tag <C-R>"<CR>

, <Enter>。Vim




'ignorecase' 。

'tagbsearch' 。 ,
, 。

'taglength' Vim 。

SNiFF+ , Vim |sniff | 。SNiFF+


Cscope 。 ,
。 |cscope |。

 29.2 
      

, 。 ,
。 。
。 。
"write_char":

:ptag write_char

Vim , "write_char" 。 。
CTRL-W 。
, :

CTRL-W }

。 |CursorHold-example | 。



:pclose

, ":pedit" 。 , :

:pedit defs.h

, "psearch"
。 。 :

:psearch popen

popen() "stdio.h" :

FILE *popen __P((const char * , const char *));

'previewheight' 。

 29.3 
        

,Vim 。

C :

#ifdef USE_POPEN
fd = popen("ls", "r")
#else
fd = fopen("tmp", "w")
#endif

, 。 "#ifdef" %。Vim "#else"。
% "#endif"。 % "#ifdef"。
,Vim 。 "#endif"

"#ifdef" - "#endif" ,


[#

"#if" "#ifdef" , Vim 。
"#else" "#endif":

]#

"#if" - "#endif" 。


#if defined(HAS_INC_H)
a = a + inc();
# ifdef USE_THEME
a += 3;
# endif
set_width(a);

,"[#" 。 "#ifdef" - "#endif" 。



C {} , 。 , "[["
。 "][" 。( "{" "}" 。)
"[{" 。 {} 。"]}" 。


function(int a)
+-> {
| if (a)
| +-> {
[[ | | for (;;) --+
| | +-> { |
| [{ | | foo(32); | --+
| | [{ | if (bar(a)) --+ | ]} |
+-- | +-- break; | ]} | |
| } <-+ | | ][
+-- foobar(a) | |
} <-+ |
} <-+

C++ Java , , {} 。
"[m" 。"]m" 。

,"[]" ,"]]" 。
"}"。

int func1(void)
{
return 1;
+----------> }
|
[] | int func2(void)
| +-> {
| [[ | if (flag)
start +-- +-- return flag;
| ][ | return 2;
| +-> }
]] |
| int func3(void)
+----------> {
return 3;
}

"%" (), {} [] 。




"[(" "])" "[}" "]}" , () {} 。

[(
<--------------------------------
<-------
if (a == b && (c == d || (e > f)) && x > y)
-------------->
-------------------------------->
])



"[/"; "]/"。 /* - * /


+-> +-> /*
| [/ | * A comment about --+
[/ | +-- * wonderful life. | ]/
| */ <-+
|
+-- foo = bar * 3; --+
| ]/
/* a short comment * / <-+

 29.4 
         

C , "int" "unsigned"。
"[I" 。
"column" 。 :

[I

Vim , , 。


structs.h
1: 29 unsigned column; /* column number * /


。 。
, "[I" 。 ,'include'
。 C C++。 , 。



Vim 'path' 。 ,
。 :

:checkpath

, 。 :

--- Included files not found in path ---
<io.h>
vim.h -->
<functions.h>
<clib/exec_protos.h>

"io.h" 。"vim.h" , ":checkpath"
。 "vim.h" "functions.h"
"clib/exec_protos.h" 。

Note:
Vim 。 "#ifdef" 。
"#include" , "#if NEVER" 。

'path' 。 Makefile。
"-I" , "-I/usr/local/X11"。 , :

:set path+=/usr/local/X11

, "*" 。 :

:set path+=/usr/*/include

"/usr/local/include" "/usr/X11/include" 。

,"**" 。
。 :

:set path+=/projects/invent/**/include



/projects/invent/include
/projects/invent/main/include
/projects/invent/main/os/include
etc.

。 , 'path' 。
, :

:checkpath!

( ) 。 ,Vim
"(Already listed)" 。



"[I" 。 ,


[<Tab>

"[ CTRL-I", CTRL-I <Tab> 。

"[I" 。 ,


3[<Tab>

。 CTRL-O 。



[i
]I
]i



"[I" 。 "#define" , :

[D

, 。 'define' "[D" 。
C C++ 。
"[D" :

[d
]D
]d

 29.5 
         

"[I" 。
, :

gD

:Goto Definition。 (C "static")
。 ( "counter" ):

+-> static int counter = 0;
|
| int get_counter(void)
gD | {
| ++counter;
+-- return counter;
}

, , :

gd

。 ,
'{' , 。 ( idx ):

int find_entry(char *name)
{
+-> int idx;
|
gd | for (idx = 0; idx < table_len; ++idx)
| if (strcmp(table[idx].name, name) == 0)
+-- return idx;
}

 
テキストアドレスhttp://hi.baidu.com/original/blog/item/2cf8d53f00b7fcc27d1e71f0.html