Zsh-подобная вкладка завершения частичных путей

11

Связанный с Bash-подобным частичным табулированием для имен файлов в Vim

Одной из действительно фантастических особенностей zshявляется то, что вы можете, например, набирать текст ls /u/s/m/m/who.1, нажимать на него Tabи выполнять его полностью ls /usr/share/man/man1/who.1.gz. Как только вы привыкните к нему, вам будет очень неудобно возвращаться к нему /u<tab>/s<tab>/m<tab>/m<tab>..., особенно когда весь частичный путь может быть разрешен только к одному фактическому пути, но каждый отдельный компонент может иметь несколько завершений. Может ли это быть достигнуто в Vim, например, при использовании :eили :cd?

В zsh есть и другие полезные функции, связанные с путями, например, использование cd foo barдля перехода к эквивалентному пути с fooзаменой на bar(то есть, /blah/foo/baz/yadaстановится /blah/bar/baz/yada). Если есть решение, которое также включает их (по сути, передает задачи, связанные с оболочкой, в оболочку, которая делает это очень хорошо), это было бы замечательно.

Мур
источник
1
Я не знаю ничего, что позволяет достичь именно того, о чем вы просите, но есть различные средства поиска нечетких файлов, которые позволяют открывать файлы аналогичным образом. Я предпочитаю CtrlP, но есть также Command-T, и я уверен, что есть другие, которые я забыл имя.
Богатый
1
@ Rich Пока мне не придется пюре из Таба дюжину раз, я буду счастлив.
Муру
Уже есть похожий вопрос по SO.
Ромен

Ответы:

6

Раньше я использовал CtrlP и другие связанные плагины ранее, пока я действительно не открыл нативные возможности vim. Позвольте мне объяснить несколько способов сделать это, не требуя внешнего плагина:

  1. :e, хорошая вещь в том, что вы можете сделать что-то вроде, :e /u*/s*/m*/m*/<Tab>и vim автоматически расширит это :e /usr/share/man/man. Это намного короче и проще, чем то, что вы опубликовали, но еще лучше сделать так :e /usr/**/man<Tab>, чтобы он выглядел рекурсивно /usrи отображал все подходящие пути, хотя это может занять некоторое время, в зависимости от размера набора, но в Спроектировать это работает чудеса, потому что вы можете сделать что-то вроде, :e ap**/jav**/user<Tab>и он завершит все неполные пути и даст вам список подходящих путей и работает очень хорошо.
  2. :b, Чтобы открыть существующие буферы. Это действительно мощный инструмент, потому что он принимает партиалы по умолчанию, так что вы можете просто сделать что-то вроде этого, :b usr*man<Tab>и он завершит имя файла, если он уже был загружен в список буферов. Это особенно хорошо, потому что это почти мгновенно и очень быстро. Также я интенсивно использую сессии vim с помощью tpope / vim-obsession и dhruvasagar / vim-prosession , которые хранят все файлы, которые я открываю, в списке буферов, и они доступны, даже если я существую vim и возвращаюсь к нему из каталог проекта.
Дхрува Сагар
источник
1
/u*/s*/m*/m*/<Tab>Так я привык обходить Bash. Это не замена Zsh на милю. /usr/**/man<Tab>работает ужасно медленно, когда у вас открыта вся файловая система, но может быть полезно для небольших проектов. Если я не понимаю :b, это не для открытия новых файлов.
Муру
@muru вы правы, это не замена zsh, но это все же лучше, чем вводить текст самостоятельно, это сделать его проще, **действительно ужасно медленно, но хорошо работает для обычных проектов. :bдля существующего открытого буфера, поэтому использование сессий помогает.
Дхрува Сагар
5

vim-zsh-путь-завершение подразумевает выполнение именно того, о чем вы просите (по крайней мере, первую часть), но я никогда не пробовал. (Я даже не слышал об этом, пока romainl не связался с SO-ответом его автора , хотя в его документации также упоминаются некоторые ограничения.

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

Мой любимый плагин для этого - CtrlP . Когда он используется для открытия файлов, он ищет любые файлы, полные пути которых содержат символы, которые вы вводите в правильном порядке - вам не нужно вводить части каждого компонента пути (и всех разделителей пути), как вы есть в вашем примере, но это прекрасно работает, если вы делаете. Он также использует тот же интерфейс для открытия недавно использованных файлов и открытых в настоящее время буферов, и многое другое.

По умолчанию он отображается <c-p>в обычном режиме, чтобы открыть приглашение CtrlP. В подсказке отображается список файлов, который сужается при вводе символов. Вы можете нажать Enterв любой момент, чтобы открыть текущий выбранный файл, или использовать <c-k>и <c-j>для перемещения выбора вверх и вниз по списку подходящих файлов.

Другой популярной альтернативой является Command-T , но я предпочитаю CtrlP, потому что он реализован в VimScript; Command-T имеет компонент Ruby.

Богатые
источник