$ sudo teach IT
Модуль 6 · Интеграция

Интеграция с редакторами

Ruff прямо в редакторе — подчёркивания ошибок, автоисправление и форматирование при сохранении.

🔌 Интеграция 🕓 ~20 минут
💡 Что даёт интеграция с редактором:
  • Подсветка ошибок прямо во время набора кода
  • Автоисправление при сохранении файла
  • Автоформатирование
  • Code actions (быстрые исправления)
  • Сортировка импортов одной командой
💻

LSP сервер Ruff

Ruff включает встроенный Language Server Protocol (LSP) сервер. Это значит, что любой редактор с поддержкой LSP может использовать Ruff для подсветки ошибок, автодополнения и рефакторинга.

Сервер называется ruff server и запускается автоматически редактором при открытии Python-файлов:

# Запустить LSP-сервер вручную (обычно это делает редактор)
ruff server

Что умеет ruff server:

  • Diagnostics — подсветка ошибок и предупреждений
  • Code actions — быстрые исправления (fix, ignore, show docs)
  • Formatting — форматирование документа
  • Hover — показывает описание правила при наведении
  • Code lenses — запуск Ruff из интерфейса
💡 Совет: Сервер автоматически читает ваш pyproject.toml или ruff.toml. Не нужно указывать путь к конфигу — достаточно, чтобы файл лежал в корне проекта.
💙

VS Code (Visual Studio Code)

Установка расширения

Установи официальное расширение Ruff от Astral Software:

  • Открой VS Code
  • Перейди в Extensions (Ctrl+Shift+X)
  • Найди "Ruff" от Astral Software (ID: charliermarsh.ruff)
  • Нажми Install

Также можно установить через командную строку:

code --install-extension charliermarsh.ruff

Настройка для проекта (.vscode/settings.json)

Создай файл .vscode/settings.json в корне проекта:

{
  "[python]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "charliermarsh.ruff",
    "editor.codeActionsOnSave": {
      "source.fixAll.ruff": "explicit",
      "source.organizeImports.ruff": "explicit"
    }
  },
  "ruff.lint.enable": true,
  "ruff.format.enable": true,
  "ruff.organizeImports": true
}

Что делает каждая настройка:

Настройка Что делает
formatOnSaveФорматирование при сохранении
defaultFormatterКакой форматтер использовать для Python
source.fixAll.ruffАвтоисправление безопасных ошибок при сохранении
source.organizeImports.ruffАвтосортировка импортов при сохранении
ruff.lint.enableВключить линтинг через расширение
ruff.format.enableВключить форматирование через расширение

Глобальные настройки VS Code

Чтобы Ruff работал во всех Python-проектах по умолчанию, добавь в глобальный settings.json (Ctrl+Shift+P — "Open User Settings JSON"):

{
  "[python]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "charliermarsh.ruff"
  },
  "ruff.lint.enable": true,
  "ruff.format.enable": true,
  "ruff.organizeImports": true,
  "ruff.codeAction.disableRuleComment": {
    "enable": true
  },
  "ruff.nativeServer": true
}
⚠️ Важно: Настройка "ruff.nativeServer": true включает встроенный LSP-сервер Ruff (рекомендуется). Если отключить, расширение будет запускать ruff check для каждого файла отдельно, что медленнее.

Дополнительные настройки VS Code

{
  // Путь к исполняемому файлу ruff
  "ruff.path": ["/path/to/ruff"],

  // Аргументы командной строки для ruff
  "ruff.args": [],

  // Игнорировать файлы по шаблону
  "ruff.ignorePatterns": ["**/migrations/**"],

  // Показывать только предупреждения (не ошибки)
  "ruff.lint.run": "onType",  // или "onSave"

  // Размер кэша для LSP
  "ruff.trace.server": "off"  // "messages" для отладки
}

Быстрые клавиши VS Code

Действие Комбинация
Форматировать файлShift+Alt+F
Быстрое исправлениеCtrl+.
Сортировка импортовShift+Alt+O
Показать все ошибкиCtrl+Shift+M
🧠

PyCharm (и другие IDE JetBrains)

Способ 1: Плагин Ruff

В PyCharm есть официальный плагин Ruff:

  1. Открой Settings → Plugins → Marketplace
  2. Найди "Ruff"
  3. Установи плагин
  4. Перезагрузи IDE

Способ 2: File Watchers

Если плагин не подходит, настрой Ruff как внешний инструмент через File Watchers:

Program:  ruff
Arguments: check --fix --stdin-file-path $FilePath$ -
Output paths: $FilePath$
Environment: PYTHONUNBUFFERED=1
Working directory: $ProjectFileDir$

