Ближайший эквивалент («ближайший», а не «точный») для ST2 Ctrl+ P- это плагин, называемый, будьте готовы… CtrlP . Есть и другие похожие плагины, такие как Command-T или FuzzyFinder .
Я использую CtrlP, и мне это нравится, но я полностью поддерживаю ваше решение отказаться от плагинов. Это не самый простой способ, но в конечном итоге он окупится.
Открытие файлов
Самый простой способ открыть файл - это :e /path/to/filename
. К счастью, вы получаете завершение табуляции и подстановочные знаки: классический *
и специальный **
, что означает «любой подкаталог».
Объединив все это, вы можете:
:e **/*foo<Tab>
выбрать из всех файлов, содержащихся foo
в их имени, в рабочем каталоге или:
:e **/*foo/*bar<Tab>
для выбора из всех файлов, содержащихся bar
в их имени, в любом подкаталоге, содержащемся foo
в его имени, в любом месте рабочего каталога.
Конечно, это работает для :tabe[dit]
, :sp[lit]
и :vs[plit]
, тоже.
Однако эти команды ограничены одним файлом. Используйте :next
для открытия нескольких файлов:
:next **/*.js
и взгляните на :help arglist
.
Переход между буферами
:b[uffer]
это основная команда переключения буфера:
:b4 " switch to buffer number 4
:bn " switch to next buffer in the buffer list
:bp " switch to previous buffer in the buffer list
:bf " switch to first buffer in the buffer list
:bl " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b# " switch to the alternate file
Обратите внимание, что многие из этих команд и их родственники принимают счет.
Команда :ls
показывает вам список загруженных буферов. Однако это немного «особенное»: при создании буферам присваивается номер, поэтому вы можете получить список, который будет выглядеть, как 1 2 5
если бы вы удалили буферы. Да, это немного неудобно, и это делает переключение на буфер по его номеру слишком проблематичным. Предпочитайте переключение по частичному имени :b foo<Tab>
или циклическое переключение :bn :bp
.
В любом случае, вот классное отображение, которое перечисляет все загруженные буферы и заполняет подсказку для вас, ожидая, когда вы наберете номер буфера и нажмете <enter>
:
nnoremap gb :ls<CR>:b<Space>
С этим отображением переключиться на другой буфер так же просто, как:
gb
(quickly scanning the list)
3<CR>
или:
gb
(quickly scanning the list)
foo<tab><CR>
Идея исходит из этого изображения, взятого из коллекции инфографики Vim Байруи :
В Vim также есть <C-^>
(или <C-6>
на некоторых клавиатурах) - эквивалент нормального режима - для переключения :b#
между текущим буфером и предыдущим. Используйте его, если вы часто переключаетесь между двумя буферами.
Прочтите все о буферах в :help buffers
.
Перейти к декларации
Внутри файла вы можете использовать gd
или gD
.
В рамках проекта функция «тегов» Vim - ваш друг, но вам понадобится внешний индексатор кода, например ctags или cscope. Самые простые команды - это :tag foo
и <C-]>
с курсором на имени метода. Оба инструмента хорошо интегрированы в Vim: см :help tags
,:help ctags
и :help cscope
.
Что бы это ни стоило, я широко использую навигацию по тегам для перемещения внутри проекта (в основном, используя CtrlP :CtrlPTag
и :CtrlPBufTag
команды, но также и встроенные), и мой любимый «общий» метод переключения буфера - по имени.
Развертывание вашей конфигурации
Многие пользователи Vim помещают свою конфигурацию в систему контроля версий, что позволяет очень быстро и легко установить собственную конфигурацию на новую машину. Подумай об этом.
РЕДАКТИРОВАТЬ
Несколько месяцев назад мне пришлось работать на удаленной машине с устаревшим Vim. Я мог бы установить подходящий Vim и клонировать свой любимый конфиг, но на этот раз я решил путешествовать налегке, чтобы «заточить пилу». Я быстро построил минимализм .vimrc
и пересмотрел пару полузабытых нативных функций. После этого выступления я решил, что CtrlP не так уж необходим, и избавился от него: собственные функции и настраиваемые сопоставления не так привлекательны, но они выполняют свою работу без особых зависимостей.
Жонглирование файлами
set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *
:find
действительно отличная команда, как только вы set path
правильно сделаете . С моими настройками рекурсивно ,ffoo<Tab>
найдет все файлы, содержащиеся foo
в текущем каталоге. Это быстро, интуитивно понятно и легко. Конечно, я выигрываю от того же завершения и подстановочных знаков, что и с:edit
друзьями.
Чтобы сделать процесс еще быстрее, следующие сопоставления позволяют мне пропускать целые части проекта и рекурсивно находить файлы в каталоге текущего файла:
nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>
ПРЕДУПРЕЖДЕНИЕ! path
Вариант чрезвычайно мощный. Значение выше - .,**
- работает для меня, но для языков, которые я использую, нет стандартной библиотеки. Правильное значение полностью зависит от ваших потребностей.
Жонглирование буферами
set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>
Приведенные выше сопоставления перечисляют доступные буферы в «wildmenu» с пустой подсказкой, что позволяет мне либо перемещаться по меню, <Tab>
либо вводить несколько букв и <Tab>
снова сужать список. Как и в случае с отображением файлов выше, процесс выполняется быстро и практически без проблем.
nnoremap <PageUp> :bprevious<CR>
nnoremap <PageDown> :bnext<CR>
Эти сопоставления говорят сами за себя.
Жонглирование тегами
nnoremap <leader>j :tjump /
Это сопоставление использует поиск по регулярному выражению вместо поиска по всему слову, поэтому я могу ,jba<Tab>
найти тегfoobarbaz()
.
Да, нечеткое сопоставление вызывает привыкание, но вы можете работать и без него. И за небольшую часть стоимости.
БОЛЬШЕ ИЗМЕНИТЬ
Пара дополнительных советов / хитростей…
Параметры Wildmenu
"Wildmenu", доступный с set wildmenu
, упрощает навигацию по файлам / . Его поведение регулируется рядом параметров, которые стоит изучить:
wildmode
сообщает Vim, как должно вести себя "wildmenu":
set wildmode=list:full
wildignore
отфильтровывает весь мусор:
set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*
wildignorecase
позволяет искать foo
и находить Foo
:
set wildignorecase
Метки файлов
augroup VIMRC
autocmd!
autocmd BufLeave *.css normal! mC
autocmd BufLeave *.html normal! mH
autocmd BufLeave *.js normal! mJ
autocmd BufLeave *.php normal! mP
augroup END
Я недавно нашел этот камень у кого-то другого ~/.vimrc
. Он создает метку файла в точном положении курсора всякий раз, когда вы покидаете буфер, так что, где бы вы ни находились, 'J
переходите к последнему буферу JavaScript, который вы редактировали. Потрясающие.