vim, швидко перемикання між файлами за допомогою ванільного Vim (без плагінів)


103

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

Щось мене стримує - це можливість швидко перемикатися між файлами. Я (вважаю , по крайней мере) мати хороше розуміння буферів , вікон , вкладок , а також netrw ( Vex, Ex, і т.д.).

Але в такому редакторі, як Sublime Text , я можу просто набрати ctrl- pі миттєво опиняюся у файлі.

Я знаю, що я можу перейти до оболонки, але мені цікаво, чи є якісь інші «приховані» секрети для швидкого перемикання між файлами у Vim, виходячи з іншого, ніж просто ім'я файлу.


2
Це не відповідає на ваше запитання, але може переконати вас розглянути можливість використання плагінів: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood

Я особисто синхронізував свої налаштування з Dropbox. Це незграбно, але він більш-менш працює, не думаючи про це. Один плагін, який я використовую і знаю, добре працює для того, що ви хочете, це Command-T ( github.com/wincent/Command-T ). Ctrl-P може бути альтернативою ( vim.org/scripts/script.php?script_id=3736 ).
FX

1
Ви бачили danielmiessler.com/study/vim ? Він має дуже розумний мотив поставити свій vimrc + всі штекери, які йому потрібні в Github ... там, де він піде, він може його клонувати і вуаля, Vim - саме так, як йому подобається. Блискучий
бокс

6
@bobox, це роблять десятки тисяч людей; в цьому немає нічого надзвичайного.
romainl

Відповіді:


236

Найближчий еквівалент ("найближчий", не "точний") до ST2's 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>

Ідея походить від цього зображення, взятого з колекції Bairui з інфографіки 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 поставити їх конфігурації під управлінням версіями , що робить його дуже швидко і легко встановити свій власний конфіг на новій машині. Подумай над цим.


EDIT

Кілька місяців тому мені довелося працювати на віддаленій машині зі застарілим 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>

Відображення відображає список доступних буферів у «дикому меню» з порожнім підказкою, що дозволяє мені переходити по меню <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, який ви редагували. Дивовижно.


2
+1. Я не мав уявлення про "будь-який підкаталог" у поєднанні з, :eале відтепер я буду його багато використовувати . Я дивуюсь роботі, яка потрапила в Ctrl-P, і я можу багато чому навчитися, але це не спрацювало. Я виявив, що це трохи мляво і тому перериває мій потяг думок під час роботи (могла бути моя система, мої налаштування, я сам, але я не досліджував)
Lieven Keersmaekers

2
**дійсно чудово.
romainl

1
Я хотів би ще раз подати заявку на gbкарту. Ще один я багато використовую. Усі плагіни буфера, які я пробував (CtrlP, bufExplorer, ...) , не так швидко, як це (надано, вони пропонують більше функціоналу, але недостатньо для мене, щоб продовжувати їх використовувати) .
Lieven Keersmaekers

2
@LievenKeersmaekers, це те , де я отримав його від і це те , де дурна картина приходить. Дякую Байруй!
romainl

4
Це може бути найбільша відповідь будь-коли.
craigp

5

Відповідь багато залежить від ваших уподобань та обставин. Деякі приклади:

  • Якщо це в основному два файли (наприклад, заголовок C та файл реалізації), <C-^>це дуже зручно. Загалом, альтернативний файл - важлива концепція.
  • Якщо ви використовуєте велике вікно редактора, :splitперейдіть на проблему з тим, як знайти буфер, не знаходячи вікно (як тільки ви відкриєте всі буфери). Ви можете використовувати [N]<C-w><C-w>для швидкого переходу на нього.
  • Якщо ви можете запам'ятати (кілька) буферних номерів, команди :[N]b[uffer]та :[N]sb[uffer]команди є досить зручними; :lsповідомляє вам цифри.

Плагіни (або принаймні спеціальні відображення) можуть значно покращити речі, і на vim.org існує ціла різноманітність . Існують різні механізми розподілу конфігурації (Pathogen + GitHub, Dropbox, ...), або ви можете віддалено редагувати файли сервера через плагін netrw, який постачається з Vim.


4
Ймовірно, варто згадати ctags, cscope, gtags, id та друзів. Я вважаю, що використання великих знаків дуже корисне. Використовуйте mAдля зберігання позначки Aта `` A``` для повернення. Мені netrw стає набагато кориснішим після того, як я дізнався про те, :Rexщо повертається до Explorer. :b, :eта багато інших можуть приймати символи типу " *та" **. :bКоманда може взяти частину імені файлу. Поєднайте це з <c-d>диким меню або ви можете дістатись далеко. Що стосується плагінів, ви можете використовувати щось конкретне для домену, наприклад rail.vim, яке забезпечує конкретні навігаційні команди для рейків або щось більш загальне, наприклад CtrlP.
Пітер Рінкер

@PeterRincker: +1 для згадки про знаки. Я пропоную побудувати відповідь з відмітками.
Хельбредер

Що означає <C - ^> і [N] <Cw> <Cw>?
Джош Десмонд

5

Іноді також зручно послідовно переглядати список файлів (наприклад, якщо ви робили щось на кшталт vim *.phpвідкриття декількох файлів одночасно). Тоді ви можете використовувати :n[ext](а також :prev[ious], :fir[st]і та :la[st]) для навігації (крім того, що було запропоновано в інших відповідях).


4

Ви можете виконати завершення вкладки підстановки в командному рядку без плагінів. напр

:e src/**/foo*<tab>

дозволить вам переглядати всі файли, починаючи з 'foo', у дереві каталогів під ./src та вибрати той, який ви бажаєте редагувати.

Якщо ви вже відредагували файл і він все ще знаходиться в буфері, ви можете переключитися на нього за допомогою:

:b foo<tab>

який буде проходити через усі буфери з "foo" на шляху. Вам може знадобитися встановити параметри wildmode та wildmenu, щоб отримати потрібну поведінку. У мене є

wildmode=longest:full
wildmenu

в моєму .vimrc.


2

Якщо ви маєте ім'я файлу та хочете перейти до цього файлу, gfце зробить за вас. Мені також подобається використовувати ctags , який не є плагіном; ви просто побудуєте теги і зможете легко перестрибувати вашу кодову базу.


1

Якщо ви хочете перемикатися між файлами в редакторі vim, див. Відповідь нижче

Спочатку натисніть Escклавішу, щоб вийти з режиму редагування.

Потім введіть, :eщоб перевірити поточний шлях до файлу.

якщо ви хочете перейти до іншого файлу, тоді введіть, :e /path-of-file.txt/використовуючи цей, ви можете переключитися.

Якщо ви хочете перейти до попереднього файлу, просто введіть :e#який перехід на попередній шлях до файлу.


0

У мене було те саме питання з Вімом.

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

Я додав наступні рядки до .vimrc

set path+=**
set wildmenu

І БАМ! Я можу зараз :find any/filename/in/any/folder/, поки vim знаходиться в кореневій директорії проекту. Завершення роботи вкладки. Дікові картки працюють!

Після того, як файли вже відкриті, а у фоновому режимі є тонна буферів (ви можете використовувати :lsдля перегляду всіх буферів), запущений :b any/file <TAB>буде нечітко шукати всі буфери та переходити до потрібного файлу. У випадку, якщо він не є унікальним, з'явиться меню з вкладками (звідси другий рядок у .vimrc), який можна вибрати за допомогою табуляції.

Моя відповідь надходить із цього дивовижного відео
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
Є більше хитрощів, і я рекомендую переглянути його.

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