2009-06-28 24 views

risposta

54

Penso che il modo più semplice sia usare "g ctrl-]" invece di "ctrl-]". Se c'è una sola partita, ti porterà lì. Se ci sono più corrispondenze, le elencherà tutte, permettendoti di scegliere quella che desideri, proprio come: tselect. Il meglio dei due mondi.:)

+0

Sembra promettente, lo controllerò - grazie. –

+0

Per me, questo mi dà solo due dichiarazioni anticipate (in file diversi) di funzioni che condividono il nome. Ma non mostra l'implementazione della funzione. – frankster

+0

Wow. Questa è la vita che cambia. – Praxeolitic

8

Dovresti essere in grado di utilizzare tn e tp per passare ai vari tag corrispondenti.

  • Premere ^] per portarti alla prima partita.
  • Se non è la partita desiderata, digitare :tn per passare al successivo.
  • Se si digita :tn troppe volte è possibile digitare :tp per tornare a quello precedente.
1
:tselect my_little_function 

e si dovrebbe ottenere un elenco di partite. o se si salta a un tag e non siete soddisfatti con esso, quindi digitare

:tselect 

E si ottiene un elenco di alternative per l'ultima tag attivo.

8

Credo che Vim passi al primo tag nel file dei tag per impostazione predefinita. Se lo preferisci puoi selezionarne uno diverso: usa :tj (simile a: tselect, ma salta automaticamente se c'è una sola corrispondenza) o Ctrl-] seguito da :tn).

L'unico modo per modificare l'impostazione predefinita è modificare l'ordine del file di tag, ma non credo che ctags offra un'opzione della riga di comando per farlo.

Non è così difficile come sembra che sia necessario uno script che apra il file di tag, lo smista dal "tipo" di tag e lo scriva nuovamente. Il "tipo" nel tag è un singolo carattere che descrive se si tratta di una funzione (f), una funzione prototipo (p), una macro, un nome enumerato ecc ecc ecc. Se stai usando Linux, potrebbe, in teoria, , essere semplice come:

#!/bin/sh 
ctags -R -f - . | tac > tags 

Dal tac inverte l'ordine delle righe in un file, questo verrà messo automaticamente la definizione prima. Tuttavia, diventa un po 'più complicato in quanto l'intestazione deve essere mantenuta e Vim preferisce che il file dei tag sia ordinato, quindi è meglio passare attraverso il file e ordinare sulla prima voce (il nome del tag) in ordine forward e poi tipo in ordine inverso. Pertanto, qualcosa di più complicato potrebbe essere migliore.

Mi scuso per la spina senza vergogna, ma ho scritto un plug-in Vim che (indirettamente) fa quello che ti serve. È inteso per aggiungere molti gruppi di evidenziazione extra per cose come nomi di funzioni, macro, enumerazioni ecc. Tuttavia, una delle altre cose che fa è riordinare il file di tag in modo che l'implementazione della funzione venga prima della dichiarazione della funzione, quindi raggiungere ciò che vuoi (ho avuto lo stesso bisogno di te). Se non si desidera alcuna funzionalità di evidenziazione, è probabile che si possa eliminarla abbastanza facilmente: è un programma python piuttosto semplice e uno script Vim ancora più semplice ed è disponibile da my site.

1

Questa opzione ha funzionato per me meglio

Mettere la seguente riga nel vostro .vimrc e ora è possibile utilizzare il doppio click del mouse (sulla variable/entry nel file) per saltare alla posizione tag. Se viene trovata una singola partita, salterà immediatamente. Se più voci sono partite, vi verrà chiesto per l'input dell'utente ..

:map <2-LeftMouse> g< c-]> 
1

Aggiungere il seguente al file Vimrc:

noremap <c-]> 2<c-]> 

Questa linea fa sì che vim per passare automaticamente al secondo match (invece del primo), che di solito è la definizione della funzione.

1

in ritardo alla festa, ma per in arrivo Googler tag vim:

ho trovato che l'uso di cscope oltre a ctags è la strada da percorrere, almeno per C/C++. È più intelligente sugli alberi di chiamata e puoi impostarlo in fallback in ctags se fallisce. Esegui semplicemente "cscope -b" ogni volta che esegui ctags -R. e sarai pronto per andare. Se si utilizzano le impostazioni seguenti, sarà possibile utilizzare Ctrl -]/Ctrl-T come sempre, ma è anche possibile aggiungere nifty nuovi salti come saltare a una dichiarazione di funzione e mostrare un jumplist di chiamanti di funzione.

" setup 
if has("cscope") 
    set csto=0                    
    set cst 
    set nocsverb 
    " add any database in current directory 
    if filereadable("cscope.out") 
    cs add cscope.out 
    " else add database pointed to by environment 
    elseif $CSCOPE_DB != "" 
    cs add $CSCOPE_DB 
    endif 
    set csverb 
endif 

" jump to a function declaration 
nmap <silent> <C-\> :cs find s <C-R>=expand("<cword>")<CR><CR>1<CR><CR> 
" show a list of where function is called 
nmap <silent> <C-_> :cs find c <C-R>=expand("<cword>")<CR><CR> 
+0

Cosa intendi? di 'Just r un "cscope -b" ogni volta che esegui ctags -R '? eseguire cscope -b prima di eseguire ctags -R? o dopo? –

0

Ci sono diversi modi per rendere Vim per passare a un tag direttamente, se v'è un solo tag match, altrimenti presentare una lista di partite di tag.

È possibile utilizzare il comando 'tjump' ex. Ad esempio, il comando ':tjump func1' salterà alla definizione func1, se è definita solo una volta. Se func1 è definito più volte, verrà presentata una lista di tag corrispondenti.

È possibile posizionare il cursore sul contrassegno e premere g Ctrl-].

È possibile selezionare visivamente un testo e premere g Ctrl-] per saltare o elencare i tag corrispondenti.

È possibile utilizzare il comando ex 'stjump'. Questo aprirà il tag corrispondente o selezionato dall'elenco dei tag in una nuova finestra.

È possibile premere Ctrl-W g Ctrl-] per eseguire a: stjump.

Help: :tjump, g_Ctrl-], v_g_CTRL-], :stjump, Ctrl-W_g_Ctrl-] 
0

È possibile premere poi CTRL +], questo andrà direttamente alla seconda partita, in Java, questo è di solito l'attuazione di alcune interfaccia.

Problemi correlati