Поради та рекомендації Vim та Ctags [закрито]


485

Щойно я встановив Ctags (щоб допомогти у розробці C ++) зі своїм Vim (а точніше gVim), і хотів би дізнатися ваші улюблені команди, макроси, ярлики, поради, які йдуть разом із ним ...

Поділіться своїм найкращим арсеналом. Які ще додатки Vim ви б порекомендували для C ++ щодо розробки Vim?

EDIT Які ще додатки ви б використали спільно з Ctags?

EDIT2 Яку версію gVim ви використовуєте з тегами? Це має значення?

EDIT3 Як покращити досвід програмування як для великих, так і для малих проектів?


15
Переконайтеся, що ви використовуєте насичені ctags (сучасна реалізація) для найкращих результатів: ctags.sourceforge.net
idbrii

17
Можливо, кев не конструктивний?
Флойд

27
хоча closed as not constructiveмайже два роки тому для мене це настільки конструктивно
сазарій

15
Я думаю, що справжньою причиною закриття цього питання повинно було бути: "Це питання, незважаючи на те, що він дуже корисний, не вкладається в політику StackOverflow щодо питань Q&A. Нехай це запитання та відповіді переходять до Quora і розвиваються на цьому веб-сайті, поки ми наполегливо продовжуємо закривати корисні. питання та відповіді".
Дієго Піно

2
Я розумію, чому це питання було закрито, враховуючи правила СО. Але позначення запиту на 400 запитів з відповіддю на відповідь> 300 на видалення трохи суперечить , чи не так?
DevSolar

Відповіді:


394

Ctrl+ ]- перейти до визначення
Ctrl+ T- Перейти назад із визначення.
Ctrl+ W Ctrl+ ]- Відкрийте визначення в горизонтальному розщепленні

Додайте ці рядки у vimrc
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl+ \- Відкрийте визначення у новій вкладці
Alt+ ]- Відкрийте визначення у вертикальному розділенні

Після створення тегів. Ви можете використовувати наступні клавіші для позначення та тегування функцій:

Ctrl+ Left MouseClick- Перейти до визначення
Ctrl+ Right MouseClick- Перейти від визначення


8
C -] => (клавіша керування) і] клавіша C - T => (клавіша управління) і клавіша T Просто для новачків до каталогів. Дякуємо за новий фокус на вкладку
kumar

6
Аналогічно, розділивши вікно з Ctrl-w C-]вами, ви можете зробити так само C-w T(як Shift-t), щоб змінити поділ на нову вкладку.
Даш-Том-Банг

1
@Will Якщо ви використовуєте vim з терміналу, вам доведеться змінити налаштування терміналу, щоб змусити клавішу опціону діяти як ключ alt. Якщо ви використовуєте MacVim, додайте цей рядок у vimrc 'set macmeta'. Є doc для macmeta,: h macmeta.
Амджіт

17
g C-]дуже корисно. Це відкриває швидке діалогове вікно для вибору одного з декількох визначень.
Вінченцо Пій

3
g]також корисна. Ви можете розташувати курсор над назвою тегу та натиснути, g]щоб отримати список відповідних тегів.
zeekvfu

176

Один рядок, який завжди йде в моєму .vimrc:

set tags=./tags;/

Це буде шукати у поточному каталозі "теги" та працювати над деревом до кореня, поки не знайдеться. IOW, ви можете знаходитись у будь-якому місці свого вихідного дерева замість просто кореня.


37
Підніматися до кореня - надмірно. Я пропоную лише замість цього повернутися додому: теги + = теги; $ HOME
gotgenes

37
Дерева-джерела, над якими я працюю, не завжди знаходяться в моєму домашньому каталозі ... і будучи тим, що $ HOME має тенденцію бути двома каталогами від кореня ... ну, я можу дозволити собі ще два пошуку каталогів. :)
узі

6
Я згоден w / uzi. Якщо мій cwd / home / me / програмування / foo / bar / baz / bang / bam, це лише 8 пошукових записів у каталозі. Я думаю, це залежить від вашої толерантності до швидкості, але час пошуку 1 каталогу не помітно відрізняється від 8 на моїй машині.
Нейт Мюррей

