Как открывать текстовые файлы из Finder в Terminal с помощью Neovim или Helix

Если вы активно работаете с кодом или конфигурационными файлами на macOS, наверняка сталкивались с дилеммой: удобный Finder для навигации по файлам – но необходимость переключаться в терминал для редактирования в Neovim, Helix или других консольных редакторах. Существует элегантное решение, позволяющее объединить эти миры, но стандартные скрипты иногда ведут себя нестабильно.

Давайте разберём, как создать надёжный инструмент для этой задачи, который будет работать даже при неочевидных сценариях (например, если все окна терминала закрыты).

Почему стандартные скрипты Automator подводят

Основная проблема типовых решений – зависимость от текущего окна терминала. Например, оригинальный скрипт для iTerm2 обращается к current window, что вызывает ошибку, если все окна закрыты (см. пример ниже).

Ошибка при отсутствии окон iTerm2

Кроме того, многие скрипты не учитывают, что Automator передаёт входные данные как список, а не одиночный файл. Это приводит к сбоям при обработке нескольких файлов или нестандартных путей. Решение – перейти на AppleScript-дроплет (приложение, принимающее перетаскиваемые файлы) и использовать Terminal вместо iTerm2 для большей стабильности.

Настраиваем скрипт для Terminal

Вместо Automator создадим универсальное приложение-дроплет, которое:

1. Открывает файлы через Helix/Neovim в новом окне Terminal.
2. Работает при двойном клике, перетаскивании файлов или выборе через Finder.
3. Автоматически создаёт окно терминала, если все закрыты.

Шаг 1: Создание AppleScript-приложения

1. Откройте Script Editor (встроен в macOS).
2. Вставьте следующий код, заменив hx на nvim, если используете Neovim:

use framework "Foundation"
use scripting additions

on run args
try
set selectedFiles to {}
if args is in {current application} then
set processList to (current application's NSProcessInfo's processInfo's arguments) as list
if (count processList) > 0 then set selectedFiles to rest of processList
else if args is not in {"", {}, missing value} then
set selectedFiles to args
end if
if selectedFiles is {} then
tell application "Finder" to if (get windows) is not {} then
set selectedFiles to get selection as alias list
end if
if selectedFiles is {} or (((path to me) is in selectedFiles) and ((count selectedFiles) is 1)) then
activate me
set selectedFiles to (choose file of type "public.text" with multiple selections allowed)
end if
end if
open selectedFiles
on error errmess
display alert "Error in 'run' handler" message errmess
end try
end run

on open droppedFiles
doStuff(droppedFiles)
end open

to doStuff(theFiles)
set arguments to ""
repeat with anItem in theFiles
try
if (path to me) is not in {contents of anItem, POSIX path of anItem} then
set anItem to quoted form of POSIX path of anItem
set arguments to arguments & anItem & space
end if
on error errmess
display alert "Error in 'doStuff' handler" message errmess
end try
end repeat
tell application "Terminal"
activate
do script "hx " & arguments
end tell
end doStuff

Шаг 2: Сохранение и настройка

1. В Script Editor выберите File → Export.
2. Укажите File Format: Application, сохраните в /Applications (например, TerminalEditor.app).
3. Для удобства перетащите приложение на панель инструментов Finder: откройте любую папку, зажмите ⌘ и перетяните иконку приложения в правую часть панели.

Как это работает: разбор ключевых элементов

  • Обработка разных сценариев: скрипт корректно работает при двойном клике на файл, перетаскивании на приложение или выборе через панель Finder.
  • do script “hx ” & arguments – команда, которая открывает новый терминал и запускает редактор с указанными файлами. Если Terminal уже работает, создаётся новая вкладка.
  • quoted form of POSIX path – экранирование пробелов и спецсимволов в путях файлов (чтобы не возникало ошибок типа No such file or directory).

Возможные проблемы и их решение

1. Редактор не запускается:

– Убедитесь, что Helix или Neovim установлены через Homebrew (brew install helix neovim).
– Проверьте наличие hx или nvim в переменной $PATH. Для теста выполните в терминале:

which hx

Должно вернуть путь, например: /usr/local/bin/hx

2. Файлы открываются в другом редакторе:

– В macOS могут перехватываться ассоциации файлов. Настройте принудительное открытие через созданное приложение:
– Выберите файл .txt → ⌘+I → в разделе “Open with” выберите TerminalEditor.app → Change All.

3. Скрипт не видит файлы из Finder:

– Если вы добавляете приложение на панель Finder, убедитесь, что предварительно выделили файлы (скрипт получает текущее выделение через get selection as alias list).

Дополнительные настройки для продвинутых пользователей

  • Работа с несколькими файлами: скрипт поддерживает множественное выделение – все выбранные файлы откроются в одном окне Helix/Neovim.
  • Интеграция с другими типами файлов: чтобы редактировать, например, Markdown (.md), измените в коде public.text на public.md-text или добавьте дополнительные типы через запятую.
  • Запуск из командной строки: приложение можно вызвать через open -a TerminalEditor.app file.txt, что полезно для создания псевдонимов в .zshrc или .bashrc.

Альтернатива: быстрый хоткей для текущего файла

Если не хотите создавать приложение, используйте этот сокращённый скрипт для Automator (но учтите, он менее стабилен при закрытых окнах Terminal):

on run {input}
set filePath to quoted form of POSIX path of (input as text)
tell application "Terminal"
activate
do script "nvim " & filePath
end tell
end run

Сохраните его как «Быстрое действие», назначьте сочетание клавиш в System Settings → Keyboard → Shortcuts, и вызывайте через ⌘+Shift+[ваша_клавиша] при выделении файла в Finder.

Подводя итог: предложенное решение устраняет главные боли при работе с текстовыми файлами в macOS – переключение между графическим и терминальным интерфейсами, зависимость от состояния терминала и ограничения Automator. Если вы столкнётесь с неочевидными ошибками, проверьте пути к редактору и права доступа к файлам – чаще всего проблема именно в этом. Буду рад, если вы поделитесь своим опытом использования в комментариях!

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное