Ярлык для открытия файла в Vim


123

Я хочу открыть файл в Vim, как в Eclipse, с помощью Ctrl+ Shift+ Rили с помощью Ctrl+N опции автозаполнения. Вызовите сочетание клавиш, введите имя / шаблон файла и выберите из всех совпадающих имен файлов.

Я знаю, как обычно открывать его:

:tabe <filepath>
:new <filepath>
:edit <filepath>

Проблема здесь в том, что в этих случаях я должен указывать полный путь к файлу.


1
Обратите внимание, что предлагаемые команды имеют разный эффект: :tabeфайл открывается в новой вкладке, :newокно разделяется по горизонтали, а :editтекущий файл закрывается перед открытием нового.
Скиппи ле Гран Гуру,

Ответы:


61

Недавно я влюбился в fuzzyfinder.vim ... :-)

: FuzzyFinderFile позволит вам открывать файлы, вводя частичные имена или шаблоны.


141

Обычно я делаю e .(e-space-dot), который дает мне доступный для просмотра текущий каталог - тогда я могу /- искать фрагменты имени, точно так же, как поиск слова в текстовом файле. Я считаю, что в целом это достаточно хорошо, просто и быстро.


22
Вам не нужно место, что позволяет сэкономить 25% на вводе текста. ( :e.).
Конрад Рудольф

67
Точка не нужна, если вы используете заглавную
букву

2
@drozzy Это происходит с vim :-)
DerMike 04

7
Существует разница в поведении между :e.и :E: если текущий файл был отредактирован и еще не сохранен, первый будет жаловаться (например :edit) из-за «нет записи с момента последнего изменения», а последний разделит окно по горизонтали (например, :new), чтобы разрешить открытие нового файла (в то время как оба заменят текущий файл новым файлом, если он не был изменен (например :edit)).
Скиппи ле Гран Гуру,

1
Если вы откроете файл, а затем замените его вторым файлом, вы можете вернуться к первому, используя «e #»
dkretz

33

:find это еще один вариант.

Я открываю vim из корня моего проекта и pathустанавливаю его там.

Затем я могу открывать файлы, расположенные в любом месте дерева, используя:

:find **/filena< tab >

Вкладка будет автоматически заполняться при различных совпадениях. ( **указывает ему рекурсивный поиск по пути).


Я не считаю полезным :findполучить путь относительно рабочего каталога. См. Вопрос и ответ @romainl здесь: stackoverflow.com/questions/28224168/… . Я нахожу более интересный ответ @strager, чтобы упростить путь относительно рабочего каталога.
ziiweb

25

Вы можете искать файл по текущему пути, используя **:

:tabe **/header.h

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


Я пробовал использовать это, но это очень медленно. Я имею в виду, что мое приложение большое, и редактор на какое-то время перестал работать. Знаете ли вы какие-либо настройки для увеличения производительности и скорости работы редактора.
Techmaddy