1
Це залежить від вашого сценарію, мені потрібно використовувати пропозицію getgenes на одній із моїх машин, оскільки в / home є приблизно 8000 каталогів, і це, як правило, трохи мляво.
jkerian

1
Чи є щось подібне cscope?
szx

45

Ще один корисний плагін для розробки C - це cscope Так само, як Ctags дозволяє переходити до визначень, Cscope переходить до функцій виклику .

Якщо у вашому каталозі ~ / bin / у вас є cscope, додайте наступне у свій .vimrc та використовуйте g ^] для переходу до функції виклику (див. Довідку cscope).

if has("cscope")
    set csprg=~/bin/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
endif

Майже забули ... Так само, як ctags - ви повинні генерувати (та періодично оновлювати) базу даних. Я використовую наступний сценарій

select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

Де 'select_files' - інший скрипт, який витягує список файлів C та заголовків із Makefile. Таким чином я індексую лише ті файли, які фактично використовуються проектом.


Яка перевага cscope над ctags? Вони чимось компліментують?
Whaledawg

4
Вони доповнюють один одного. Ctags знаходить визначення символу чи функції. Cscope може знайти всі місця, що викликають функцію. використання їх обох робить навігацію у великих деревах-джерелах дуже простою.
nimrodm

1
Однак у AFAIK -скопії є обмежене розуміння C ++.
Люк Ермітт

Він обмежений, і не дуже хороший. Але для того, що він робить (стрибаючи до USAGES), немає кращої альтернативи. Його головна проблема полягає в тому, що, коли ви хочете перейти до функціональних викликів (f), вам часто потрібно переходити туди, куди використовується цей символ (-и), і фільтрувати результати подумки ...
Грег Роджерс,

2
@Whaledawg Так, коли я натискаю CTRL +], моя звукова карта надсилає "clap.wav" на виході :)
Patrizio Rullo

27

Ви можете додавати каталоги до пошуку своїх тегів. Наприклад, у мене індекс ctags побудований для Qt4, і це є у моєму .vimrc:

set tags+=/usr/local/share/ctags/qt4

23

Все вищезазначене та ...

code_complete: параметр функції завершений, фрагменти коду та багато іншого.

taglist.vim: браузер вихідного коду (підтримує C / C ++, java, perl, python, tcl, sql, php тощо)


5
Я думаю, було б добре додати, що taglist.vim - це найпопулярніший плагін vim.
Аміт

16

Я використовую ALT-ліворуч і ALT-праворуч для поп / натискання з / до стека тегів.

" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>

Якщо ви використовуєте hjklдля руху, ви можете зробити карту <M-h>і <M-l>замість цього.


це не те саме, що ctrl -] і ctrl-t - я думаю, ваша пропозиція трохи чистіша.

@ Саша, пробач? Не знаю, що ти кажеш. = Зауважимо, це також працює у: довідці.
страгер

2
Я думаю, що це більш інтуїтивно і чіткіше, ніж за замовчуванням.
Айман

1
@Ayman Але також порушує принцип не потрібно рухати руками від головного дому, як, наприклад, використання hjkl проти клавіш зі стрілками.
TankorSmash

@TankorSmash, який принцип?
страгер

10

Кілька однойменних визначень

<C-w>g<C-]>відкрийте визначення у розщепленні, але також зробіть, :tjumpщо або переходить до визначення, або, якщо є декілька визначень, представляє вам список визначень на вибір.


2
Подібно до першої команди, vim має :ptagкоманду, яка відкриває визначення у вікні попереднього перегляду.
idbrii

1
Вікно попереднього попереднього перегляду приємно, тому що ви можете закрити його: pc з будь-якого іншого вікна, не спочатку переміщуючи курсор до вікна попереднього перегляду.
Хейкі Наскі

Існує також акуратний фокус autocmd з ptag, під час :h CursorHold-exampleякого відображається тег для елемента під курсором у вікні попереднього перегляду після настроюваного тайм-ауту.
dash-tom-bang