Способ 3: Настройка Ruff как External Tool

Можно добавить Ruff в Tools → External Tools:

Name: Ruff Check
Program: ruff
Arguments: check $FilePath$
Working directory: $ProjectFileDir$

Name: Ruff Format
Program: ruff
Arguments: format $FilePath$
Working directory: $ProjectFileDir$
💡 Совет: В PyCharm можно назначить горячие клавиши на External Tools через Settings → Keymap → External Tools.
⌨

Neovim (nvim-lspconfig)

Neovim поддерживает LSP через built-in LSP клиент с nvim-lspconfig:

-- lazy.nvim
{
  "neovim/nvim-lspconfig",
  config = function()
    local lspconfig = require("lspconfig")
    lspconfig.ruff.setup({
      init_options = {
        settings = {
          -- настройки Ruff (те же, что в pyproject.toml)
        }
      }
    })
  end
}

-- Или через Mason:
{
  "williamboman/mason.nvim",
  opts = {
    ensure_installed = { "ruff" }
  }
}

Более полная конфигурация с keymaps:

vim.api.nvim_create_autocmd("FileType", {
  pattern = "python",
  callback = function()
    vim.keymap.set("n", "<leader>rf", function()
      vim.lsp.buf.format({ async = true })
    end, { desc = "Format with Ruff" })

    vim.keymap.set("n", "<leader>ri", function()
      vim.lsp.buf.code_action({
        context = { only = { "source.organizeImports" } },
        apply = true
      })
    end, { desc = "Organize imports" })

    vim.keymap.set("n", "<leader>rx", function()
      vim.lsp.buf.code_action({
        context = { only = { "source.fixAll" } },
        apply = true
      })
    end, { desc = "Fix all" })
  end,
})

Для интеграции с форматированием (замена black/yapf):

-- Включить Ruff как форматтер
lspconfig.ruff.setup({
  on_attach = function(client, bufnr)
    -- Только форматирование
    client.server_capabilities.documentFormattingProvider = true
  end,
})
💡 Совет: Если используете conform.nvim или null-ls, можно добавить Ruff как форматтер через них. Для null-ls используйте builtins.formatting.ruff.
🐙

Helix Editor

Helix имеет встроенную поддержку LSP. Для Ruff настройка в .config/helix/languages.toml:

[language-server.ruff]
command = "ruff"
args = ["server"]

[[language]]
name = "python"
language-servers = ["ruff", "pyright"]

Для форматирования через Ruff:

[language-server.ruff]
command = "ruff"
args = ["server"]

[language-server.pyright]
command = "pyright-langserver"
args = ["--stdio"]

[[language]]
name = "python"
language-servers = ["ruff", "pyright"]
formatter = { command = "ruff", args = ["format", "-"] }
⚡

Zed Editor

Zed имеет встроенную поддержку Ruff через LSP. Файл конфигурации .config/zed/settings.json:

{
  "languages": {
    "Python": {
      "language_servers": ["ruff", "pyright"],
      "format_on_save": {
        "external": {
          "command": "ruff",
          "arguments": ["format", "--stdin-filename", "{buffer_path}", "-"]
        }
      }
    }
  },
  "lsp": {
    "ruff": {
      "settings": {
        "lineLength": 100,
        "lint": {
          "select": ["E", "F", "I", "N", "UP", "B"]
        }
      }
    }
  }
}

Или с использованием системного конфигурационного файла Ruff:

{
  "languages": {
    "Python": {
      "language_servers": ["ruff"],
      "format_on_save": "on"
    }
  }
}

Zed автоматически предложит установить Ruff, если он не найден в PATH.

🌐

Sublime Text

Для Sublime Text можно использовать пакет LSP-ruff через Package Control:

  1. Установи Package Control (если ещё нет)
  2. Ctrl+Shift+P → Package Control: Install Package
  3. Найди "LSP-ruff" и установи

Или через ручную настройку LSP:

// Preferences → Package Settings → LSP → Settings
{
  "clients": {
    "ruff": {
      "command": ["ruff", "server"],
      "selector": "source.python",
      "settings": {}
    }
  }
}
💡 Совет: LSP-ruff автоматически загружает настройки из pyproject.toml — ничего дополнительно настраивать не нужно.
👓

Emacs (eglot / lsp-mode)

eglot (рекомендуется)

