Khi làm việc với giao diện dòng lệnh (CLI), nano là trình soạn thảo văn bản mình thường xuyên sử dụng để tạo và chỉnh sửa nhanh các file cấu hình, file php, html, css,… Một trong những tính năng hữu ích của nano là tô sáng cú pháp (syntax highlighting), giúp làm nổi bật các thành phần trong mã nguồn, chẳng hạn như từ khóa, biến, hoặc chuỗi ký tự, bằng cách sử dụng màu sắc và định dạng khác nhau. Nhờ đó giúp dễ dàng phát hiện lỗi và làm việc hiệu quả hơn.

1. Nano trên macOS không hỗ trợ syntax highlighting

Tuy nhiên, khi sử dụng nano trên macOS, mình nhận ra nó không hỗ trợ syntax highlighting như nano bên Linux. Chẳng hạn bên dưới là nội dung 1 file php khi mình mở bằng lệnh nano web.php

Lý do vì nano trên macOS chỉ là một đường dẫn tắt đến 1 ứng dụng khác có tên gọi pico – trình soạn thảo mặc định của macOS từ Mac OS X 10.0 Cheetah (2001) tới giờ. Trong hình ở trên, các bạn có thể thấy nó hiển thị UW Pico 5.09 ở góc trái phía trên.

Khi kiểm tra lệnh nano bằng lệnh, sẽ thấy nó được trỏ về pico

ls -l /usr/bin/nanoCode language: Nginx (nginx)
lrwxr-xr-x  1 root  wheel  4 Apr 12 14:16 /usr/bin/nano -> picoCode language: YAML (yaml)

Quan trọng là Pico không hỗ trợ tính năng syntax highlighting.

Dưới đây là hướng dẫn cách kích hoạt tính năng syntax highlighting khi sử dụng nano trên macOS.

2. Cài đặt nano bản mới nhất

Mình sẽ cài đặt phiên bản mới nhất của nano bằng Homebrew để thay thế cho bản nano “fake”

brew install nanoCode language: Nginx (nginx)

3. Cấu hình cho nano

Tạo file ~/.nanorc:

touch ~/.nanorcCode language: Nginx (nginx)

Mở file ~/.nanorc và thêm các dòng sau:

