---
id: linux-editors
title: "Vim và nano"
shortTitle: "Vim / nano"
track: linux
trackTitle: "Linux & Shell Scripting"
order: 8
level: important
status: published
estimatedMinutes: 25
prerequisites:
  - linux-packages
next: linux-windows
reviewedAgainst: 2026-10-12
sources:
  - title: "nano documentation"
    url: https://www.nano-editor.org/docs.php
  - title: "vim(1)"
    url: https://man7.org/linux/man-pages/man1/vim.1.html
---

# Vim và nano

Trên server thường không có VS Code. Bạn cần sửa được một file cấu hình bằng `nano` hoặc `vim`, và quan trọng không kém là thoát ra được.

## Để làm gì

Bạn mở file, sửa một dòng, lưu, rồi thoát. Với `vim`, bạn cần biết mình đang ở mode nào để lệnh gõ vào không biến thành nội dung file.

## Gồm những gì

- `nano`: `Ctrl+O` để lưu, `Ctrl+X` để thoát.
- `vim`: `i` để bắt đầu gõ, `Esc` để thoát mode gõ, `:wq` lưu và thoát, `:q!` bỏ thay đổi.
- Vì sao chưa cần học vimscript ở bài này.

Bài này không nói về plugin hay cách biến `vim` thành IDE. Trên server, bạn chỉ cần sửa vài dòng.

## Dùng khi nào

Tình huống điển hình: `nginx.conf` sai một directive, hoặc một unit systemd cần thêm biến môi trường. Nếu file dài và diff phức tạp, hãy sửa trên máy bạn, commit, rồi deploy. Đừng mở editor trên production để viết lại cả file.

`crontab -e` và `visudo` mở editor theo biến `EDITOR`. Nếu chưa tự tin với `vim`, đặt `EDITOR=nano`. `visudo` kiểm tra cú pháp sudoers trước khi ghi, nên đừng sửa `/etc/sudoers` bằng editor thường.

## Kiến thức cốt lõi

`nano` mở ra là gõ được ngay, và phím tắt hiện ở cuối màn hình. `^O` nghĩa là Ctrl+O.

`vim` mở ở normal mode. Ở mode này, phím `j` `k` dùng để di chuyển chứ không chèn chữ. Bấm `i` để sang insert mode, lúc đó mới gõ được nội dung. `Esc` đưa bạn về normal mode. `:w` ghi file, `:q` thoát nếu không có thay đổi chưa lưu, `:wq` ghi rồi thoát, `:q!` thoát và bỏ sửa.

Người mới hay bị kẹt trong `vim` vì gõ `:q` khi đang ở insert mode, và chữ `:q` rơi thẳng vào file. Hãy bấm `Esc` trước, rồi `:q!` nếu không muốn lưu.

## Lệnh và code mẫu

```bash
mkdir -p ~/devops-lab/edit
printf 'listen 80;\n' > ~/devops-lab/edit/site.conf
nano ~/devops-lab/edit/site.conf
```

Trong nano, đổi `80` thành `8080`, bấm Ctrl+O, Enter để lưu, rồi Ctrl+X để thoát.

Nếu máy có `vim`:

```bash
vim ~/devops-lab/edit/site.conf
```

Bấm `i`, sửa nội dung, bấm `Esc`, rồi gõ `:wq`.

## Thực hành

1. Sửa file bằng nano, rồi `cat` để thấy giá trị đã thành `8080`.
2. Nếu có vim, mở lại file bằng vim. Lỡ vào insert mode thì bấm `Esc` rồi `:q!`.
3. Xóa thư mục lab.

Máy không có `vim` thì không cần cài; `nano` là đủ cho bài này.

## Kết quả mong đợi

`cat` in ra `listen 8080;`, và bạn thoát được cả hai editor mà không phải đóng terminal.

## Checklist

- [ ] Trong vim, bấm `Esc` trước khi gõ `:`.
- [ ] Dùng `visudo` khi sửa sudoers, không mở file đó trực tiếp bằng `nano`.
- [ ] Với thay đổi cấu hình dài, đưa vào Git thay vì chỉ lưu trên một server.

## Thẻ ôn

### linux-editors-vim
kind: trap
cue: Một dòng `:wq` lọt vào file vì bạn gõ lúc còn insert mode. `Esc` về normal mode trước. Không muốn lưu thì `Esc` rồi `:q!`.

Q: Bạn mở file bằng vim, gõ `:wq` để lưu và thoát, nhưng mở lại thì trong file có nguyên một dòng chữ `:wq`. Chuyện gì đã xảy ra, và nếu không muốn lưu các sửa vừa gõ thì thoát thế nào?

A: Vim lúc đó còn ở insert mode, nên `:wq` được ghi vào nội dung file như chữ bình thường, không phải lệnh. Lệnh chỉ được nhận ở normal mode. Bấm `Esc` để ra khỏi insert mode, xóa dòng vừa lọt, rồi mới `:wq` nếu muốn lưu bản đã sửa. Nếu những gì vừa gõ không đáng giữ, `Esc` rồi `:q!`. Dấu chấm than bỏ qua thay đổi và thoát, không ghi đè file.

### linux-editors-visudo
kind: command
cue: Sửa sudoers bằng `visudo` để có bước kiểm tra cú pháp. Mở file thẳng bằng nano, một dòng sai có thể khóa sudo.

Q: Cần thêm một rule sudo. Bạn mở thẳng file sudoers bằng nano, sửa, rồi lưu. Rủi ro so với `visudo` là gì?

A: Nano ghi đúng những gì bạn gõ, kể cả một dòng sai cú pháp. File sudoers hỏng thì các lệnh `sudo` sau đó không chạy, và bạn có thể không còn cách nâng quyền để sửa lại chính file đó. `visudo` mở file, và trước khi ghi nó kiểm tra cú pháp. Sai thì nó không thay bản đang dùng. Đừng mở file sudoers trực tiếp cho nhanh.

## Lỗi thường gặp

**`:wq` xuất hiện trong nội dung file.** Bạn đang ở insert mode. Bấm `Esc`, xóa dòng đó, rồi gõ `:wq`.

**Lưu `nginx.conf` mà không chạy `nginx -t`.** Editor không biết cú pháp Nginx, nên lỗi chỉ lộ ra khi reload. Hãy test config trước khi reload, như bài Nginx đã làm với `nginx -t`.

## Nguồn

1. [nano docs](https://www.nano-editor.org/docs.php) — phím tắt ghi và thoát.
2. [vim(1)](https://man7.org/linux/man-pages/man1/vim.1.html) — mode và cách thoát.

## Tiếp theo

[Windows Server](./07-windows.md)
