Навігація файлами Vim


90

Я дуже стараюся навчитися vim після використання TextMate за останні кілька років.

Я почав фіксувати частину навігації у файлі в пам'яті, але я боюся з навігацією між кількома файлами.

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

Зараз я використовую NERDTree, але вважаю, що деталізація каталогів є громіздкою, а також постійно використовую CTRL+ W h/ CTRL+ W lдля переходу вперед і назад.

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

Я також хотів би ярлик "Перейти до файлу ...", як CMD+ Tу TextMate. Я знайшов, fuzzy_file_finderале для цього потрібно, щоб vim був побудований із прив'язками Ruby, що не так, як місцеві інсталяції, над якими я працював.

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

Варіанти, які є переважними, будь-які ідеї дуже вдячні!


1
Я не знайшов справді задовільного способу навігації файлами та буферами, який взагалі не використовує зовнішніх допоміжних засобів. Вбудований матеріал досить поганий (я маю на увазі перехід на буфер за його номером? Хто ходить, пам’ятаючи тимчасові номери буферів ...)
Свенд,

1
@svend: ви можете посилатися на буфери як за назвою, так і за номером - див. мою відповідь нижче
Дейв Кірбі,

Відповіді:


92

Я не вважаю деталізацію підкаталогів за допомогою простого старого надто :eгроміздкою з огляду на гідну конфігурацію для заповнення вкладки.

Зверніть увагу на 'wildmenu'опцію, щоб Vim показав список завершень (імен файлів) у моделі над командним рядком. Ви можете змінити 'wildmode'опцію для подальшого налаштування типу заповнення вкладки, який буде робити Vim.

Особисто я використовую :set wildmode=full.

Мій робочий процес такий:

  1. :cd в каталог верхнього рівня мого проекту.
  2. Щоб відкрити файл foo/bar/baz:

    • Найпростіший сценарій: тип :e f<tab>b<tab>b<tab><enter>.

    • Якщо є більш ніж один файл , починаючи з bв одному з цих каталогів , які ви , можливо , доведеться зробити <left>або <right>чи інший <tab>на клавіатурі для переходу між ними (або ж введіть декілька букв в неоднозначності).

    • У гіршому випадку існують файли та каталоги, що мають спільне ім’я, і вам потрібно детально розглянути каталог. У цьому випадку заповніть ім'я вкладки, а потім введіть, *<tab>щоб детально розгорнути.

  3. Відкрийте 2 або 3 вікна та за потреби відкрийте файли у всіх них.
  4. Коли файл відкрито в буфері, не вбивайте його. Залиште його відкритим у фоновому режимі під час відкриття нових файлів. Просто :eновий файл у тому ж вікні.
  5. Потім, використовуйте :b <tab>для перегляду буферів, які вже відкриті у фоновому режимі. Якщо ви введете текст, :b foo<tab>він буде збігатися лише з відкритими на даний момент файлами, які відповідають foo.

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

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

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


4
Порада капелюха для приголомшливого роздуму. Помахайте пальцем, щоб отримати вміння ++, вам уже потрібно зрозуміти пояснення.
Пан Бодін,

257

Найпростішим способом перегляду файлової системи є команда:

:Sex

Я цього не вигадую :)


14
і з довідки я бачу, що: Vex теж чудовий.
jrwren

15
І це має 69 голосів проти. Я не думаю, що у мене є серце це змінити.
AlbeyAmakiir

3
А :Vexякщо ви хочете розділити екран вертикально, а не горизонтально
sreenivas

1
Нічого собі, ніколи не знав жодного з них. Я знаходжу :Vexбільш практичне, але :Sexпросто зробив свій день.
Вільям Робертсон,

2
для запису :Seтеж працює (те саме для Ve, Teваріантів). Не потрібно робити це дивним :)
towc

47

:Sex, :Vex, :TexІ :Exвсе корисні команди для екс (ploring) файли на вашій системі , якщо ви хочете використовувати що - то інше від:e

(де S/V/Tскорочено для розділення / вертикалі / вкладки)


7

