Вопрос или проблема
Мой типичный рабочий процесс включает большое «основное» окно, с меньшим окном внизу для терминала. Когда я получаю трассировку стека, я хочу иметь возможность использовать gf
, чтобы перейти к этому месту в основном окне.
Однако gf
откроет его в том же окне, что и терминал. Существуют другие варианты, например <C-w>f
, но они создают новые окна. Вместо этого я хочу иметь возможность открыть этот путь к файлу в «другом окне».
Мне трудно выразить концепцию «другого окна» так, чтобы её понял (neo)vim.
Я знаю, что это уже поздно, но, может быть, вы можете настроить переназначение с обнаружением терминала? чтобы использовать альтернативный буфер (то, что вы переключаете с <C-^>).
Правка: На данный момент у меня есть это урезанное решение:
function! SmartGF(cmd)
if getbufvar('%', '&buftype') !=# 'terminal' || bufnr('#') == bufnr('%') || getbufvar('#', '&buftype') ==# 'terminal'
execute "normal! " . a:cmd
return
endif
let l:term_buffer = bufnr('%')
let l:term_cursor = getcurpos()
call win_gotoid(bufwinid('#'))
execute "noautocmd buffer " . l:term_buffer
call setpos('.', l:term_cursor)
execute "keepjumps normal! " . a:cmd
endfunction
nnoremap gf :call SmartGF('gf')<CR>
nnoremap gF :call SmartGF('gF')<CR>
xnoremap gf :<C-u>call SmartGF('gf')<CR>
xnoremap gF :<C-u>call SmartGF('gF')<CR>
- C-Wgf – Редактировать существующий файл под курсором в новой вкладке
Это может подойти, но у меня закрывает терминал
Ответ или решение
Теория
Neovim и Vim зачастую используются разработчиками для повышения эффективности в разработке программного обеспечения. Одной из ключевых причин популярности этих текстовых редакторов является их высокая настраиваемость и возможность автоматизации задач. Команда gf
(goto file
) в Vim позволяет пользователю быстро переходить к файлу, путь к которому указан под курсором. Однако, по умолчанию, файл открывается в текущем сплите, что может быть неудобно, если текущий сплит используется для чего-то другого, например, терминала.
Проблема, озвученная в вопросе, заключается в необходимости открыть файл из следа стека в основном сплите, не закрывая текущую сессию терминала и не создавая новых окон, что могло бы привести к нежелательно сложной компоновке окон. Стандартные подходы, такие как <C-w>f
, открывают файл в новом сплите, но это не всегда желательно. Таким образом, возникает задача разработки собственного решения, которое будет учитывать открытые сплиты и позволит открыть файл в уже существующем сплите, подходящем для выполнения основной работы.
Пример
Пользователь представил функцию на Vimscript, которая решает вышеописанную задачу с помощью проверки типов буферов и переключения между ними. Она работает следующим образом:
-
Проверка типа текущего буфера: Если активный буфер не является терминалом или если предыдущий буфер был также терминалом, то следующим шагом будет выполнение стандартной команды
gf
. -
Сохранение состояния терминала: Если текущий буфер является терминальным, скрипт сохраняет идентификатор и позицию курсора терминального буфера.
-
Переключение на другой сплит: Используя идентификатор окна для предыдущего буфера, функция перемещается в это окно и оттуда выполняет команду
gf
, открывая файл по указанному пути. -
Восстановление состояния терминала: После открытия нового файла скрипт переключается назад к терминальному буферу и восстанавливает его состояние.
Применение
Создание решения, адаптированного под нужды пользователя, требует понимания работы с буферами и окнами в Neovim. Вот более подробно структурированное объяснение подходов к реализации данной функции с учётом профессиональной практики:
-
Инициализация скрипта: В процессе настройки своего редактора вы можете добавить предложенный скрипт в конфигурационный файл
init.vim
для автоматического применения изменений. -
Настройка команды
SmartGF
: Основываясь на предложенном коде, вы можете модифицировать скрипт, чтобы он имел опциональную поддержку дополнительных функций, таких как сохранение состояния всех открытых буферов или продолжение работы без потери состояния терминала после возврата в него. -
Обработка уникальных сценариев: Пока текущий скрипт предоставляет базовую функциональность, он может быть дополнен обработкой дополнительных сценариев, таких как открытие патчей, которые требуют от пользователя предварительного выбора с учетом многострочных путей.
-
Обратная связь и доработка: Как и с любым другим пользовательским решением, получение обратной связи по поведению скрипта в реальных условиях использования позволит выявить потенциальные улучшения и оптимизации для точного соответствия рабочему процессу разработчика.
Таким образом, подход к решению проблемы "gf аналог в соседнем, существующем сплите" достигается тонким сочетанием навыков работы со скриптами Vim и опытного понимания архитектуры Neovim. Надлежащая настройка таких команд с использованием индивидуальных функций может значительно упростить повседневные задачи разработчиков, улучшаю гибкость рабочего процесса и минимизируя потери времени на управление окнами.