Связанный с 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
). Если есть решение, которое также включает их (по сути, передает задачи, связанные с оболочкой, в оболочку, которая делает это очень хорошо), это было бы замечательно.
Ответы:
Раньше я использовал CtrlP и другие связанные плагины ранее, пока я действительно не открыл нативные возможности vim. Позвольте мне объяснить несколько способов сделать это, не требуя внешнего плагина:
:e
, хорошая вещь в том, что вы можете сделать что-то вроде,:e /u*/s*/m*/m*/<Tab>
и vim автоматически расширит это:e /usr/share/man/man
. Это намного короче и проще, чем то, что вы опубликовали, но еще лучше сделать так:e /usr/**/man<Tab>
, чтобы он выглядел рекурсивно/usr
и отображал все подходящие пути, хотя это может занять некоторое время, в зависимости от размера набора, но в Спроектировать это работает чудеса, потому что вы можете сделать что-то вроде,:e ap**/jav**/user<Tab>
и он завершит все неполные пути и даст вам список подходящих путей и работает очень хорошо.:b
, Чтобы открыть существующие буферы. Это действительно мощный инструмент, потому что он принимает партиалы по умолчанию, так что вы можете просто сделать что-то вроде этого,:b usr*man<Tab>
и он завершит имя файла, если он уже был загружен в список буферов. Это особенно хорошо, потому что это почти мгновенно и очень быстро. Также я интенсивно использую сессии vim с помощью tpope / vim-obsession и dhruvasagar / vim-prosession , которые хранят все файлы, которые я открываю, в списке буферов, и они доступны, даже если я существую vim и возвращаюсь к нему из каталог проекта.источник
/u*/s*/m*/m*/<Tab>
Так я привык обходить Bash. Это не замена Zsh на милю./usr/**/man<Tab>
работает ужасно медленно, когда у вас открыта вся файловая система, но может быть полезно для небольших проектов. Если я не понимаю:b
, это не для открытия новых файлов.**
действительно ужасно медленно, но хорошо работает для обычных проектов.:b
для существующего открытого буфера, поэтому использование сессий помогает.vim-zsh-путь-завершение подразумевает выполнение именно того, о чем вы просите (по крайней мере, первую часть), но я никогда не пробовал. (Я даже не слышал об этом, пока romainl не связался с SO-ответом его автора , хотя в его документации также упоминаются некоторые ограничения.
В дополнение к этому есть различные средства поиска нечетких файлов, которые достигают чего-то похожего при открытии файлов.
Мой любимый плагин для этого - CtrlP . Когда он используется для открытия файлов, он ищет любые файлы, полные пути которых содержат символы, которые вы вводите в правильном порядке - вам не нужно вводить части каждого компонента пути (и всех разделителей пути), как вы есть в вашем примере, но это прекрасно работает, если вы делаете. Он также использует тот же интерфейс для открытия недавно использованных файлов и открытых в настоящее время буферов, и многое другое.
По умолчанию он отображается
<c-p>
в обычном режиме, чтобы открыть приглашение CtrlP. В подсказке отображается список файлов, который сужается при вводе символов. Вы можете нажать Enterв любой момент, чтобы открыть текущий выбранный файл, или использовать<c-k>
и<c-j>
для перемещения выбора вверх и вниз по списку подходящих файлов.Другой популярной альтернативой является Command-T , но я предпочитаю CtrlP, потому что он реализован в VimScript; Command-T имеет компонент Ruby.
источник