# Bao gồm tất cả các định nghĩa tô sáng cú pháp có sẵn
include /usr/local/share/nano/*.nanorc

# Hiển thị số dòng
set linenumbers
Code language: Bash (bash)

Kiểm tra lại file web.php, giờ nó đã hiển thị màu sắc theo cú pháp, giúp file dễ nhìn hơn hẳn. Ngoài ra, nhờ có thông số set linenumbers trong file cấu hình ở trên nên giờ nano hiển thị thêm số dòng ở rìa trái. Nếu không muốn hiển thị số dòng, bạn có thể xóa dòng set linenumbers trong file ~/.nanorc

4. Cải thiện syntax highlighting

Mặc định, nano chỉ hỗ trợ syntax highlighting cho các định dạng file phổ biến như go, php, yaml, xml, css, json, html,… Có thể kiểm tra danh sách hỗ trợ bằng lệnh ls /usr/local/share/nano/, nó sẽ hiển thị danh sách file nanorc, mỗi file tương ứng với một định nghĩa syntax highlighting cho từng loại file.

asm.nanorc        go.nanorc         nanohelp.nanorc   rust.nanorc
autoconf.nanorc   groff.nanorc      nanorc.nanorc     sh.nanorc
awk.nanorc        guile.nanorc      nftables.nanorc   sql.nanorc
c.nanorc          html.nanorc       objc.nanorc       tcl.nanorc
changelog.nanorc  java.nanorc       ocaml.nanorc      tex.nanorc
cmake.nanorc      javascript.nanorc patch.nanorc      texinfo.nanorc
css.nanorc        json.nanorc       perl.nanorc       xml.nanorc
default.nanorc    lua.nanorc        php.nanorc        yaml.nanorc
elisp.nanorc      makefile.nanorc   po.nanorc
email.nanorc      man.nanorc        python.nanorc
extra             markdown.nanorc   ruby.nanorcCode language: CSS (css)

Để nano hỗ trợ nhiều ngôn ngữ và định dạng hơn, mình sẽ cài đặt bộ bộ định nghĩa nâng cao từ GitHub:

git clone https://github.com/galenguyer/nano-syntax-highlighting.git ~/.nanoCode language: PHP (php)

Bộ định nghĩa này cung cấp tô sáng cú pháp cho nhiều ngôn ngữ hơn như Dockerfile, Git, SQL, Python,…

Brewfile.nanorc     gemini.nanorc       m3u.nanorc          scala.nanorc
Dockerfile.nanorc   genie.nanorc        makefile.nanorc     sed.nanorc
Rnw.nanorc          gentoo.nanorc       man.nanorc          sh.nanorc
apacheconf.nanorc   git.nanorc          markdown.nanorc     sieve.nanorc
arduino.nanorc      gitcommit.nanorc    moonscript.nanorc   sls.nanorc
asciidoc.nanorc     glsl.nanorc         mpdconf.nanorc      solidity.nanorc
asm.nanorc          go.nanorc           mutt.nanorc         sparql.nanorc
awk.nanorc          godot.nanorc        nanorc              sql.nanorc
batch.nanorc        gophermap.nanorc    nanorc.nanorc       subrip.nanorc
beancount.nanorc    gradle.nanorc       nginx.nanorc        svn.nanorc
brainfuck.nanorc    groff.nanorc        nmap.nanorc         swift.nanorc
c.nanorc            haml.nanorc         ocaml.nanorc        systemd.nanorc
clojure.nanorc      haskell.nanorc      octave.nanorc       tcl.nanorc
cmake.nanorc        hcl.nanorc          patch.nanorc        tex.nanorc
coffeescript.nanorc html.j2.nanorc      peg.nanorc          toml.nanorc
colortest.nanorc    html.nanorc         perl.nanorc         tool
conf.nanorc         i3.nanorc           perl6.nanorc        ts.nanorc
conky.nanorc        ical.nanorc         php.nanorc          twig.nanorc
creole.nanorc       ini.nanorc          pkg-config.nanorc   v.nanorc
csh.nanorc          inputrc.nanorc      pkgbuild.nanorc     vala.nanorc
csharp.nanorc       install.sh          po.nanorc           verilog.nanorc
css.nanorc          jade.nanorc         pov.nanorc          vhdl.nanorc
csv.nanorc          java.nanorc         powershell.nanorc   vi.nanorc
cython.nanorc       jrnl.nanorc         privoxy.nanorc      x11basic.nanorc
d.nanorc            js.nanorc           prolog.nanorc       xml.nanorc
dot.nanorc          json.nanorc         properties.nanorc   xresources.nanorc
dotenv.nanorc       jsx.nanorc          pug.nanorc          yaml.nanorc
elixir.nanorc       julia.nanorc        puppet.nanorc       yum.nanorc
email.nanorc        keymap.nanorc       python.nanorc       zeek.nanorc
erb.nanorc          kickstart.nanorc    reST.nanorc         zig.nanorc
etc-hosts.nanorc    kotlin.nanorc       readme.md           zsh.nanorc
expect.nanorc       ledger.nanorc       rego.nanorc         zshrc.nanorc
fish.nanorc         license             rpmspec.nanorc
fortran.nanorc      lisp.nanorc         ruby.nanorc
fsharp.nanorc       lua.nanorc          rust.nanorcCode language: CSS (css)

Chỉnh sửa lại file ~/.nanorc như bên dưới

# Bao gồm tất cả các định nghĩa tô sáng cú pháp có sẵn
include "~/.nano/*.nanorc

# Hiển thị số dòng
set linenumbersCode language: PHP (php)

5. Tạo thêm định nghĩa mới

Mình có thể tạo định nghĩa syntax highlighting cho các định dạng file không có sẵn, như Caddyfile (file cấu hình của Caddy web server).

Tạo thêm file caddyfile.nanorc

nano ~/.nano/caddyfile.nanorcCode language: JavaScript (javascript)

Nhập vào nội dung sau và lưu lại

syntax "caddyfile" "Caddyfile$"
magic "Caddyfile configuration"

# Comments
color brightgreen "#.*$"

# Directives (common Caddy directives)
color brightcyan "^[ \t]*(file_server|reverse_proxy|tls|root|redir|try_files|en>

# Matchers (paths, wildcards, etc.)
color brightyellow "[ \t](/[a-zA-Z0-9_/.*-]*|\*|\{[^}]+\})[ \t]*"

# Values (strings, ports, URLs, placeholders)
color brightwhite "[ \t]([a-zA-Z0-9_.-]+(:[0-9]+)?|https?://[a-zA-Z0-9_.-]+|loc>

# Block delimiters (curly braces)
color brightred "[{}]"

# Snippets (e.g., (snippet_name))
color brightmagenta "\([a-zA-Z0-9_-]+\)"

# Keywords within blocks (sub-directives)
color brightblue "[ \t]*(to|from|upstream|dial|load_balance|header_up|header_do>

# Numbers (e.g., status codes, timeouts)
color brightmagenta "[ \t][0-9]+[ \t]"

# Strings in quotes
color brightwhite "\"[^\"]*\""Code language: Markdown (markdown)

Mở file Caddyfile bằng nano, syntax highlighting giờ đã được hiển thị ngon lành.

Nếu muốn tạo thêm định nghĩa cho các định dạng khác, bạn dùng Grok / Gemini / ChatGPT để nhờ chúng nó tạo, ví dụ: “Can you generate nanorc file for Caddyfile ?

Vậy là xong. Nano trên macOS giờ đã tiện lợi hơn nhiều so với ban đầu.

Ngoài macOS, các bạn có thể áp dụng bước 4 và 5 cho Linux để bổ sung syntax highlighting cho nhiều định dạng file mới.

Chúc bạn cài đặt thành công!

Nếu bạn cần hỗ trợ kỹ thuật miễn phí, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời trong thời gian sớm nhất.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *


Bạn cần hỗ trợ kỹ thuật chuyên sâu?

Khám phá các gói dịch vụ giúp bạn tối ưu công việc và vận hành hệ thống hiệu quả hơn. Từ chăm sóc website đến hỗ trợ kỹ thuật, mọi thứ đều linh hoạt và phù hợp với nhu cầu của bạn.