Глава 6. Интеллектуальное автодополнение
6.1. Tab для принятия предложений
Автодополнение в Cursor работает по принципу "ghost text" — AI показывает предложения серым текстом, которые можно принять нажатием Tab.
Как это работает
Когда вы пишете код, AI анализирует:
- Текущий контекст функции/класса
- Окружающий код
- Импорты и зависимости
- Паттерны в вашем проекте
- Комментарии и намерения
И предлагает наиболее вероятное продолжение.
Базовый пример
Вы пишете:
function calculateTotal(items) {
return items
AI предлагает (серым текстом):
.reduce((sum, item) => sum + item.price, 0);
}
Нажмите Tab → предложение принято.
Умное дополнение на основе комментариев
Вы пишете:
// Функция для валидации email адреса
function validateEmail
AI предлагает:
function validateEmail(email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
Контекстно-зависимые предложения
Если в вашем проекте уже есть паттерн для API вызовов:
// Существующий код
async function getUsers() {
try {
const response = await api.get('/users');
return response.data;
} catch (error) {
handleError(error);
}
}
// Вы начинаете писать новую функцию
async function getProducts() {
AI предложит похожую структуру:
try {
const response = await api.get('/products');
return response.data;
} catch (error) {
handleError(error);
}
}
6.2. Контекстно-зависимые подсказки
AI понимает не только синтаксис, но и семантику вашего кода.
Пример 1: React компоненты
function UserProfile({ user }) {
// Вы начинаете писать
const [is
AI предлагает:
const [isEditing, setIsEditing] = useState(false);
Предложение основано на:
- Вы в React компоненте
- Паттерн useState с boolean значением
- Контекст компонента профиля пользователя
Пример 2: API интеграция
// Вы уже импортировали axios
import axios from 'axios';
const api = axios.create({
baseURL: process.env.API_URL
});
// Начинаете писать функцию
api.interceptors.request.use(config => {
AI предлагает:
config.headers.Authorization = `Bearer ${getToken()}`;
return config;
});
Пример 3: Database operations
// В файле с Mongoose моделью
const UserSchema = new mongoose.Schema({
email: String,
password: String,
createdAt: Date
});
// Вы добавляете метод
UserSchema.methods.comparePassword = async function(
AI предлагает:
UserSchema.methods.comparePassword = async function(candidatePassword) {
return await bcrypt.compare(candidatePassword, this.password);
};
6.3. Многострочное автодополнение
AI может предлагать не только отдельные строки, но и целые блоки кода.
Пример: Генерация целой функции
Вы пишете комментарий:
// Функция для сортировки массива объектов по полю
AI предлагает всю реализацию:
function sortByField(array, field, order = 'asc') {
return array.sort((a, b) => {
if (a[field] < b[field]) {
return order === 'asc' ? -1 : 1;
}
if (a[field] > b[field]) {
return order === 'asc' ? 1 : -1;
}
return 0;
});
}
Пример: Генерация switch/case
function getStatusColor(status) {
switch (status) {
AI предлагает:
case 'pending':
return 'yellow';
case 'approved':
return 'green';
case 'rejected':
return 'red';
default:
return 'gray';
}
}
Пример: Try-catch блоки
async function deleteUser(id) {
try {
AI предлагает:
await User.findByIdAndDelete(id);
return { success: true };
} catch (error) {
console.error('Error
deleting user:', error);
throw new Error('Failed to delete user');
}
}
### 6.4. Настройка агрессивности предложений
Cursor позволяет контролировать, насколько активно AI предлагает автодополнения.
**Уровни агрессивности**
1. **Minimal**: Предложения только для очевидных случаев
2. **Balanced** (по умолчанию): Умеренное количество предложений
3. **Aggressive**: Предложения практически на каждой строке
**Как настроить**
Settings → Cursor → Autocomplete → Aggressiveness
Или в `settings.json`:
```json
{
"cursor.autocomplete.aggressiveness": "balanced"
}Когда использовать разные уровни
Minimal — подходит когда:
- Вы опытный разработчик, знающий что писать
- Работаете над критическими секциями, требующими внимания
- Пишете нестандартный код, где AI может мешать
Balanced — хорош для:
- Повседневной разработки
- Баланса между помощью и контролем
- Большинства сценариев
Aggressive — полезен когда:
- Работаете с boilerplate кодом
- Пишете повторяющиеся паттерны
- Максимизируете скорость разработки
- Изучаете новый фреймворк или библиотеку
Временное отключение
Чтобы временно отключить автодополнение:
- Нажмите
Escдля отклонения текущего предложения - Или используйте
Cmd/Ctrl + Shift + Aдля toggle автодополнения
6.5. Работа с различными языками программирования
Cursor поддерживает автодополнение для десятков языков программирования.
JavaScript/TypeScript
Наиболее развитая поддержка с пониманием:
- React, Vue, Angular компонентов
- Node.js паттернов
- Async/await конструкций
- TypeScript типов и интерфейсов
Пример TypeScript:
interface User {
id: number;
name: string;
email: string;
}
// Начинаете писать
function getUserById(id: number): Promise<
AI предлагает:
User | null> {
return db.users.findById(id);
}
Python
Отличная поддержка для:
- Data science библиотек (NumPy, Pandas)
- Web фреймворков (Django, Flask, FastAPI)
- Async/await
- Type hints
Пример:
# Функция для чтения CSV и возврата DataFrame
def load_data(filepath: str) ->
AI предлагает:
pd.DataFrame:
"""Load data from CSV file."""
return pd.read_csv(filepath, encoding='utf-8')
Java
Поддержка Spring Boot, JPA и других enterprise паттернов:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User findById(
AI предлагает:
Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException(id));
}
Go
Понимание goroutines, channels, error handling:
func fetchUsers() ([]User, error) {
resp, err := http.Get(apiURL + "/users")
AI предлагает:
if err != nil {
return nil, fmt.Errorf("failed to fetch users: %w", err)
}
defer resp.Body.Close()
var users []User
if err := json.NewDecoder(resp.Body).Decode(&users); err != nil {
return nil, err
}
return users, nil
}
Rust
Поддержка ownership, borrowing, pattern matching:
fn find_user_by_email(users: &Vec<User>, email: &str) -> Option<
AI предлагает:
&User> {
users.iter().find(|user| user.email == email)
}
SQL
Умные query suggestions:
SELECT u.name, u.email, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON
AI предлагает:
u.id = o.user_id
GROUP BY u.id, u.name, u.email
HAVING COUNT(o.id) > 0
ORDER BY order_count DESC;
Конфигурационные файлы
YAML, JSON, TOML с пониманием структуры:
Docker Compose:
version: '3.8'
services:
web:
image: nginx
ports:
AI предлагает:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
Специализированные языки
Cursor также поддерживает:
- CSS/SCSS: Стилистические паттерны и современные features
- HTML: Семантическая разметка и accessibility
- Markdown: Форматирование и структура документации
- Shell scripts: Bash/Zsh команды и паттерны
- Regular expressions: Паттерны и объяснения