Hướng dẫn sử dụng Emacs cơ bản


Như chúng ta đã biết, emacs là trình soạn thảo nổi tiếng bậc nhất trong thế giới Unix/Linux.

Hôm nay chúng tôi xin giới thiệu cơ bản về lịch sử và cách sử dụng Emacs.

Giới thiệu và lịch sử

             GNU Emacs là gì
             GNU Emacs không là gì
             Các loại Emacs
             Về bài viết này
Bàn phím và bộ kí tự
             Kí hiệu
Cấu trúc lệnh Emacs
             Các phím đơn
             Các phím tiền tố và tổ hợp
             Dùng các lệnh mở rộng
             Tiền tố ESC
             Có quá nhiều lệnh?
Tập tin, bộ đệm và cửa sổ
             Lệnh thao tác trên tập tin
             Lệnh thao tác trên bộ đệm
             Lệnh thao tác trên cửa sổ
Các khái niệm căn bản
             Vào và ra
             Các lệnh tự điền
             Màn hình
                          Dòng chế độ
                          Tiểu bộ đệm
                          Thông điệp lạ
                          Kí tự khôi hài
                          Dòng dài
             Eight-bit clean
             Ngắt ngang và bỏ ngang
             Giúp đỡ
             Info
             Undo không giới hạn và redo
             Lưu dự phòng và chế độ tự động lưu
             Hoàn thành
             Cung cấp đối số cho câu lệnh
             Trích dẫn các kí tự liên kết với lệnh
             Các lệnh bị bất hoạt
Di chuyển và đối tượng văn bản
Xoá (delete), kill và yank
Sao chép và di chuyển văn bản
Tìm và thay
Đánh dấu và vùng
             Xác định vùng
             Thao tác trong vùng
Canh lề
Chế độ
Thông tin thêm

Giới thiệu và lịch sử

GNU Emacs là gì

GNU Emacs là trình soạn thảo văn bản

  • Tự do: tự do sao chép và phân phối lại
  • Có thể chạy trên nhiều hệ điều hành
  • Có thể mở rộng: không chỉ thay đổi các xác lập cá nhân mà còn có thể tạo ra những chức năng mới.

GNU Emacs không là gì

GNU Emacs không là trình xử lý từ WYSIWYG (thấy gì được nấy).

Các loại Emacs

Thực ra Emacs là tên của một họ các trình soạn thảo văn bản. Emacs nguyên thuỷ được viết bằng ngôn ngữ lập trình của trình soạn thảo văn bản TECO, và chạy trên DEC PDP-10 và -11. Emacs đầu tiên cho các máy Unix là Gosling Emacs, sau này được thương mại hoá với tên Unipress Emacs. GNU Emacs được viết bởi Richard Stallman, tác giả chính của TECO Emacs nguyên thuỷ. Yêu cầu chính để một trình soạn thảo văn bản được gọi là “emacs” là nó có thể được mở rộng đầy đủ với một ngôn ngữ lập trình thực, không đơn thuần là một ngôn ngữ macro. Đối với GNU Emacs, ngôn ngữ này là Lisp.

Về bài viết này