(use-package eglot
  :config
  (add-to-list 'eglot-server-programs
               '(python-mode "ruff" "server"))
  :hook
  (python-mode . eglot-ensure))

lsp-mode

(use-package lsp-mode
  :hook (python-mode . lsp-deferred)
  :commands lsp)

(use-package lsp-ruff
  :after lsp-mode
  :config
  (setq lsp-ruff-line-length 100)
  (setq lsp-ruff-lint-select "E,F,I,N,UP,B"))

Для автоформатирования при сохранении:

(add-hook 'python-mode-hook
  (lambda ()
    (add-hook 'before-save-hook 'eglot-format-buffer nil t)))
🐰

Vim (ale / coc.nvim)

ale

" .vimrc или init.vim
let g:ale_linters = {'python': ['ruff']}
let g:ale_fixers = {'python': ['ruff_format', 'ruff']}
let g:ale_fix_on_save = 1
let g:ale_python_ruff_options = '--fix'

coc.nvim

" coc-settings.json
{
  "languageserver": {
    "ruff": {
      "command": "ruff",
      "args": ["server"],
      "filetypes": ["python"],
      "rootPatterns": ["pyproject.toml", "ruff.toml", ".git"]
    }
  }
}
🖥

Терминал и файловые менеджеры

Ruff можно использовать не только в редакторах. Вот как интегрировать его в другие инструменты:

watchdog (автоматическая проверка)

# Проверять все Python файлы при изменении
ruff check --watch src/

make / task

# Makefile
.PHONY: lint
lint:
    ruff check

.PHONY: format
format:
    ruff format

.PHONY: lint-fix
lint-fix:
    ruff check --fix

just (команды justfile)

# justfile
lint:
    ruff check

format:
    ruff format

check: lint format
⚠

Поиск и устранение проблем

Проблема 1: Ruff не работает в редакторе

❌ Симптом: Расширение установлено, но ошибки не подсвечиваются.
✅ Решение:
  1. Проверь, что Ruff установлен: which ruff в терминале.
  2. Проверь, что расширение VS Code активировано (иконка в статус-баре).
  3. Открой Output панель (View → Output) и выбери "Ruff" в дропдауне. Там будут сообщения об ошибках.
  4. Проверь, что есть pyproject.toml или ruff.toml в корне проекта (или любой родительской папке).
  5. Перезагрузи окно VS Code: Ctrl+Shift+P → "Developer: Reload Window".

Проблема 2: Ruff не форматирует при сохранении

❌ Симптом: Файл сохраняется, но не форматируется.
✅ Решение:
  1. Проверь settings.json: editor.formatOnSave должен быть true и editor.defaultFormatter должен быть "charliermarsh.ruff".
  2. Убедись, что Ruff не конфликтует с другими форматтерами (black, autopep8). Отключи их для Python.
  3. Проверь, что файл не в списке исключений ruff.ignorePatterns.
  4. Попробуй форматировать вручную: Shift+Alt+F. Если не работает — проблема в настройках.

Проблема 3: Конфликт Ruff с другим LSP сервером

❌ Симптом: Дублирующиеся ошибки или конфликт с Pyright/pylsp.
✅ Решение: В VS Code отключи линтеры для других расширений:
"python.linting.enabled": false,
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": false,
"python.linting.mypyEnabled": false,
"python.linting.banditEnabled": false
В Neovim/Helix — просто не добавляй конфликтующие LSP серверы для Python.

Проблема 4: Ruff не находит pyproject.toml

❌ Симптом: Ruff использует дефолтные настройки, игнорируя pyproject.toml.
✅ Решение:
  1. Проверь, что pyproject.toml находится в корне проекта (там же, где .git и .vscode).
  2. Проверь, что Ruff настроен в правильном разделе: [tool.ruff].
  3. Запусти ruff check --show-settings в терминале — если там дефолт, Ruff не видит твой конфиг.
  4. Можно указать путь явно в VS Code: "ruff.args": ["--config", "/path/to/pyproject.toml"].

Проблема 5: Медленная работа в большом проекте

❌ Симптом: В большом проекте (1000+ файлов) Ruff работает медленно.
✅ Решение:
  1. Убедись, что используется native LSP сервер ("ruff.nativeServer": true).
  2. Добавь исключения для директорий, которые не нужно проверять: "ruff.ignorePatterns": ["**/migrations/**", "**/node_modules/**"].
  3. Ограничь количество файлов: запускай ruff check src/ вместо ruff check ..
  4. Используй ruff check --no-cache только для отладки — с кэшем Ruff работает быстрее.
📈

Сравнение поддержки редакторов

Редактор Способ Сложность Функции
VS CodeРасширениеПростоЛинтинг, форматирование, code actions
PyCharmПлагин / File WatcherСреднеЛинтинг, форматирование
NeovimLSP (nvim-lspconfig)СреднеЛинтинг, форматирование, code actions
HelixВстроенный LSPПростоЛинтинг, форматирование
ZedВстроенный LSPПростоЛинтинг, форматирование
Sublime TextLSP-ruffПростоЛинтинг, форматирование
Emacseglot / lsp-modeСреднеЛинтинг, форматирование, code actions
Vimale / coc.nvimСреднеЛинтинг, форматирование
📈

Интеграция с CI/CD (GitHub Actions)

Для автоматизации проверок в CI используйте GitHub Actions. Вот типичный workflow:

# .github/workflows/lint.yml
name: Lint
on: [push, pull_request]
jobs:
  ruff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      - run: pip install ruff
      - run: ruff check
      - run: ruff format --check

С автоисправлением (создаёт PR с исправлениями):

# .github/workflows/ruff-fix.yml
name: Ruff auto-fix
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  fix:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      - run: pip install ruff
      - run: ruff check --fix
      - uses: stefanzweifel/git-auto-commit-action@v5
        with:
          commit_message: "style: auto-fix ruff issues"
💡 Совет: В CI используйте ruff format --check вместо ruff format, чтобы проверить, что код отформатирован, не изменяя его. Изменение кода в CI может привести к конфликтам.
🔎

Расширенная диагностика VS Code

Просмотр логов LSP сервера

Для диагностики проблем с расширением VS Code:

  1. Нажми Ctrl+Shift+P → "Developer: Toggle Developer Tools"
  2. Перейди на вкладку Console — там могут быть ошибки расширения
  3. Или открой View → Output и выбери "Ruff" из выпадающего списка

Настройка verbose-логирования

{
  "ruff.trace.server": "messages",   // логировать все LSP сообщения
  "ruff.trace.server": "verbose",     // максимальный уровень логирования
  "ruff.logLevel": "info",            // info, warn, error, debug
}

Распространённые ошибки в Output панели

Сообщение в логе Причина Решение
ruff: not foundRuff не установлен в системеpip install ruff
Failed to start native serverВерсия Ruff старая (нет LSP)Обнови Ruff до последней версии
No configuration file foundНет pyproject.toml/ruff.tomlСоздай файл конфигурации
Connection to server closedLSP сервер упалПерезагрузи VS Code
📏

Полезные клавиатурные сокращения

Действие VS Code PyCharm Neovim
ФорматироватьShift+Alt+FCtrl+Alt+L:lua vim.lsp.buf.format()
Быстрое исправлениеCtrl+.Alt+Enter<leader>ca
Сортировка импортовShift+Alt+OCtrl+Alt+O:lua vim.lsp.buf.code_action()
Показать все ошибкиCtrl+Shift+MAlt+6:Trouble
Перейти к следующей ошибкеF8F2]d
📋