+1 для: tjump Я зараз зв'язаний: tjump <Cr><Cw> <CR> працює краще, ніж <C -]> imho Хочеться поєднувати цю поведінку з: ptag
Andreas Fliesberg

:helpдивовижно іноді ... дивіться :help CTRL-W_g}і:ptjump
Андреас Флісберг

8

Команда, якою я користуюсь найбільше, є C-], яка переходить до визначення функції під курсором. Ви можете використовувати його частіше, щоб відслідковувати більше дзвінків. Після цього Co поверне вас на один рівень, Ci знову заглиблюється.


16
Ct повертається на один рівень у степі C-], а Co повертається до попереднього положення курсору після руху. Отже, якщо ви C-] до функції, а потім сторінки вниз, Ct повернеться негайно назад, а Co повернеться до початку функції, а потім назад до виклику.
Грег Х'югілл

6

Я знайшов плагін теґлістів обов'язковий. Він перераховує всі теги, про які він знає (файли, які ви відкрили) у окремому вікні, і це робить дуже простою навігацію за більшими файлами.

Я використовую його здебільшого для розробки Python, але він може бути кращим лише для C / C ++.




4

Я розміщую наступне у своєму .gvimrc-файлі, який шукає дерево з будь-якої точки файлу тегів, коли запускається gvim:

function SetTags()
    let curdir = getcwd()

    while !filereadable("tags") && getcwd() != "/"
        cd ..
    endwhile

    if filereadable("tags")
        execute "set tags=" . getcwd() . "/tags"
    endif

    execute "cd " . curdir
endfunction

call SetTags()

Потім я періодично відновлюю файл тегів у верхній частині свого вихідного дерева зі сценарієм, який виглядає так:

#!/bin/bash

find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -

7
Ви просто винайшли пошук вгору. Див .: h пошук файлів. Дивіться також stackoverflow.com/questions/563616/vimctags-tips-and-tricks / ...
gotgenes

2

Я використовую vim в macos, і оригінальні ctags не працюють добре, тому я завантажую новітні та конфігурую змушую встановити його. Я встановлюю ctgas в / usr / local / bin / ctags (щоб зберегти оригінальний)

"taglist
let Tlist_Ctags_Cmd = "/usr/local/bin/ctags"
let Tlist_WinWidth = 50
map <leader>ta :TlistToggle<cr>
map <leader>bta :!/usr/local/bin/ctags -R .<CR>
set tags=tags;/
map <M-j> <C-]>
map <M-k> <C-T>

1

Я адаптував функцію пошуку SetTags () вище (яку слід замінити на еквівалентну set tags+=./tags;/), щоб вона працювала на cscope. Здається, працює!

"cscope file-searching alternative
function SetCscope()
    let curdir = getcwd()

    while !filereadable("cscope.out") && getcwd() != "/"
            cd ..
                endwhile

    if filereadable("cscope.out")
            execute "cs add " . getcwd() . "/cscope.out"
                endif

    execute "cd " . curdir
    endfunction

call SetCscope()

3
Як сказав Гетген, ви просто знову придумали пошук вгору. Див .: h пошук файлів. Дивіться цей плагін для відповідного прикладу.
idbrii

1

Ще одна ітерація на функції SetCscope () вище. Це встановлює попередній шлях для cscope, щоб отримувати збіги, не перебуваючи в режимі, де "cscope.out":

function s:FindFile(file)
    let curdir = getcwd()
    let found = curdir
    while !filereadable(a:file) && found != "/"
        cd ..
        let found = getcwd()
    endwhile
    execute "cd " . curdir
    return found
endfunction

if has('cscope')    
    let $CSCOPE_DIR=s:FindFile("cscope.out")
    let $CSCOPE_DB=$CSCOPE_DIR."/cscope.out"
    if filereadable($CSCOPE_DB)
        cscope add $CSCOPE_DB $CSCOPE_DIR
    endif

    command -nargs=0 Cscope !cscope -ub -R &
endif

3
Як сказав Гетген, ви просто знову придумали пошук вгору. Див .: h пошук файлів. Дивіться цей плагін для відповідного прикладу.
idbrii
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.