Якщо ви їх ще не знайшли, ви можете перевірити:

  • оригінальний плагін нечіткого пошуку - який у IIRC не має проблем із прив’язуванням Ruby
  • плагін Project - подібний до NERDTree
  • плагін провідника буферів - показує список відкритих буферів

Також майте на увазі, що ви можете перепризначити ярлики клавіш у .vimrc, щоб зробити їх менш громіздкими. Я багато використовую розділені вікна; Я виявив, що наступне значно полегшує боротьбу з ними:

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h

5

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

Вам відомі вкладки Віма? Не впевнений, чи ви мали на увазі власні вкладки Vim там, чи ви жаліли для TextMate. Незрозуміло, яку версію Vim ви використовуєте, але у неї є вкладки, принаймні з 7.0 (що, здається, останнім часом встановлюється скрізь, куди я дивлюсь), і вони чудові.

:tabeвідкриває нову (скорочення від "редагування табуляції", наприклад, :tabeдля порожньої або :tabe path/to/fileдля відкриття файлу в новій вкладці,) ви можете переходити між сусідніми вкладками за допомогою gt/ gT, і є також купа інших команд, пов'язаних з вкладками, як ви можете очікувати від Vim ( :help tabs)

Мій робочий процес для великих проектів, як правило, включає купу вкладок, кожна з яких має від 1 до 3 вікон, залежно від того, який контекст мені потрібен. Це працює навіть краще, якщо у мене є подвійне вікно терміналу, оскільки я можу вертикально розділяти :vs, тож одна вкладка може легко показати мені 4 файли одночасно з достатньо місця для кожного.

Остаточна порада: я іноді використовую команду "switch buffer" ( :sb <partial_buf_name>), яка є якоюсь подібною до нечітких знахідок TM, оскільки вона працює досить добре, але лише для вже відкритих буферів. Все ще чудово для того, коли у мене відразу відкривається десяток або більше файлів. (Примітка. Мені потрібно було :set switchbuf=usetabу своєму vimrc, щоб це працювало на різних вкладках, але коли це встановлено, це чудово.)