Bài viết này hiện dựa gần như hoàn toàn trên bản “A Tutorial Introduction to GNU Emacs” (http://www.lib.uchicago.edu/keith/tcl-course/emacs-tutorial.html) bởi Keith Waclena – nhưng có thể được bổ sung và mở rộng sau này.

Bàn phím và bộ kí tự

Tất cả các lệnh của Emacs dùng bộ kí tự ASCII 8 bit.

Kí hiệu

  • C-x: Kí tự Control-x, với x là phím bất kì.
  • M-x: Kí tự Meta-x, với x là phím bất kì.
  • C-M-x: Kí tự Control-Meta-x, với x là phím bất kì.
  • RET: Phím return (thực ra là C-m).
  • SPC: Thanh khoảng trắng (space bar).
  • ESC: Phím escape, hay tương đương, C-[

Cấu trúc lệnh Emacs

Đối với Emacs, mỗi gõ phím (keystroke) thực ra là một lệnh, ngay cả các gõ phím đơn giản như các chữ cái A và z: in các ký tự là lệnh điền chúng vào. Các ký tự không in (non-printing) là các lệnh soạn thảo, tức dùng để di chuyển con trỏ, cuộn văn bản, xoá hoặc sao chép văn bản, v.v.

Mỗi lệnh có một tên dài, như kill-linedelete-backward-char, hay self-insert-command. Các lệnh này được liên kết (bind) với một gõ phím để thuận tiện khi soạn thảo. Mỗi cặp gõ phím và lệnh được gọi là liên kết phím (key binding), hoặc gọi tắt là liên kết (binding).

Bộ các liên kết tạo thành bộ lệnh Emacs. Tuy nhiên, chúng có thể được mở rộng và được thay đổi tuỳ thích.

Các phím đơn

  • 95 ký tự ASCII in được, chúng liên kết với self-insert-command để được điền vào văn bản khi được gõ.
  • các ký tự điều khiển: C-aC-b,...: 32 kí tự soạn thảo.
  • Meta để sử dụng thêm 128 ký tự ở nửa trên của ASCII cho các lệnh soạn thảo:

             + M-aM-b,... (cũng có M-A là một kí tự riêng biệt, nhưng để giảm thiểu nhầm lẫn các kí tự meta chữ hoa được coi như các kí tự meta chữ thường tương ứng.)

     + C-M-a (tương đương với M-C-a),... (giữ Control và Meta đồng thời và gõ phím kia.)

Các phím tiền tố và tổ hợp

Lệnh tiền tố (prefix command) là một gõ phím đợi một kí tự khác được gõ, tạo thành một cặp gõ phím liên kết với một lệnh. Lệnh tiền tố thường nhóm các lệnh có liên hệ với nhau. Các lệnh tiền tố tiêu chuẩn là:

  • C-c: Dùng cho các lệnh đặc hiệu cho các chế độ (mode) cụ thể.
  • C-h: Dùng cho các lệnh giúp đỡ.
  • C-x: Chủ yếu dùng cho các lệnh thao tác trên tập tin, bộ đệm và cửa sổ.

Một lệnh của lệnh tiền tố cũng có thể liên kết với một lệnh tiền tố khác.

Dùng các lệnh mở rộng

Đối với một người dùng cụ thể, có những lệnh hiếm khi được dùng, và khi cần có thể tra tên dài của lệnh đó (bằng cách dùng Info, hệ thống giúp đỡ trực tuyến của Emacs) và gõ nó trực tiếp.

Có một lệnh của Emacs có thể được dùng để thi hành lệnh khác bằng cách gõ tên dài của nó: M-x.

Tiền tố ESC

Phím ESC có thể được dùng thay cho Meta, đặc biệt là trong trường hợp bàn phím không có phím Meta hoặc phím Meta không sử dụng được. Điểm cần lưu ý là phím ESCkhông là phím chuyển (shift key) như Control hay Meta mà thực chất là một ký tự ASCII, do đó cần gõ nó riêng biệt (nếu giữ ESC lâu, nó có thể tự lặp lại như các phím khác).

Thí dụ: M-a trở thành ESC aC-M-f trở thành ESC C-f.

Có quá nhiều lệnh?

Người dùng không cần phải nhớ tất cả các lệnh mà chỉ cần học các lệnh cơ bản và một số lệnh nâng cao phù hợp với nhu cầu của mình.

Tập tin, bộ đệm và cửa sổ

Emacs có 3 (thực ra là 4) cấu trúc dữ liệu liên quan mật thiết với nhau:

Tập tin
            Tập tin là tập tin Unix thực sự trên đĩa. Bạn không bao giờ biên tập trực tiếp trên tập tin này. Emacs đọc tập tin vào bộ đệm và viết một bộ đệm vào tập tin để lưu nó.
Bộ đệm (buffer)
           Bộ đệm là cấu trúc dữ liệu nội tại giữ văn bản bạn thực sự biên tập. Emacs có thể có con số bộ đệm bất kì tại bất kì thời điểm nào. Hầu hết, nhưng không phải tất cả, các bộ đệm liên hệ với một tập tin. Bộ đệm có tên; một bộ đệm xuất phát từ một tập tin gần như luôn luôn mang tên của tập tin đó, và chúng ta nói rằng bộ đệm đangviếng thăm tập tin. Điều này có nghĩa là khi bạn lưu bộ đệm, nó sẽ được lưu vào tập tin đúng. Vào bất cứ lúc nào cũng chỉ có đúng một bộ đệm được chọn: đây là bộ đệm mà con trỏ phần cứng đang hoạt động và là nơi mà lệnh sẽ có tác dụng. Bộ đệm có thể được xoá theo ý muốn; xoá bộ đệm không xoá tập tin trên đĩa (mặc dù bạn có thể mất các thay đổi đã thực hiện nếu bạn không lưu trước).
Cửa sổ
           Cửa sổ là nơi bạn xem bộ đệm. Vì giới hạn thực thể của màn hình, có thể bạn không có chỗ để xem tất cả các bộ đệm cùng lúc. Bạn có thể chia nhỏ màn hình, ngang hay dọc, thành nhiều cửa sổ, mỗi cửa sổ xem một bộ đệm khác nhau. Cũng có thể có vài cửa sổ để xem các phần khác nhau của cùng bộ đệm. Có thể tạo và xoá cửa sổ tuỳ thích; xoá cửa sổ không xoá bộ đệm liên hệ với cửa sổ đó.
Khung (frame)
           Khung giống như cửa sổ, nhưng được đối xử như một thực thể riêng biệt trong hệ thống cửa sổ như X.

Lệnh thao tác trên tập tin

  • C-x C-f: find-file. Nhắc nhập tên tập tin và đọc tập tin vào bộ đệm cho để biên tập. Nếu tập tin đang được biên tập trong một bộ đệm nào đó, nó chỉ chuyển sang bộ đệm đó mà không đọc tập tin.
  • C-x C-s: save-buffer. Lưu tập tin, hay chính xác hơn là viết bộ đệm hiện tại lên đĩa.
  • C-x s: save-some-buffers. Lưu tất cả các bộ đệm đang viếng thăm tập tin, truy vấn từng cái và đưa ra một số tuỳ chọn cho mỗi cái (lưu, không lưu, nhìn qua trước rồi có thể lưu nó, v.v).

Lệnh thao tác trên bộ đệm

  • C-x b: switch-to-buffer. Nhắc nhập tên bộ đệm và chuyển bộ đệm của cửa sổ hiện tại sang bộ đệm đó. Tạo bộ đệm rỗng mới nếu tên mới được nhập vào.
  • C-x C-b: list-buffers. Xuất hiện cửa sổ mới liệt kê tất cả bộ đệm với tên, đã thay đổi hay không, kích thước theo byte, chế độ chính và tập tin mà bộ đệm đang viếng thăm.
  • C-x k: kill-buffer. Nhắc nhập tên bộ đệm và dỡ bỏ toàn bộ cấu trúc dữ liệu cho bộ đệm đó khỏi Emacs. Nếu bộ đệm đã thay đổi bạn sẽ có cơ hội lưu nó. Lệnh này không xoá tập tin liên hệ, nếu có.
  • C-x C-q: vc-toggle-read-only. Đặt thuộc tính chỉ-đọc hoặc đặt thuộc tính đọc-viết nếu nó đang là chỉ-đọc.

Lệnh thao tác trên cửa sổ

  • C-v: scroll-up. Cuộn tới (về cuối tập tin) một màn hình. Theo mặc định, Emacs chừa 2 hàng từ màn hình trước.
  • M-v: scroll-down. Như C-v, nhưng cuộn ngược.
  • C-x o: other-window. Chuyển sang cửa sổ khác. Lặp đi lặp lại lệnh này sẽ di chuyển qua tất cả các cửa sổ, từ trái sang phải và trên xuống dưới.
  • C-x 1: delete-other-windows. Xoá tất cả các cửa sổ khác, trừ cửa sổ hiện tại. Lệnh này không xoá các bộ đệm và tập tin liên hệ với cửa sổ bị xoá.
  • C-x 0: delete-window. Xoá cửa sổ hiện tại, thay đổi kích thước các cửa sổ khác cho thích hợp.
  • C-x 2: split-window-vertically. Chia cửa sổ hiện tại thành hai, theo chiều dọc. Lệnh này tạo một cửa sổ mới, nhưng không tạo bộ đệm mới: cùng một bộ đệm sẽ được xem trong 2 cửa sổ. Điều này giúp xem các phần khác nhau của bộ đệm đồng thời.
  • C-x 3: split-window-horizontally. Tương tự như C-x 2 nhưng chia cửa sổ theo chiều ngang.
  • C-M-v: scroll-other-window. Tương tự như C-v, nhưng cuộn các cửa sổ kế tiếp (là cửa sổ mà lệnh C-o sẽ chuyển sang).

Các khái niệm căn bản

Vào và ra

Để khởi động Emacs:

    emacs

sau đó dùng các lệnh tập tin để đọc tập tin cần biên tập. Thay vào đó, bạn cũng có thể khởi động Emacs với một (hoặc nhiều) tập tin ban đầu:

    emacs foo.bar

Để thoát Emacs, dùng lệnh C-x C-c (liên kết với save-buffers-kill-emacs). Nó sẽ đề nghị bạn lưu tất cả bộ đệm và rồi thoát.

Bạn cũng có thể hoãn Emacs (theo nghĩa Unix là dừng nó và đặt vào hậu trường) bằng C-x C-z (liên kết với suspend-emacs). Khởi động lại Emacs tuỳ theo shell, nhưng thông thường dựa trên lệnh fg.

Các lệnh tự điền (self inserting command)

Một khi Emacs đã khởi động, bạn có thể gõ văn bản vào nó. Các kí tự in được tự điền vào vì mỗi kí tự liên kết với lệnh tự điền self-insert-command.

Màn hình

Dòng chế độ

Màn hình Emacs hoàn toàn được dành cho văn bản của tập tin, chỉ trừ một dòng gần cuối màn hinh được dành cho dòng chế độ. Dòng này hiển thị các thông tin quan trọng, bao gồm:

  • Trạng thái của bộ đệm: đã thay đổi (cặp dấu sao), chưa thay đổi (dấu gạch ngang), hay chỉ đọc (cặp dấu %).
  • Tên tập tin đang biên tập (sẽ là *scratch* nếu bạn không đang biên tập tập tin nào).
  • Chế độ chính (trong dấu ngoặc).
  • Lượng của tập tin xem trên màn hình:
    All: Tất cả nội dung của tập tin.
    Top: Phần đầu của tập tin.
    Bot: Phần cuối của tập tin.
    NN%: Phần trăm tập tin trên cửa sổ.

Tiểu bộ đệm (minibuffer)

Dòng trắng bên dưới dòng chế độ là tiểu bộ đệm, dùng hiển thị thông điệp và dấu nhắc yêu cầu gõ một cái gì đó (trả lời có/không cho câu hỏi, tên tập tin, tên lệnh dài, v.v).

Tiểu bộ đệm cũng được gọi là vùng phản hồi (echo area), vì Emacs hiển thị các gõ phím ở đây nếu bạn gõ thật chậm. Thí dụ gõ phím đa kí tự (multi-character keystroke) (nhưESC q) với khoảng dừng dài giữa các lần gõ.

Thông điệp lạ

Thỉnh thoảng Emacs tự động in các thông điệp trên tiểu bộ đệm mà dường nhu không liên quan gì đến việc bạn đang làm. Hai thông điệp thường gặp nhất là:

Mark set
             Emacs đánh dấu cho bạn do kết quả của câu lệnh cuối; đánh dấu tự động là tính năng tiện lợi của một số lệnh, xem Đánh dấu và vùng.
Garbage collecting...
             Bộ máy lips của Emacs đang thực hiện lưu trữ, bạn có thể bỏ qua và tiếp tục gõ.

Kí tự khôi hài (funny character)

Khi tập tin chứa kí tự điều khiển (control character) hoặc kí tự với high-order bit bằng 1 (được set), Emacs hiển thị chúng bằng dấu gạch xiên ngược và 3 số bát phân (cho giá trị ASCII của kí tự) đi theo sau. Nếu trạm cuối (terminal) có thể hiển thị bộ kí tự 8 bit, như ISO Latin-1, Emacs sẽ hiển thị các kí tự này thay vì các số bát phân.

Dòng dài

Emacs không ngắt dòng tự động nếu không được yêu cầu. Vì vậy nó không làm xáo trộn các dòng dài trong tập tin. Ở các chế độ hướng về soạn thảo văn bản, Emacs có thể thêm ngắt dòng tự động.

Eight-bit clean

Emacs có thể biên tập tập tin nhị phân mà không làm hỏng chúng.

Ngắt ngang và bỏ ngang

C-g (liên kết với keyboard-quit) dùng để ngắt ngang công việc Emacs đang làm (chẳng hạn như đang hỏi bạn gì đó mà bạn không hiểu), và nó cũng bỏ ngang một phần chuỗi phím vừa được gõ (ví dụ nếu bạn bất cẩn gõ C-x). C-g là kí tự ASCII BEL, do đó khi bạn gõ chuông sẽ kêu.

Vì Emacs có khả năng đệ quy đầy đủ nên đôi khi cần phải gõ C-g vài lần để thoát khỏi chuỗi lệnh đệ quy. Cũng vậy, nếu Emacs thật sự bị treo, có thể gõ nhanh 3 lần C-g để bỏ ngang cái đang làm treo.

Giúp đỡ

Emacs có hệ thống giúp đỡ trực tuyến phong phú, có thể được truy cập qua phím giúp đỡ C-hC-h là phím tiền tố. Gõ C-h hai lần để xem danh sách các lệnh con (subcommand); gõ ba lần để được cửa sổ miêu tả tất cả các lệnh này (gõ SPC sẽ cuộn cửa sổ này). Một vài lệnh giúp đỡ thường dùng:

  • C-h a: command-apropos. Nhắc nhập từ khoá và sau đó liệt kê tất cả các lệnh mang từ khoá đó trong tên dài.
  • C-h k: describe-key. Nhắc nhập một gõ phím, và miêu tả lệnh liên kết với phím đó, nếu có.
  • C-h i: info. Gọi trình đọc tài liệu siêu văn bản Info.
  • C-h m: describe-mode. Miêu tả chế độ chính hiện tại và các liên kết phím (key binding) cụ thể của nó.
  • C-h p: finder-by-keyword. Chạy trình duyệt hướng chủ đề tương tác (interactive subject-oriented browser) của các gói Emacs.
  • C-h t: help-with-tutorial. Chạy tài liệu hướng dẫn sử dụng Emacs. Rất có ích cho người mới bắt đầu.

Info

Emacs cài đặt sẵn trình đọc tài liệu siêu văn bản được gọi là Info. Để chạy nó, gõ C-h i hoặc M-x info RET. Nó có tài liệu hướng dẫn cho chính nó, được mở bằng cách gõ h.

Undo không giới hạn và redo

Một trong các lệnh quan trọng nhất của Emacs là undo, bằng cách gõ C-_ (control thanh dưới). C-_ là một kí tự ASCII hợp lệ, nhưng một vài bàn phím không phát sinh được kí tự này, khi đó có thể dùng C-x u.

Emacs có thể undo không giới hạn số lần thay đổi trước, và nó cũng có khả năng redo những gì đã bị undo.

Lưu dự phòng và chế độ tự động lưu

Emacs không bao giờ thay đổi tập tin trên đĩa cho đến khi bạn yêu cầu nó làm, nhưng nó rất cẩn thận trong việc lưu công việc bạn đang làm theo một số cách.

Tập tin lưu dự phòng (backup file).
             Emacs luôn luôn lưu lại phiên bản trước của tập tin khi bạn lưu tập tin. Nếu tập tin có tên foo, bản lưu dự phòng sẽ được gọi là foo~. Emacs có thể lưu giữ bất cứ số phiên bản nào trước đó (tuỳ theo bạn quy định, và theo mặc định là off), đặt tên là foo.~1~,foo.~2~, v.v.
Tập tin tự động lưu (auto-save file).
             Theo mặc định Emacs cũng tự động lưu tập tin trong khi bạn đang biên tập nó. Tập tin tự động lưu cho tập tin foo được gọi là #foo#. Nếu Emacs (hoặc hệ thống) bị crash trước khi bạn lưu các thay đổi, bạn có thể khôi phục gần như toàn bộ từ tập tin này. Tự động lưu (theo mặc định) được thực hiện mỗi 300 kí tự, hoặc khi hệ thống gặp lỗi.

Hoàn thành (completion)

Để tiết kiệm gõ phím, Emacs cung cấp nhiều dạng hoàn thành: có nghĩa là Emacs cố gắng hoàn thành tên tập tin, tên lệnh, v.v đã được gõ một phần. Thường dùng phím TABđể gọi chế độ hoàn thành.

Cung cấp đối số cho câu lệnh

Nhiều lệnh Emacs lấy đối số, giống như cách một thủ tục hoặc một hàm lấy đối số trong ngôn ngữ lập trình. Hầu hết các lệnh tạo dấu nhắc cho bạn nhập đối số của nó: thí dụ lệnh đọc nội dung tập tin sẽ nhắc bạn nhập tên tập tin.

Có một loại đối số thường được chấp nhận đến nỗi có cách đặc biệt để cung cấp nó: đối số số (numeric argument). Nhiều lệnh hiểu đối số số là một yêu cầu lặp lại bấy nhiêu lần. Thí dụ, lệnh delete-char (liên kết với C-d), thông thường xoá một kí tự bên phải con trỏ, sẽ xoá N kí tự nếu được cho đối số số là N. Nó cũng làm việc với các lệnh tự điên vào.

Để cung cấp đối số số, thí dụ 12, cho một lệnh, gõ C-u 12 trước khi gõ lệnh. Nếu gõ chậm rãi, bạn sẽ thấy:

C-u 1 2-

ở vùng phản hồi. Sau đó gõ C-d và như vậy bạn đã cho lệnh delete-char đối số 12. Dấu gạch ngang dẫn đầu biểu thị đối số âm; dấu gạch ngang duy nhất (không có con số theo sau) biểu thị đối số -1. Bỏ ngang một đối số số vừa gõ bằng C-g.

Vì người ta thường không quan tâm precisely chính xác bao nhiêu lần một lệnh được lặp lại, có cách nhanh để lấy đối số số với các biên độ khác nhau. C-u một mình, không có chữ số nào theo sau, tương ứng với đối số số là 4. Lần C-u tiếp theo sẽ nhân nó lên 4, được đối số số 16. Lần C-u tiếp nữa sẽ nhân thêm 4, được đối số số 64, v.v. Vì vậyC-u được gọi là universal-argument (đối số phổ quát).

Tuỳ theo lệnh, đối số số không nhất thiết được hiểu là số lần lặp lại, mà có thể bị bỏ qua hoặc được hiểu là Boolean (sự có mặt của đối số -- bất cứ đối số nào -- và ngược lại là sự vắng mặt của nó), v.v.

Trích dẫn các kí tự liên kết với lệnh

Để điền kí tự điều khiển (control character) vào tập tin, có thể dùng lệnh quoted-insert, liên kết với C-qC-q có tác dụng như lệnh tiền tố, nhưng kí tự kế tiếp sẽ được điền vào bộ đệm thay vì thi hành như một lệnh. Thí dụ C-q ESC sẽ điền một Escape.

C-q cũng có thể dùng nhập kí tự bằng cách gõ C-q và theo sau với mã ASCII ở dạng chữ 3 số bát phân.

Các lệnh bị bất hoạt

Một số lệnh đặc biệt dễ gây nhầm lẫn cho người mới sử dụng được bất hoạt theo mặc định. Khi một lệnh bị bất hoạt được gọi, sẽ xuất hiện hộp thoại ngắn và cửa sổ tài liệu cho lệnh đó, và cho bạn 3 lựa chọn:

  • Space để dùng lệnh đó chỉ ở lần này, và tiếp tục bất hoạt,
  • Y để dùng nó và hoạt hoá nó (sẽ không bị câu hỏi ở lần dùng sau),
  • N để không làm gì hết (lệnh vẫn bị bất hoạt).

Di chuyển và đối tượng văn bản

Emacs cung cấp nhiều lệnh để di chuyển xung quanh đối tượng văn bản. Các lệnh này có thể nhận đối số số để lặp lại. Định nghĩa đối tượng văn bản có thể thay đổi tuỳ theo chế độ (thí dụ dấu gạch dưới (underbar) được xem là yếu tố cấu tạo từ trong C Mode, vì chúng hợp lệ trong tên identifier, nhưng không được xem là yếu tố cấu tạo từ trong Text Mode).

Kí tự

  • C-f: forward-char. Di chuyển tới (về phải) một kí tự.
  • C-b: backward-char. Di chuyển lùi (về trái) một kí tự.

Từ

  • M-f: forward-word. Di chuyển tới một từ.
  • M-b: backward-word. Di chuyển lùi một từ.

Dòng (dọc)

  • C-n: next-line. Di chuyển xuống dòng kế tiếp.
  • C-p: previous-line. Di chuyển lên dòng trước.

Con trỏ vẫn ở cùng cột khi di chuyển theo dòng (hoặc cuối dòng nếu dòng đó ngắn).

Dòng (ngang)

  • C-a: beginning-of-line. Di chuyển đến đầu dòng hiện tại.
  • C-e: end-of-line. Di chuyển đến cuối dòng hiện tại.

Câu

  • M-a: backward-sentence. Di chuyển đến đầu câu hiện tại.
  • M-e: forward-sentence. Di chuyển đến cuối câu hiện tại.

Đoạn

  • M-{: backward-paragraph. Di chuyển đến đầu đoạn hiện tại.
  • M-}: forward-paragraph. Di chuyển đến cuối đoạn hiện tại.

Trang

  • C-x [: backward-page. Di chuyển đến đầu trang hiện tại.
  • C-x ]: forward-page. Di chuyển đến cuối trang hiện tại.

Trang được chia bởi kí tự formfeed (C-l) trong hầu hết các chế độ.

Bộ đệm

  • M-<: beginning-of-buffer. Di chuyển đến đầu bộ đệm.
  • M->: end-of-buffer. Di chuyển đến cuối bộ đệm.

Biểu thức S (cặp dấu ngoặc)

Biểu thức S (S-expression, gọi tắt là sexp) là tên cho cho các cặp dấu ngoặc (balanced parentheses) (và văn bản chứa trong đó) trong Lisp. Các kí tự mà Emacs nhận biết là dấu ngoặc gồm ngoặc tròn, ngoặc vuông và ngoặc nhọn, nhưng cũng còn tuỳ vào ngôn ngữ lập trình.

Ngoài ra, trong hầu hết các chế độ ngôn ngữ lập trình, các chuỗi đặt trong dấu nháy (quoted string) cũng được xem là sexps (có thể là dấu nháy đơn hay nháy kép).

  • C-M-b: backward-sexp. Di chuyển lùi đến sexp kế tiếp. Nếu con trỏ ở ngay bên phải của dấu ngoặc trái, C-M-b sẽ bíp, vì không có sexp ở phía trái để di chuyển đến: bạn phải di chuyển lên.
  • C-M-f: forward-sexp. Di chuyển tới sexp kế tiếp. Tương tự như trên nếu con trỏ nằm ngay bên trái của dấu ngoặc phải.
  • C-M-u: backward-up-list. Di chuyển lùi lên một cấp dấu ngoặc. Nói cách khác, di chuyển sang dấu ngoặc trái của dấu ngoặc đang chứa con trỏ, bỏ qua các sexp trong các cặp dấu ngoặc.
  • C-M-d: down-list. Di chuyển xuống một cấp dấu ngoặc. Nói cách khác, di chuyển sang bên phải của dấu ngoặc trái kế tiếp, bỏ qua các sexp trong các cặp dấu ngoặc.

Hàm

Emacs, theo Lips, gọi các hàm và thủ tục là defun.

  • C-M-a: beginning-of-defun. Di chuyển đến đầu của defun hiện tại.
  • C-M-e: end-of-defun. Di chuyển đến cuối của defun hiện tại.

Xoá (delete), kill và yank

Xoá (delete): lấy bỏ đoạn văn bản từ bộ đệm mà không lưu lại. Kill: lưu văn bản đã lấy bỏ, nhờ đó có thể yank trở lại ở nơi khác.

Văn bản bị kill được lưu ở vòng kill (kill ring). Vòng kill giữ N kill cuối, mặc định N là 30, nhưng có thể thay đổi bằng cách thay giá trị cho biến kill-ring-max. Vòng kill đóng vai trò như một fifo khi bạn kill một cái gì đó (sau lần kill thứ 30, kill số 1 sẽ biến mất), nhưng như một cái vòng khi bạn yank chúng trở lại (có thể yank vòng quanh một cách tuần hoàn).

Kí tự

  • C-d, Delete: delete-char. Xoá kí tự bên phải (hoặc dưới, nếu con trỏ là khối chứa một kí tự) con trỏ.
  • DEL, BS: delete-backward-char. Xoá kí tự bên trái con trỏ.

Từ

  • M-d: kill-word. Kill đến cuối từ phía bên phải con trỏ (tới).
  • M-DEL: backward-kill-word. Kill đến đâu từ phía bên trái con trỏ (lui).

Dòng (ngang)

  • C-k: kill-line. Kill đến cuối dòng hiện tại, không bao gồm kí tự xuống dòng (newline). Vì vậy nếu từ đầu dòng, cần 2 lần C-k để kill toàn bộ dòng và đóng khoảng trắng.
  • C-u 0 C-k: kill-line. Xoá đến đầu dòng hiện tại, không bao gồm newline.
  • C-u -n C-k: kill-line. Xoá đến đầu của -n dòng trước.

Câu

  • M-k: kill-sentence. Kill đến cuối câu hiện tại, bao gồm các newline có trong câu.
  • C-u -1 M-k: kill-sentence. Kill đến đầu câu hiện tại, bao gồm các newline có trong câu.

Đoạn

Có các lệnh forward-kill-paragraph và backward-kill-paragraph, nhưng theo mặc định chúng không liên kết với phím nào.

Trang

Không có lệnh kill trang (nhưng xem Đánh dấu và vùng).

Bộ đệm

Lệnh kill-buffer không kill tất cả văn bản trong bộ đệm, nhưng kill toàn bộ cấu trúc dữ liệu bộ đệm: xem Đánh dấu và vùng.

Biểu thức S (cặp dấu ngoặc)

  • C-M-k: kill-sexp. Kill sexp sau con trỏ.
  • C-u -1 C-M-k: kill-sexp. Kill sexp trước con trỏ.

Có lệnh backward-kill-sexp, nhưng theo mặc định không liên kết với phím nào.

Hàm

Không có lệnh kill hàm (defuns) (nhưng xem Đánh dấu và vùng).

Yank

C-y (yank) lấy (yank) văn bản bị kill gần đây nhất.

M-y (yank-pop) di chuyển sang các văn bản ở các lần kill trước bằng cách thế văn bảng vừa được yank bằng văn bản ở lần kill trước nó. Các lần M-y tiếp theo sẽ di chuyển quanh vòng kill.

Vì Emacs chỉ có một vòng kill (chứ không phải một vòng cho mỗi bộ đệm), bạn có thể kill trong bộ đệm này và yank ở bộ đệm khác.

Sao chép và di chuyển văn bản

Emacs không có lệnh đặc biệt cho sao chép và di chuyển văn bản.

  • di chuyển văn bản: kill và yank trở lại ở nơi khác
  • sao chép văn bản: kill và yank ngay trở lại tại nơi vừa kill, rồi di chuyển đến nơi khác và yank lần nữa

Xem thêm các lệnh sao chép và di chuyển các vùng văn bản ngẫu nhiên (không phải là đối tượng văn bản – textual object) tại Đánh dấu và vùng.

Tìm và thay

Emacs có nhiều lệnh tìm và thay rất mạnh.

Tìm

  • C-s (isearch-forward): tìm kiếm luỹ tiến (incremental search): Emacs tìm kiếm tích luỹ số từ trong chuỗi bạn gõ vào. Để dùng việc tìm kiếm, gõ RET hoặc một lệnh nào khác. Lặp lại C-s để nhảy tới kết quả phù hợp kế tiếp; để nhảy ngược lại, gõ C-r; gõ DEL để xoá và thay đổi chuỗi đang tìm kiếm.
  • C-r (isearch-backward): tìm kiếm theo chiều lui. (Dùng C-r để tìm kết quả phù hợp kế tiếp và C-s để đổi chiều tìm kiếm.)

Tìm kiếm không luỹ tiến: C-s RET text RET, trong đó text là văn bản cần tìm.

Tìm kiếm theo từ (word search)C-s RET C-w word word word RET tìm kiếm một chuỗi gồm một hoặc nhiều từ, bất kể chúng được phân cách như thế nào (bằng chữ số hay kết hợp kí tự xuống dòng và khoảng trắng).

Emacs cũng có thể tìm kiếm (không) luỹ tiến với biểu thức chính quy (regular expressions).

Thay

query-replace (M-%): nhắc bạn nhập văn bản thay thế, và văn bản để thay thế cho nó, và rồi tìm và thay trong bộ đệm hiện tại. query-replace có tính tương tác: ở mỗi lần phù hợp, bạn được nhắc để quyết định sẽ làm gì với các tuỳ chọn sau:

  • SPC: Thực hiện thay thế.
  • DEL: Không thực hiện thay thế.
  • RET: Chấm dứt query-replace mà không thực hiện thay thế.
  • ESC: Giống như RET.
  • .: Thực hiện thay thế rồi chấm dứt query-replace.
  • !: Thực hiện thay thế lần này và tất cả những lần còn lại trong bộ đệm mà không hỏi (tức là không điều kiện).

Ngoài ra còn một số lệnh con cho lệnh query-replace.

Có một số lệnh thay thế khác nên xem qua, gồm replace-string (thay thế không điều kiện đơn giản), replace-regexp và query-replace-regexp (dùng biểu thức thường quy), và tags-query-replace (thay thế tất cả identifiers trong một bộ tập tin mã nguồn).

query-replace và các lệnh thay thế khác theo mặc định khéo về chữ hoa-thường. Thí dụ nếu bạn đang thay thế foo bằng bar, nếu Emacs tìm thấy Foo, nó sẽ thay bằng Bar; nếu tìm thấy FOO, nó sẽ thay bằng BAR, v.v.

Đánh dấu và vùng

Xác định vùng

Emacs có thể xử lí một vùng văn bản ngẫu nhiên cũng như các đối tượng văn bản (textual object) rõ ràng.

Vùng là văn bản nằm giữa điểm (point) và dấu (mark). Điểm thực ra là thuật ngữ Emacs gọi con trỏ. Còn dấu được thiết lập bằng lệnh C-@ (set-mark-command). Lệnh này thiết lập dấu ngay tại điểm đang đứng, và sau đó có thể di chuyển điểm để được vùng.

Mỗi bộ đệm có một điểm và dấu riêng biệt, nên có một vùng riêng biệt. (Cũng có thể không có dấu trong bộ đệm, và vì vậy không có vùng).

Vùng hoàn toàn như nhau bất kể điểm đến trước hay dấu đến trước.

Thông thường vùng không nhìn thấy (nhưng xem C-x C-x). Tuy nhiên nếu bạn chạy Emacs dưới hệ thống cửa sổ (windowing system), bạn có thể thi hành lệnh M-x transient-mark-mode để làm cho (bật/tắt) vùng thấy được.

Nhiều lệnh di chuyển điểm đi một khoảng cách (như M-< và C-s) và dấu được thiết lập tại vị trí mà chúng bắt đầu di chuyển từ đó. Bạn sẽ thấy “Mark set” ở vùng phản hồi khi điều này xảy ra.

Khi dùng Emacs dưới hệ thống cửa sổ như X, chuột có thể được dùng để quét vùng.

Có một số lệnh đặc biệt dùng để xác định vùng.

  • M-@: mark-word. Thiết lập vùng chứa từ kế tiếp, hoặc từ điểm đến cuối từ hiện tại, nếu đang ở giữa từ.
  • M-h: mark-paragraph. Thiết lập vùng chứa đoạn hiện tại.
  • C-M-@: mark-sexp. Thiết lập vùng chứa cùng sexp mà lệnh C-M-f sẽ di chuyển tới.
  • C-M-h: mark-defun. Thiết lập vùng chứa defun hiện tại.
  • C-x C-p: mark-page. Thiết lập vùng chứa trang hiện tại.
  • C-x h: mark-whole-buffer. Thiết lập vùng chứa toàn bộ bộ đệm.

Thao tác trong vùng

  • C-x C-x: exchange-point-and-mark. Tráo đổi điểm và vùng. Lặp lại nhanh lệnh này sẽ giúp dễ thấy phạm vi của vùng.
  • C-w: kill-region. Kill vùng. Khi đó nó sẽ vào vòng kill.
  • M-w: kill-ring-save. Lưu vùng hiện tại vào vòng kill mà không lấy bỏ khỏi bộ đệm. Điều này tương đương với gõ C-w C-y.
  • C-x C-i: indent-rigidly. Canh lề cứng vùng bởi số kí tự (cột) được cung cấp làm đối số số (mặc định là 1 cột).
  • C-x C-l: downcase-region. Chuyển toàn bộ văn bản trong vùng thành chữ thường. Theo mặc định lệnh này bị bất hoạt.
  • C-x C-u: upcase-region. Chuyển toàn bộ văn bản trong vùng thành chữ hoa. Theo mặc định lệnh này bị bất hoạt.
  • M-x fill-region: fill-region. Điền, nghĩa là canh thẳng lề với bờ phải không đều, tất cả các đoạn trong vùng.

Ngoài ra còn nhiều lệnh khác nữa.

Canh lề

Trong các chế độ ngôn ngữ lập trình, Emacs dùng phím TAB để tự động canh lề một dòng, tuỳ theo quy luật cho ngôn ngữ lập trình đó. Thí dụ ở C Mode (chế độ cho ngôn ngữ C) Emacs hiểu if, while, do, for, functions, switch, v.v và canh lề thích hợp. Bạn có thể thay đổi các canh lề theo ý thích cá nhân.

Chế độ

Cách chủ yếu để Emacs tuỳ biến lệnh cho các loại văn bản khác nhau là thông qua các chế độ (mode) chính (major) và phụ (minor). Mỗi bộ đệm có một chế độ chình và có thể có thêm vài hoặc không có chế độ phụ. Đôi khi Emacs tự động chọn chế độ chính, điển thình là dựa trên phần mở rộng của tên tập tin (thí dụ tập tin tận cùng bằng .c sẽ tự động vào C Mode; tập tin tận cùng bằng .tcl sẽ tự động vào Tcl Mode). Nhưng bạn có thể thiết lập chế độ theo ý mình cho bộ đệm hiện tại bằng cách dùng M-x majormodename-mode, thí dụ để vào chế độ dành cho Lisp, bạn gõ M-x lisp-mode.

Một số chế độ chính

  • Fundamental Mode: Chế độ căn bản mà quy chiếu theo đó để định nghĩa tất cả các chế độ chuyên biệt. Hoàn hảo cho soạn thảo bất cứ loại văn bản nào, chỉ không cung cấp các tính năng đặc biệt.
  • Text Mode: Để soạn thảo văn bản. Có các lệnh đặc biệt để kiểm tra chính tả, canh giữa cho dòng, v.v.
  • Outline Mode: Giống như Text Mode nhưng được thiết kế dùng cho các phác thảo (outline). Bổ sung folding của các mức phác thảo, v.v.
  • Lisp Mode: Để biên tập mã nguồn Common Lisp. Có liên kết tương tác đến Common Lisp interpreter trong một bộ đệm khác.
  • Tcl Mode: Để biên tập mã nguồn Tcl. Có liên kết tương tác đến Tcl interpreter trong một bộ đệm khác.
  • C Mode: Để biên tập mã nguồn C. Có canh lề đặc biệt, v.v.

Có nhiều chế độ chính khác, như HTML mode, SGML mode, TeX mode,… và một số chế độ rất đặc biệt (thí dụ các chế độ cho soạn thảo email. đọc tin Usernet, duyệt thư mục, duyệt World Wide Web, v.v).

Thông tin thêm

GNU Emacs FAQ (mirror 1: dạng Info Nodes, mirror 2)

GNU Emacs Manual (mirror 1: dạng Info Nodes)

Nguồn: Lâm Vĩnh Niên @ http://labang.sourceforge.net