VIM 7: Как эффективно перемещаться по дереву исходного кода из корня базы кода? - PullRequest
4 голосов
/ 22 марта 2011

У меня есть система навигации по коду по нескольким файлам в огромной базе кода, и я хочу исправить / исправить недостаток, который у нее есть в настоящее время:

Моя оболочка предварительно настроена для открытия накорень моей кодовой базы - назовем его Dev /.Во время синхронизации / построения кода у меня есть скрипт, который автоматически сохраняет относительный путь всех файлов .h и .c в одном файле, который будет использоваться cscope (назовем его cscope.files).

После того, как ясинхронизировать, этот файл обновляется - и затем я могу открыть любой файл, который я хочу в vim, используя следующую команду из Dev /:

vif "part of file name",

, где

vif:     aliased to vi `grep !:1 cscope.files`

При условии, что я даю частьимени файла достаточно долго, чтобы однозначно идентифицировать его, я могу сразу открыть его в vim.

Теперь недостатком этого подхода является то, что когда я уже открыл один файл и перешел на другой файл , не выходя из vim , единственный способ, которым я могу это сделать, - это

:!vif *file2*

Это порождает новую оболочку, а затем открывает файл в vim, запущенном там.В результате я не могу переключаться между двумя файлами (используя Ctrl- ^).Я не могу найти решение, которое:

a) Позволяет мне открыть любой файл из Dev / мгновенно

b) Позволяет мне открыть любой другой файл внутри vim (как только яоткрыл существующий файл) в той же оболочке, чтобы 2 сеанса vim знали друг о друге (я могу переключаться между двумя с помощью Ctrl - ^)

Я знаю, что это длинный вопрос (какGoogle это :)), но я держу пари, что решение простое и очевидное для кого-то более опытного в VIM!

Дайте мне знать, если какая-то часть вопроса нечеткая, и я проясню это ...

ОБНОВЛЕНИЕ: Я в конечном итоге пошел путем cscope после настройки с помощью ярлыка (как при использовании«gf» на cscope.files все еще не давал мне переключаться между двумя исходными файлами).См. VIM 7 и cscope: использование «cscope find f» внутри раскладки клавиатуры для переключения между файлами для быстрого доступа.

Ответы [ 4 ]

3 голосов
/ 22 марта 2011

Я думаю, что плагин Vim Fuzzy Finder хорошо адаптирован к вашему случаю использования.

Как видно из названия, с помощью плагина вы можете находить файлы с помощью нечеткого текстового поиска.

Кроме того, он также работает для других ресурсов Vim, таких как буферы, теги и т. Д.

3 голосов
/ 22 марта 2011

Используйте grep vim как-то так:

:map <F1> :vim <pattern> cscope.files<CR>gf

Например, с помощью этого:

vnoremap <F1> "ry:exe ':1vim /'.@r.'/ cscope.files'<CR>gf

вы выбираете (визуальный режим) шаблон, который хотите найтии затем нажмите F1 .Первый файл, соответствующий шаблону, откроется, заменив текущий буфер *.

* Если это возможно.т. е. если текущий буфер сохранен или установлен hidden и т. д.

Если вы предпочитаете получать приглашение, используйте input():

nnoremap <F1> :exe ':1vim /'.input("Enter pattern: ").'/ cscope.files'<CR>

[но тогда выпридется вручную gf, потому что input() потребляет оставшиеся символы карты.Чтобы избежать этого, вы можете использовать inputsave() и inputrestore()]

update

... например, вот так:

function! GetPat()
  call inputsave()
  let mypat = input("Enter pattern: ")
  call inputrestore()
  return mypat
endfunction

nnoremap <F1> :exe ':1vim /'.GetPat().'/ cscope.files'<CR>gf
1 голос
/ 23 марта 2011

Также попробуйте использовать встроенную интеграцию cscope:

:cs find f stdio.h

Cscope tag: stdio.h
   #   line  filename / context / line
   1      1  /usr/include/stdio.h <<<unknown>>>
   2      1  /usr/include/bits/stdio.h <<<unknown>>>
Type number and <Enter> (empty cancels):

См. :help cscope-suggestions для некоторых отображений, которые могут облегчить использование cscope из vim.

1 голос
/ 22 марта 2011

Я сам не пользуюсь cscope, но кажется, что вы можете использовать его для поиска файлов, см. :help cscope-find.

В противном случае, что-то вроде (не проверено) может помочь:

"Custom function
function! MyFunc(pat)
  " Get files list
  let filelist = readfile('path/to/cscope.files')
  " Filter non matching item out and see if only one item is left
  if len(filter(filelist, 'v:var =~? '.a:pat)) == 1
    " edit file
    exec 'edit '.filelist[0]
  else
    " Report back
    echom 'More than one match:'
    for file in filelist
      echom file
    endfor
  endif
endfunction
" Custom command
command! -bar -nargs=1 MyCom call MyFunc(<args>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...