1
Я розумію вкладки: це більше консерватор макета, а не насправді спосіб відкрити по одному буферу на кожній вкладці (перегляньте власні погляди Брема Моленаара на вкладках у відео "7 звичок ефективного редагування тексту".
Свенд,

Потім, коли ви з’ясували такі команди, які працюють для вас, ви можете прив’язати їх до ключа. У мене є перемикання табуляції управління між відкритими буферами (а-ля firefox), але ви можете замість них перемикати вкладки.
Джонатан Хартлі

vim-titlecaseгвинти з відображенням gt / gT, але є обхід .
naught101

5

Я вважаю LustyExplorer найкращим на даний момент.

Ви можете відкрити файл, ввівши лише частину його імені.

Ви можете відкрити файл із каталогу поточного файлу, або поточного pwd, або зі списку буферів.

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

Якщо у вас є:

dir_a/
    ...
dir_b/
    file.js
    file.html

і ви хочете відкрити, dir_b/file.htmlяк правило, ви можете знайти його, набравшиb<Tab>h


Я зробив кілька розширень цього чудового аддону. svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff В основному дозволяє мені просто ввести ім'я нещодавно використаного файлу, незалежно від того, завантажений він чи ні, не має значення. Це означає, що вам потрібно переглядати FS лише тоді, коли ви вперше відкриваєте файл.
Свенд,

4

Дивно бачити, що :findкоманда не згадується в жодній з відповідей. Зазвичай я працюю з рейковими проектами, де мені потрібно детально вивчити ієрархію каталогів. Отже, для файлу application.css, розташованого у app/assets/stylesheets/всьому, що я повинен набрати, є, :find applicaа потім натисніть вкладку для автозаповнення та введіть, щоб відкрити.


3

Перевірте плагін ctrlp як альтернативу плагіну Command-T . Це краще, ніж те, що це "рідний" сценарій Vim, і йому не потрібно компілювати Vim з ruby ​​(або іншою підтримкою), хоча він працює дуже швидко і ненав'язливо.


2

Якщо потрібний файл уже завантажено в буфер (що, швидше за все, якщо ви регулярно перегортаєте кілька файлів), ви можете швидко перейти до буфера за допомогою :b[uffer]команди.

:bможе або взяти номер параметра як параметр, або (більш корисно) рядок, який відповідає частині шляху / імені файлу. Якщо є кілька збігів, ви можете використовувати вкладку, щоб переглядати їх.

Якщо ви хочете розділити вікно та відкрити буфер у новому вікні, скористайтесь :sb name

Якщо ви хочете відкрити буфер у новій вкладці, тоді скористайтеся :tab b name

Ви також можете використовувати :lsкоманду, щоб побачити список завантажених на даний момент буферів.


1

Я використовую цю функцію для пошуку файлів у підкаталогах, хоча я її не писав. Це з вікі vim :

функція! Знайти (ім'я)
    нехай l: list = system ("find. -name '" .a: name. "' | grep -v \". svn / \ "| perl -ne 'print \" $. \\ t $ _ \ "' ") 
    нехай l: num = strlen (замінник (l: список, "[^ \ n]", "", "g")) 
    якщо l: число 0 
            ехо "Не число" 
            повернення 
        endif 
        якщо l: inputl: num 
            ехо "Поза зоною дії" 
            повернення 
        endif 
        нехай l: line = matchstr ("\ n" .l: list, "\ n" .l: input. "\ t [^ \ n] *") 
    ще 
      нехай l: рядок = l: список 
    endif 
    нехай l: line = substitute (l: line, "^ [^ \ t] * \ t. /", "", "") 
    виконати ": e" .l: рядок 
кінцева функція 

команда! -nargs = 1 Знайти: виклик Знайти ("")

Мені подобається одне, що у нього є підтримка символів підстановки (*). Це також добре поводиться протягом декількох матчів.


1

На додаток до wildmenuвідповідей, я використовую плагін BufExplorer та наступні зіставлення для швидкого переходу до буферів:

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

Або ви можете просто замінити провідник буфера :lsкомандою, яка в основному відображає одне і те ж.

Останній Alt-=відображає на буфер провідник.

Я не так часто користуюся Windows, оскільки зазвичай маю лише одне або два вікна.

Я також змінив, statuslineщоб включити номер буфера %2n, так що я завжди знаю, який буфер редагується. Подивитися:h statusline




0

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

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

Тож я можу просто сказати:

: Er Main.java

і він буде шукати в підкаталогах, знаходити Main.javaта завантажувати його. Це погано поводиться для декількох файлів з однією назвою, але це швидко і просто.

Іншим інструментом, який я використовую, є VTreeExplorer , який надає деревне вікно файлів / каталогів і не вимагає спеціальних параметрів збірки від VIM (тобто це ванільний плагін).


Я хотів би мати можливість завантажувати з підкаталогу, але проблема з кількома файлами була б для мене угодами. Я розробник Django, тому я зазвичай мають купу підкаталогів , що у всіх є models.py, views.pyі т.д.
Pete

0

Мій робочий процес для пошуку файлів - це wildmenu, autocwd та :e.

Відповідні частини в .vimrc:

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

І як ним користуватися:

:e myf^D

Це дає всі файли в поточному каталозі, які починаються з myf. Ви також можете <Tab>через них. Використовуйте return, щоб відкрити :)

^Dзавжди дасть тобі всі сірники. Оскільки autocmd завжди переходить до папки поточного файлу, з якою легко працювати. Якщо ви перебуваєте, foo/bar.pyі ви хочете піти до foo/baz.pyвас, робіть лише :e baz.pyі ви там. Це також працює з буферами ( :b foo^Dперераховує всі буфери, що починаються з foo)


Як щодо переходу до інших каталогів? Наприклад, я часто працюю між моїм поданням Python, шаблоном HTML і файлами JavaScript, які всі містяться в різних підкаталогах? У TextMate я починаю вводити ім'я файлу, і відображаються всі збіги в моєму "проекті" (він же cwd).
Піт,

Це не повторюється в підпапках, ні. Але я адаптував свій робочий процес до цього. Крім того, після відкриття файлу я можу просто згадати назву буфера і все добре. Ви можете сказати Vim пам’ятати про відкриті буфери, тоді ця функція вам взагалі не потрібна.
Armin Ronacher
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.