# Emacs Tham Khảo Nhanh

*Điều hướng, chỉnh sửa, buffer, tìm kiếm, org mode, package*

> Source: GNU Emacs Manual (gnu.org/software/emacs) · MIT

## Điều Hướng

### Di Chuyển Con Trỏ

| Command | Description |
|---------|-------------|
| `C-f / C-b` | Tiến / lùi một ký tự |
| `M-f / M-b` | Tiến / lùi một từ |
| `C-n / C-p` | Dòng tiếp / trước |
| `C-a / C-e` | Đầu / cuối dòng |
| `M-a / M-e` | Đầu / cuối câu |
| `C-v / M-v` | Cuộn xuống / lên một trang |
| `M-< / M->` | Đầu / cuối buffer |
| `M-g g` | Đến số dòng |

### Định Vị Màn Hình

| Command | Description |
|---------|-------------|
| `C-l` | Căn giữa màn hình (xoay vòng trên/giữa/dưới) |
| `C-M-l` | Định vị lại cửa sổ theo heuristic |

## Chỉnh Sửa

### Kill & Yank (Cắt & Dán)

| Command | Description |
|---------|-------------|
| `C-k` | Kill đến cuối dòng |
| `C-w` | Kill vùng chọn (cắt) |
| `M-w` | Sao chép vùng chọn |
| `C-y` | Yank (dán) |
| `M-y` | Duyệt kill ring sau khi yank |
| `C-d` | Xóa ký tự phía trước |
| `M-d` | Kill từ phía trước |
| `M-DEL` | Kill từ phía sau |

### Undo & Transpose

| Command | Description |
|---------|-------------|
| `C-/ or C-_` | Hoàn tác |
| `C-g C-/` | Làm lại (hoàn tác của hoàn tác) |
| `C-t` | Hoán đổi ký tự |
| `M-t` | Hoán đổi từ |
| `C-x C-t` | Hoán đổi dòng |

### Chọn Vùng

| Command | Description |
|---------|-------------|
| `C-SPC` | Đặt mark (bắt đầu chọn) |
| `C-x h` | Chọn toàn bộ buffer |
| `M-h` | Chọn đoạn văn |
| `C-x C-x` | Hoán đổi điểm và mark |

## Buffers & Windows

### Buffers

| Command | Description |
|---------|-------------|
| `C-x b` | Chuyển đến buffer |
| `C-x C-b` | Liệt kê tất cả buffer |
| `C-x k` | Kill (đóng) buffer |
| `C-x LEFT / RIGHT` | Buffer trước / tiếp theo |

### Windows

| Command | Description |
|---------|-------------|
| `C-x 2` | Chia cửa sổ ngang |
| `C-x 3` | Chia cửa sổ dọc |
| `C-x 0` | Đóng cửa sổ hiện tại |
| `C-x 1` | Đóng tất cả cửa sổ khác |
| `C-x o` | Chuyển sang cửa sổ khác |
| `C-x ^` | Phóng to cửa sổ theo chiều dọc |
| `C-x {` | Thu nhỏ cửa sổ theo chiều ngang |

### Frames

| Command | Description |
|---------|-------------|
| `C-x 5 2` | Tạo frame mới |
| `C-x 5 0` | Xóa frame hiện tại |
| `C-x 5 o` | Chuyển sang frame khác |

## Tìm Kiếm & Thay Thế

### Tìm Kiếm Tăng Dần

| Command | Description |
|---------|-------------|
| `C-s` | Tìm tiến (tăng dần) |
| `C-r` | Tìm lùi (tăng dần) |
| `C-s C-s` | Lặp lại tìm kiếm tiến cuối |
| `C-M-s` | Tìm regex tiến |
| `C-M-r` | Tìm regex lùi |
| `RET` | Thoát tìm kiếm tại vị trí hiện tại |
| `C-g` | Hủy tìm kiếm, quay lại điểm ban đầu |

### Thay Thế

| Command | Description |
|---------|-------------|
| `M-%` | Thay thế có xác nhận |
| `C-M-%` | Thay thế regex có xác nhận |
| `y` | Thay thế kết quả khớp này |
| `n` | Bỏ qua kết quả khớp này |
| `!` | Thay thế tất cả còn lại |
| `q` | Thoát thay thế |

## Files

### Thao Tác File

| Command | Description |
|---------|-------------|
| `C-x C-f` | Tìm (mở) file |
| `C-x C-s` | Lưu buffer hiện tại |
| `C-x C-w` | Lưu thành (ghi vào file mới) |
| `C-x s` | Lưu tất cả buffer đã sửa |
| `C-x C-r` | Mở file chỉ đọc |
| `C-x i` | Chèn nội dung file tại điểm con trỏ |

### Dired (Directory Editor)

| Command | Description |
|---------|-------------|
| `C-x d` | Mở thư mục trong Dired |
| `d / x` | Đánh dấu để xóa / thực hiện xóa |
| `R` | Đổi tên / di chuyển file |
| `C` | Sao chép file |
| `+` | Tạo thư mục |
| `g` | Làm mới danh sách |