VS Code Tasks для Ruff

Настройте задачи VS Code для быстрого запуска Ruff из редактора. Создайте .vscode/tasks.json:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Ruff: Lint all files",
      "type": "shell",
      "command": "ruff check",
      "problemMatcher": []
    },
    {
      "label": "Ruff: Fix all files",
      "type": "shell",
      "command": "ruff check --fix",
      "problemMatcher": []
    },
    {
      "label": "Ruff: Format all files",
      "type": "shell",
      "command": "ruff format",
      "problemMatcher": []
    }
  ]
}

Запуск: Ctrl+Shift+P → "Tasks: Run Task" → выбери нужную задачу.

⚡

Code Actions в редакторе

Ruff LSP предлагает несколько code actions (быстрых действий) через лампочку или Ctrl+.:

Действие Описание
Fix all auto-fixable problemsИсправить все безопасные ошибки в файле
Organize importsОтсортировать импорты в файле
Disable rule for this lineДобавить # noqa для текущего правила
Show documentationПоказать описание правила
Fix using --unsafe-fixesПрименить небезопасное исправление
💡 Совет: Code action "Disable rule for this line" автоматически добавляет правильный # noqa: CODE комментарий. Это удобно для быстрого подавления предупреждений без ручного ввода.
📝

Итоги

💡 Главные выводы:
  1. Ruff имеет встроенный LSP-сервер (ruff server) — работает с любым LSP-совместимым редактором.
  2. VS Code — лучший опыт: установи расширение и настрой settings.json.
  3. PyCharm — используй официальный плагин или File Watchers.
  4. Neovim — настрой через nvim-lspconfig или Mason.
  5. Helix, Zed — встроенная поддержка, минимум конфигурации.
  6. Sublime, Emacs, Vim — настройка через LSP или плагины.
  7. При проблемах проверяй Output панель редактора и ruff check --show-settings.
  8. Настрой formatOnSave — самая полезная функция для повседневной работы.

Урок 6.1: Интеграция с редактором

5 вопросов