1
Хороший ответ. Используйте что-нибудь вроде, :tabe **/*der.hесли вы не помните полное имя файла.
ziiweb

16

Рассмотрите возможность использования подключаемого модуля CtrlP .

Он включен в дистрибутив Janus .

Позволяет находить файлы в текущем каталоге, открытых буферах или недавно использованных файлах с помощью «нечеткого соответствия» или регулярного выражения.


1
на самом деле я использую его как часть дистрибутива Janus.
Алексей

Исходное репо CtrlP неактивно, но есть активный форк
jpyams

12

если я чего-то не упускаю,: e filename - самый быстрый способ, который я нашел.

Вы также можете использовать вкладку для автозаполнения имени файла.


@dirkgently, это так. Это все еще ярлык, как следует из названия этого вопроса, но я не думаю, что это то, что ищет спрашивающий.
Strager

У меня автозаполнение вкладок не работает для: e. Кроме того, вы не всегда хотите искать имя файла, которое начинается с чего-то, а скорее искать среднее слово в имени файла.
Андрей Дроздюк


9

Я использую несколько ярлыков в моем файле .vimrc (точный синтаксис ниже).

Они основаны на том факте, что в 90% случаев я хочу открыть другой файл в том же каталоге, что и файл, который я сейчас редактирую, или в каталоге, который очень близок по иерархии к этому редактируемому файлу.

Вот что делают команды:

,cd : Изменить текущий рабочий каталог на каталог, в котором находится текущий файл, который вы редактируете.

,e: Открывает файл с уже заполненным текущим рабочим каталогом, поэтому вам нужно указать только имя файла.

Поместите их в свой .vimrc:

map ,e :e <C-R>=expand("%:p:h") . "/" <CR>

map ,cd :cd %:p:h <CR>

Вот последовательность событий:


  1. Вы редактируете файл test.java в "/ home / prog"
  2. ,cd -> Текущий рабочий каталог теперь становится "/ home / prog"
  3. ,e -> Расширяется до ": e / home / prog", так что вы можете просто ввести имя файла, скажем test.h.

  1. ,e -> Заменяется на ": e / home"
  2. tab -> Перебирать подкаталоги / home
  3. enter -> cd в каталог, который вы хотите сказать / home / prog
  4. ,e -> Расширяется до ": e / home / prog"

8

Также есть command-t, которую я считаю лучшей из всех (и я перепробовал их все). Установить его несложно, но после того, как он установлен, им можно только мечтать.

https://wincent.com/products/command-t/


1
Вы также можете попробовать ctrlp.vim ( github.com/kien/ctrlp.vim ). Это в основном то же, что и Command-T, но написано на чистом Vimscript. (ИМХО, его тоже проще использовать)
datentyp

6

Используйте вкладки, они работают при вводе путей к файлам в escape-режиме vim!


4

Если у вас есть теги (а должны), вы можете открыть файл из командной строки, просто указав имя класса, метода или функции c, с помощью «vim -t DBPlaylist», а внутри vim с помощью «: tag ShowList ».


4

Если вы редактируете файлы в общем каталоге, вы можете :cdперейти в этот каталог, а затем использовать:e только имя файла.

Например, а не:

:e /big/long/path/that/takes/a/while/to/type/or/tab/complete/thingy.rb
:sp /big/long/path/that/takes/a/while/to/type/or/tab/complete/other_thingy.c
:vs /big/long/path/that/takes/a/while/to/type/or/tab/complete/one_more_thingy.java

Ты можешь сделать:

:cd /big/long/path/that/takes/a/while/to/type/or/tab/complete/
:e thingy.rb
:sp other_thingy.c
:vs one_more_thingy.java

Или, если у вас уже есть файл в нужном каталоге, вы можете использовать %сокращение для текущего имени файла и обрезать его до текущего каталога с помощью :hмодификатора ( :help :_%:):

:e /big/long/path/that/takes/a/while/to/type/or/tab/complete/thingy.rb
:cd %:h
:sp other_thingy.c
:vs one_more_thingy.java

И, как говорили другие, вы можете заполнить имена файлов табуляцией в строке ex-line (см. :help cmdline-completion Подробнее).


4

Это не совсем так то, что вы ищете, но во многих случаях (хотя и не во всех) это хорошо.

Если вы открываете VIM и в буфере есть имя файла, вы можете поместить курсор на это имя файла и ввести его gf. Это открывает файл, имя которого находится под курсором в том же буфере. Это то же самое, что и

:e CTRL+r CTRL+w


1
Я нажал gf, и теперь я открыл новый файл, находящийся под курсором. Теперь как вернуться к исходному файлу. !!
vrbilgi

@ user430294: он открыт в другом буфере. Use:b oldname
Натан Феллман

@vrbilgi, используйте Ctrl + o, чтобы вернуться к ранее отредактированному файлу. Используйте Ctrl + i, чтобы снова перейти к файлу, из которого вы вернулись.
Беров

3

Я знаю три плагина, которые позволяют открывать файлы, поддерживают автозаполнение и не требуют вводить полный путь к открываемым файлам (если файлы находятся в одном из каталогов из &pathопции vim) :

Недавно я видел другой плагин с похожей функцией, но не помню названия.

Вскоре: find, вероятно, будет поддерживать автозаполнение - в наши дни в списке рассылки vim_dev циркулируют исправления по этой теме.


1
  • вы можете использовать (установить wildmenu)
  • вы можете использовать вкладку для автозаполнения имен файлов
  • вы также можете использовать сопоставление, например: e p*.datили что-то в этом роде (как в старых 'dos)
  • вы также можете: просмотреть подтвердить e (для графического окна)

  • но вы также, вероятно, должны указать, какую версию vim вы используете, и как это работает в emacs. Может быть, мы сможем найти вам точную альтернативу vim.


1

Был упомянут FuzzyFinder, однако мне нравится поведение FuzzyFinderTextmate, похожее на textmate. плагина которое расширяет поведение и включает все подкаталоги.

Убедитесь, что вы используете версию 2.16 fuzzyfinder.vim - более поздние версии нарушают работу плагина.


1

С Exuberant ctags вы можете создавать файлы тегов с информацией о файлах:

ctags --extra=+f -R *

Затем откройте файл из VIM с помощью

:tag filename

Вы также можете использовать <tab>для автозаполнения имени файла.


1

В GVIM файл можно просматривать с помощью диалогового окна открытия / чтения / записи;

:browse {command}

{command} - открыть / прочитать / написать

open - Открывает чтение файла - Добавляет запись файла - Диалог Сохранить как


0

Я установил FuzzyFinder. Однако ограничение заключается в том, что он находит файлы только в текущем каталоге. Одним из способов решения этой проблемы является добавление FuzzyFinderTextmate. Однако, судя по документации и комментариям, это не работает надежно. Вам нужна правильная версия FuzzyFinder и ваша копия Vim, которая будет скомпилирована с поддержкой Ruby.

Другой способ обхода, который я сейчас пробую, - открыть все файлы, которые мне могут понадобиться в начале сеанса редактирования. Например, откройте все файлы в ключевых каталогах ...

:args app/**
:args config/**
:args test/**
etc...

(Это означает, что у меня, возможно, было бы открыто множество файлов, но пока все еще работает нормально.)

После этого я могу использовать FuzzyFinder в буферном режиме, и он будет действовать как command-oярлык TextMate ...

:FuzzyFinderBuffer

Вы уверены? У меня есть конфигурация в моем .vimrc, ищите "g: fuf_abbrevMap". Должно быть, я нашел пример в документации. Когда я набираю ярлык, я затем набираю аббревиатуру, например, «web:», и он будет искать все файлы в папке по моему выбору. Моя проблема на самом деле в том, что по какой-то причине он больше не открывает файлы, вместо этого я вижу [НОВЫЙ СПРАВОЧНИК] в строке состояния. Но у меня такая же проблема с: o, похоже, не имеет отношения к fuf.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.