Ім'я файлу / шлях завершення Vim


11

Я знаю, що можу заповнити назви файлів / шляхів із поточного каталогу за допомогою ctrl + x, ctrl + f ( compl-filename). Це чудово працює в поєднанні з набором autochdir, який змінює оновлення поточної каталогів до каталогу активного буфера.

Однак я почав використовувати airblade/vim-rooterдля того, щоб зробити поточний каталог папкою "project". Тепер завершення назви файлів завжди починається з папки проекту.

Питання: Чи є спосіб змусити завершення імені використовувати каталог активного буфера замість поточного каталогу? Або якесь інше рішення?

Також запитують у stackoverflow


5
C-xC-f завжди використовує робочий каталог поточного буфера, не маючи жодних параметрів для його налаштування (він також не підтримує path). Це залежить від того, яке призначення ви використовуєте для vim-rooter. Залежно від того, що ви хочете від нього, ми можемо використовувати інші плагіни. Убік: я використовую youcompleteme, який завершує шляхи з каталогу поточного буфера, якщо ви почнете вводити текст ./. Дивіться reddit.com/r/vim/comments/216jdd/…
muru

Відповіді:


7

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

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

Слон

З невідомих мені навіть причин я назвав цей мікроплагін Elephant .

Ось код (скопійований з мого конфігурації Vim на GitHub ):

let g:elephant_map = {
    \ 'f': function('elephant#current_file'),
    \ 'p': function('elephant#vcs_project')
\ }

function! elephant#prompt(base)
    let l:Fcn = get(g:elephant_map, a:base, function('elephant#identity'))
    let l:basedir = l:Fcn()
    execute 'lcd' l:basedir
    let l:file = fnamemodify(input(l:basedir.'/', '', 'file'), ':p')
    lcd -
    return fnamemodify(l:file, ':.')
endfunction

function! s:elephant_init()
    let l:base = getchar()
    return elephant#prompt(nr2char(l:base))
endfunction

function! elephant#identity()
    return '.'
endfunction

function! elephant#vcs_project()
    return fnamemodify(finddir('.git', '.;'), ':h')
endfunction

function! elephant#current_file()
    return expand('%:h')
endfunction

inoremap <silent> <expr> <C-R><C-E> <SID>elephant_init()
cnoremap <silent> <C-R><C-E> <C-R>=<SID>elephant_init()<CR>

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

Використання цих відображень відбувається в 3 етапи.

1. Викликати картування

У режимі "Вставка" або "Командний рядок" викликайте відображення за допомогою <C-R><C-E>.

2. Виберіть каталог

Введіть один символ, щоб вибрати, з якого кореневого каталогу ви хочете завершити. Код, наведений вище, містить два типи коренів:

  • f - Каталог, у якому знаходиться поточний файл (буфер)
  • p - Базова директорія проекту Git, до якого належить поточний файл

3. Введіть шлях або ім'я файлу

Вам буде запропоновано ввести шлях або ім'я файлу щодо вказаного каталогу, із завершенням. Натисніть, Enterколи закінчите.

Деякі примітки

  • Це не забезпечує завершення вбудованого режиму в режимі вставки <C-X><C-F>; натомість ви будете вводити шлях або ім'я файлу в командному рядку (куди :йдуть команди). Після натискання Enterшлях буде вставлений у буфер.
  • Те саме стосується режиму командного рядка, який іноді може бути заплутаним, коли ви натискаєте Enterта забуваєте, що вам все одно доведеться натиснути, Enterщоб видавати будь-яку команду, яку ви тільки що вводили.
  • Інші функції каталогів можна зареєструвати, додавши їх у g:elephant_map.
  • Вставлений шлях буде повним, абсолютним шляхом. Сценарій можна налаштувати, щоб змінити таку поведінку, але я цього не обійшов.

Не дуже перевірили рішення, але прийняли його через повноту. Натомість я скористався запропонованим рішенням: YouCompleteMe замість ctrl + x, ctrl + f.
Рафаель Барбоса
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.