## Modes

### Major Modes

| Command | Description |
|---------|-------------|
| `M-x fundamental-mode` | Chỉnh sửa văn bản thuần |
| `M-x text-mode` | Văn bản có fill và kiểm tra chính tả |
| `M-x prog-mode` | Cơ sở cho các mode lập trình |
| `M-x python-mode` | Chỉnh sửa và thụt đầu dòng Python |
| `M-x shell-mode` | Shell tương tác trong buffer |

### Minor Modes Hữu Ích

| Command | Description |
|---------|-------------|
| `M-x display-line-numbers-mode` | Bật/tắt số dòng |
| `M-x auto-fill-mode` | Tự động xuống dòng tại fill column |
| `M-x flyspell-mode` | Kiểm tra chính tả liên tục |
| `M-x column-number-mode` | Hiển thị số cột trong mode line |
| `M-x whitespace-mode` | Hiển thị khoảng trắng |
| `M-x electric-pair-mode` | Tự đóng ngoặc và trích dẫn |

## Org Mode Cơ Bản

### Cấu Trúc

| Command | Description |
|---------|-------------|
| `* / ** / ***` | Heading cấp 1 / 2 / 3 |
| `TAB` | Xoay vòng hiển thị heading |
| `S-TAB` | Xoay vòng hiển thị toàn cục |
| `M-RET` | Chèn heading cùng cấp |
| `M-LEFT / M-RIGHT` | Tăng / giảm cấp heading |
| `M-UP / M-DOWN` | Di chuyển subtree lên / xuống |

### TODO & Checkbox

| Command | Description |
|---------|-------------|
| `C-c C-t` | Xoay trạng thái TODO |
| `C-c C-d` | Đặt deadline |
| `C-c C-s` | Lên lịch item |
| `C-c C-c` | Bật/tắt checkbox [ ] / [X] |
| `C-c a` | Mở agenda view |

### Links & Xuất

| Command | Description |
|---------|-------------|
| `C-c C-l` | Chèn / chỉnh sửa link |
| `C-c C-o` | Mở link tại con trỏ |
| `C-c C-e` | Dispatcher xuất (HTML, PDF, v.v.) |

## Quản Lý Package

### package.el

| Command | Description |
|---------|-------------|
| `M-x list-packages` | Duyệt package có sẵn |
| `i / d / x` | Đánh dấu cài / xóa / thực hiện |
| `U` | Đánh dấu tất cả có thể nâng cấp |
| `M-x package-refresh-contents` | Làm mới danh sách package |

### use-package (init.el)

```
(use-package magit
  :ensure t
  :bind ("C-x g" . magit-status))
(use-package company
  :ensure t
  :hook (prog-mode . company-mode))
```

## Cấu Hình

### File Cấu Hình Quan Trọng

| Command | Description |
|---------|-------------|
| `~/.emacs.d/init.el` | File cấu hình chính |
| `~/.emacs.d/early-init.el` | Khởi tạo sớm (trước GUI, Emacs 27+) |
| `~/.emacs.d/custom.el` | Cài đặt được ghi bởi Customize |

### Cài Đặt Thường Dùng

```
(setq inhibit-startup-screen t)
(tool-bar-mode -1)
(set-face-attribute 'default nil :height 120)
(global-display-line-numbers-mode 1)
(setq make-backup-files nil)
```

### Hệ Thống Help

| Command | Description |
|---------|-------------|
| `C-h k` | Mô tả key binding |
| `C-h f` | Mô tả hàm |
| `C-h v` | Mô tả biến |
| `C-h m` | Mô tả các mode hiện tại |
| `C-h t` | Mở hướng dẫn Emacs |
| `C-h i` | Mở tài liệu Info |

## Các Pattern Thường Gặp

### Chỉnh Sửa Rectangle

| Command | Description |
|---------|-------------|
| `C-x SPC` | Bắt đầu chế độ rectangle mark |
| `C-x r k` | Kill rectangle |
| `C-x r y` | Yank rectangle |
| `C-x r t` | Thay rectangle bằng chuỗi |
| `C-x r o` | Chèn rectangle trống |

### Macros

| Command | Description |
|---------|-------------|
| `C-x (` | Bắt đầu ghi macro |
| `C-x )` | Dừng ghi macro |
| `C-x e` | Thực thi macro cuối |
| `C-u 10 C-x e` | Thực thi macro 10 lần |
| `M-x name-last-kbd-macro` | Đặt tên macro để tái sử dụng |

### Shell & Eval

| Command | Description |
|---------|-------------|
| `M-x shell` | Mở shell trong buffer |
| `M-x eshell` | Shell Emacs Lisp |
| `M-!` | Chạy lệnh shell |
| `M-x eval-buffer` | Đánh giá toàn bộ buffer như Elisp |
| `C-x C-e` | Đánh giá biểu thức Elisp trước con trỏ |
