Навигация по файлам 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
Совет за потрясающие пояснения. Помахать пальцем для skillz ++ вам уже нужно, чтобы понять объяснение.
Mr. Baudin

258

Простой способ просмотреть файловую систему - это команда:

:Sex

Я не выдумываю :)


15
и по справке я вижу, что Vex тоже великолепен.
jrwren

16
И это имеет 69 голосов. Не думаю, что у меня хватит духу это изменить.
AlbeyAmakiir

3
И :Vexесли вы хотите разделить экран по вертикали, а не по горизонтали
sreenivas

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

2
для записи :Seтоже работает (то же самое для Ve, Teвариантов). Не нужно делать это странным :)
Towc

46

:Sex, :Vex, :TexИ :Exвсе полезные команды для экс (ploring) файлы на вашей системе , если вы хотите использовать что - то другое от:e

(где S/V/Tсокращение от Split / Vertical / Tab)


7

Если вы еще не нашли их, вы можете проверить:

  • оригинальный плагин нечеткого поиска - у которого IIRC нет проблем с привязкой Ruby
  • плагин Project - похож на NERDTree
  • плагин Buffer Explorer - показывает список открытых буферов

Также имейте в виду, что вы можете переназначить сочетания клавиш в своем .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? Не уверен, что вы имели в виду вкладки Vim или тосковали по вкладкам TextMate. Неясно, какую версию Vim вы используете, но у нее были вкладки, по крайней мере, начиная с 7.0 (которая, кажется, установлена ​​везде, куда я смотрю в последнее время), и они потрясающие.

:tabeоткрывает новую (сокращенно от "tab edit", например, :tabeдля пустого или :tabe path/to/fileдля открытия файла на новой вкладке) вы можете перемещаться между соседними вкладками с помощью gt/ gT, а также есть множество других навигационных команд, связанных с вкладками, например вы могли ожидать от Vim ( :help tabs)

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

Последний совет: я иногда использую команду «переключить буфер» ( :sb <partial_buf_name>), которая в некотором роде похожа на нечеткий поиск TM, в том смысле, что она работает очень хорошо, но только для уже открытых буферов. По-прежнему отлично подходит, когда у меня одновременно открыто несколько или более файлов. (NB, мне нужно было :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 В основном позволяет мне просто ввести имя недавно использованного файла, независимо от того, загружен он уже или нет, не имеет значения. Это означает, что вам нужно просматривать файловую систему только при первом открытии файла.
Svend

4

Удивительно видеть, что эта :findкоманда не упоминается ни в одном из ответов. Я обычно работаю с проектами rails, где мне нужно углубиться в иерархию каталогов. Итак, для файла 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 :

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

команда! -nargs = 1 Find: вызвать Find ("")

Что мне нравится, так это поддержка подстановочных знаков (*). Он также хорошо себя ведет для нескольких матчей.


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>через них. Используйте возврат, чтобы открыть :)

^Dвсегда даст вам все совпадения. Поскольку autocmd всегда попадает в папку текущего файла, с ним легко работать. Если ты внутри foo/bar.pyи хочешь пойти к foo/baz.pyтебе, сделай только :e baz.pyи ты там. Это также работает с буферами ( :b foo^Dперечисляет все буферы, начинающиеся с foo)


Как насчет перехода в другие каталоги? Например, я часто работаю между представлением Python, шаблоном HTML и файлами JavaScript, которые находятся в разных подкаталогах? В TextMate я начинаю вводить имя файла, и появляются все совпадения в моем «проекте» (он же cwd).
Пит,

Он не рекурсивно попадает в подпапки, нет. Но я приспособил к этому свой рабочий процесс. Кроме того, как только я открываю файл, я могу просто указать имя буфера, и все в порядке. Вы можете сказать Vim, чтобы он запомнил открытые буферы, тогда эта функция вам обычно не нужна.
Армин Ронахер,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.