Mercurial > hg > xemacs-beta
view etc/TUTORIAL.th @ 5353:38e24b8be4ea
Improve the lexical scoping in #'block, #'return-from.
lisp/ChangeLog addition:
2011-02-07 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el:
* bytecomp.el (byte-compile-initial-macro-environment):
Shadow `block', `return-from' here, we implement them differently
when byte-compiling.
* bytecomp.el (byte-compile-active-blocks): New.
* bytecomp.el (byte-compile-block-1): New.
* bytecomp.el (byte-compile-return-from-1): New.
* bytecomp.el (return-from-1): New.
* bytecomp.el (block-1): New.
These are two aliases that exist to have their own associated
byte-compile functions, which functions implement `block' and
`return-from'.
* cl-extra.el (cl-macroexpand-all):
Fix a bug here when macros in the environment have been compiled.
* cl-macs.el (block):
* cl-macs.el (return):
* cl-macs.el (return-from):
Be more careful about lexical scope in these macros.
* cl.el:
* cl.el ('cl-block-wrapper): Removed.
* cl.el ('cl-block-throw): Removed.
These aren't needed in code generated by this XEmacs. They
shouldn't be needed in code generated by XEmacs 21.4, but if it
turns out the packages do need them, we can put them back.
2011-01-30 Mike Sperber <mike@xemacs.org>
* font-lock.el (font-lock-fontify-pending-extents): Don't fail if
`font-lock-mode' is unset, which can happen in the middle of
`revert-buffer'.
2011-01-23 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (delete):
* cl-macs.el (delq):
* cl-macs.el (remove):
* cl-macs.el (remq):
Don't use the compiler macro if these functions were given the
wrong number of arguments, as happens in lisp-tests.el.
* cl-seq.el (remove, remq): Removed.
I added these to subr.el, and forgot to remove them from here.
2011-01-22 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-setq, byte-compile-set):
Remove kludge allowing keywords' values to be set, all the code
that does that is gone.
* cl-compat.el (elt-satisfies-test-p):
* faces.el (set-face-parent):
* faces.el (face-doc-string):
* gtk-font-menu.el:
* gtk-font-menu.el (gtk-reset-device-font-menus):
* msw-font-menu.el:
* msw-font-menu.el (mswindows-reset-device-font-menus):
* package-get.el (package-get-installedp):
* select.el (select-convert-from-image-data):
* sound.el:
* sound.el (load-sound-file):
* x-font-menu.el (x-reset-device-font-menus-core):
Don't quote keywords, they're self-quoting, and the
win from backward-compatibility is sufficiently small now that the
style problem overrides it.
2011-01-22 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (block, return-from): Require that NAME be a symbol
in these macros, as always documented in the #'block docstring and
as required by Common Lisp.
* descr-text.el (unidata-initialize-unihan-database):
Correct the use of non-symbols in #'block and #'return-from in
this function.
2011-01-15 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (concatenate): Accept more complicated TYPEs in this
function, handing the sequences over to #'coerce if we don't
understand them here.
* cl-macs.el (inline): Don't proclaim #'concatenate as inline, its
compiler macro is more useful than doing that.
2011-01-11 Aidan Kehoe <kehoea@parhasard.net>
* subr.el (delete, delq, remove, remq): Move #'remove, #'remq
here, they don't belong in cl-seq.el; move #'delete, #'delq here
from fns.c, implement them in terms of #'delete*, allowing support
for sequences generally.
* update-elc.el (do-autoload-commands): Use #'delete*, not #'delq
here, now the latter's no longer dumped.
* cl-macs.el (delete, delq): Add compiler macros transforming
#'delete and #'delq to #'delete* calls.
2011-01-10 Aidan Kehoe <kehoea@parhasard.net>
* dialog.el (make-dialog-box): Correct a misplaced parenthesis
here, thank you Mats Lidell in 87zkr9gqrh.fsf@mail.contactor.se !
2011-01-02 Aidan Kehoe <kehoea@parhasard.net>
* dialog.el (make-dialog-box):
* list-mode.el (display-completion-list):
These functions used to use cl-parsing-keywords; change them to
use defun* instead, fixing the build. (Not sure what led to me
not including this change in d1b17a33450b!)
2011-01-02 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (define-star-compiler-macros):
Make sure the form has ITEM and LIST specified before attempting
to change to calls with explicit tests; necessary for some tests
in lisp-tests.el to compile correctly.
(stable-union, stable-intersection): Add compiler macros for these
functions, in the same way we do for most of the other functions
in cl-seq.el.
2011-01-01 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (dolist, dotimes, do-symbols, macrolet)
(symbol-macrolet):
Define these macros with defmacro* instead of parsing the argument
list by hand, for the sake of style and readability; use backquote
where appropriate, instead of calling #'list and and friends, for
the same reason.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* x-misc.el (device-x-display):
Provide this function, documented in the Lispref for years, but
not existing previously. Thank you Julian Bradfield, thank you
Jeff Mincy.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* cl-seq.el:
Move the heavy lifting from this file to C. Dump the
cl-parsing-keywords macro, but don't use defun* for the functions
we define that do take keywords, dynamic scope lossage makes that
not practical.
* subr.el (sort, fillarray): Move these aliases here.
(map-plist): #'nsublis is now built-in, but at this point #'eql
isn't necessarily available as a test; use #'eq.
* obsolete.el (cl-delete-duplicates): Make this available for old
compiler macros and old code.
(memql): Document that this is equivalent to #'member*, and worse.
* cl.el (adjoin, subst): Removed. These are in C.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* simple.el (assoc-ignore-case): Remove a duplicate definition of
this function (it's already in subr.el).
* iso8859-1.el (char-width):
On non-Mule, make this function equivalent to that produced by
(constantly 1), but preserve its docstring.
* subr.el (subst-char-in-string): Define this in terms of
#'substitute, #'nsubstitute.
(string-width): Define this using #'reduce and #'char-width.
(char-width): Give this a simpler definition, it makes far more
sense to check for mule at load time and redefine, as we do in
iso8859-1.el.
(store-substring): Implement this in terms of #'replace, now
#'replace is cheap.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* update-elc.el (lisp-files-needed-for-byte-compilation)
(lisp-files-needing-early-byte-compilation):
cl-macs belongs in the former, not the latter, it is as
fundamental as bytecomp.el.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* cl.el:
Provde the Common Lisp program-error, type-error as error
symbols. This doesn't nearly go far enough for anyone using the
Common Lisp errors.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (delete-duplicates):
If the form has an incorrect number of arguments, don't attempt a
compiler macroexpansion.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (cl-safe-expr-p):
Forms that start with the symbol lambda are also safe.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (= < > <= >=):
For these functions' compiler macros, the optimisation is safe
even if the first and the last arguments have side effects, since
they're only used the once.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (inline-side-effect-free-compiler-macros):
Unroll a loop here at macro-expansion time, so these compiler
macros are compiled. Use #'eql instead of #'eq in a couple of
places for better style.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (notany, notevery): Avoid some dynamic scope
stupidity with local variable names in these functions, when they
weren't prefixed with cl-; go into some more detail in the doc
strings.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (side-effect-free-fns): #'remove, #'remq are
free of side-effects.
(side-effect-and-error-free-fns):
Drop dot, dot-marker from the list.
2010-11-17 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (coerce):
In the argument list, name the first argument OBJECT, not X; the
former name was always used in the doc string and is clearer.
Handle vector type specifications which include the length of the
target sequence, error if there's a mismatch.
* cl-macs.el (cl-make-type-test): Handle type specifications
starting with the symbol 'eql.
2010-11-14 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (eql): Don't remove the byte-compile property of this
symbol. That was necessary to override a bug in bytecomp.el where
#'eql was confused with #'eq, which bug we no longer have.
If neither expression is constant, don't attempt to handle the
expression in this compiler macro, leave it to byte-compile-eql,
which produces better code anyway.
* bytecomp.el (eq): #'eql is not the function associated with the
byte-eq byte code.
(byte-compile-eql): Add an explicit compile method for this
function, for cases where the cl-macs compiler macro hasn't
reduced it to #'eq or #'equal.
2010-10-25 Aidan Kehoe <kehoea@parhasard.net>
Add compiler macros and compilation sanity-checking for various
functions that take keywords.
* byte-optimize.el (side-effect-free-fns): #'symbol-value is
side-effect free and not error free.
* bytecomp.el (byte-compile-normal-call): Check keyword argument
lists for sanity; store information about the positions where
keyword arguments start using the new byte-compile-keyword-start
property.
* cl-macs.el (cl-const-expr-val): Take a new optional argument,
cl-not-constant, defaulting to nil, in this function; return it if
the expression is not constant.
(cl-non-fixnum-number-p): Make this into a separate function, we
want to pass it to #'every.
(eql): Use it.
(define-star-compiler-macros): Use the same code to generate the
member*, assoc* and rassoc* compiler macros; special-case some
code in #'add-to-list in subr.el.
(remove, remq): Add compiler macros for these two functions, in
preparation for #'remove being in C.
(define-foo-if-compiler-macros): Transform (remove-if-not ...) calls to
(remove ... :if-not) at compile time, which will be a real win
once the latter is in C.
(define-substitute-if-compiler-macros)
(define-subst-if-compiler-macros): Similarly for these functions.
(delete-duplicates): Change this compiler macro to use
#'plists-equal; if we don't have information about the type of
SEQUENCE at compile time, don't bother attempting to inline the
call, the function will be in C soon enough.
(equalp): Remove an old commented-out compiler macro for this, if
we want to see it it's in version control.
(subst-char-in-string): Transform this to a call to nsubstitute or
nsubstitute, if that is appropriate.
* cl.el (ldiff): Don't call setf here, this makes for a load-time
dependency problem in cl-macs.el
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* term/vt100.el:
Refer to XEmacs, not GNU Emacs, in permissions.
* term/bg-mouse.el:
* term/sup-mouse.el:
Put copyright notice in canonical "Copyright DATE AUTHOR" form.
Refer to XEmacs, not GNU Emacs, in permissions.
* site-load.el:
Add permission boilerplate.
* mule/canna-leim.el:
* alist.el:
Refer to XEmacs, not APEL/this program, in permissions.
* mule/canna-leim.el:
Remove my copyright, I've assigned it to the FSF.
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* gtk.el:
* gtk-widget-accessors.el:
* gtk-package.el:
* gtk-marshal.el:
* gtk-compose.el:
* gnome.el:
Add copyright notice based on internal evidence.
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* easymenu.el: Add reference to COPYING to permission notice.
* gutter.el:
* gutter-items.el:
* menubar-items.el:
Fix typo "Xmacs" in permissions notice.
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* auto-save.el:
* font.el:
* fontconfig.el:
* mule/kinsoku.el:
Add "part of XEmacs" text to permission notice.
2010-10-14 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (side-effect-free-fns):
* cl-macs.el (remf, getf):
* cl-extra.el (tailp, cl-set-getf, cl-do-remf):
* cl.el (ldiff, endp):
Tighten up Common Lisp compatibility for #'ldiff, #'endp, #'tailp;
add circularity checking for the first two.
#'cl-set-getf and #'cl-do-remf were Lisp implementations of
#'plist-put and #'plist-remprop; change the names to aliases,
changes the macros that use them to using #'plist-put and
#'plist-remprop directly.
2010-10-12 Aidan Kehoe <kehoea@parhasard.net>
* abbrev.el (fundamental-mode-abbrev-table, global-abbrev-table):
Create both these abbrev tables using the usual
#'define-abbrev-table calls, rather than attempting to
special-case them.
* cl-extra.el: Force cl-macs to be loaded here, if cl-extra.el is
being loaded interpreted. Previously other, later files would
redundantly call (load "cl-macs") when interpreted, it's more
reasonable to do it here, once.
* cmdloop.el (read-quoted-char-radix): Use defcustom here, we
don't have any dump-order dependencies that would prevent that.
* custom.el (eval-when-compile): Don't load cl-macs when
interpreted or when byte-compiling, rely on cl-extra.el in the
former case and the appropriate entry in bytecomp-load-hook in the
latter. Get rid of custom-declare-variable-list, we have no
dump-time dependencies that would require it.
* faces.el (eval-when-compile): Don't load cl-macs when
interpreted or when byte-compiling.
* packages.el: Remove some inaccurate comments.
* post-gc.el (cleanup-simple-finalizers): Use #'delete-if-not
here, now the order of preloaded-file-list has been changed to
make it available.
* subr.el (custom-declare-variable-list): Remove. No need for it.
Also remove a stub define-abbrev-table from this file, given the
current order of preloaded-file-list there's no need for it.
2010-10-10 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-constp) Forms quoted with FUNCTION are
also constant.
(byte-compile-initial-macro-environment): In #'the, if FORM is
constant and does not match TYPE, warn at byte-compile time.
2010-10-10 Aidan Kehoe <kehoea@parhasard.net>
* backquote.el (bq-vector-contents, bq-list*): Remove; the former
is equivalent to (append VECTOR nil), the latter to (list* ...).
(bq-process-2): Use (append VECTOR nil) instead of using
#'bq-vector-contents to convert to a list.
(bq-process-1): Now we use list* instead of bq-list
* subr.el (list*): Moved from cl.el, since it is now required to
be available the first time a backquoted form is encountered.
* cl.el (list*): Move to subr.el.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* test-harness.el (Check-Message):
Add an omitted comma here, thank you the buildbot.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* hash-table.el (hash-table-key-list, hash-table-value-list)
(hash-table-key-value-alist, hash-table-key-value-plist):
Remove some useless #'nreverse calls in these files; our hash
tables have no order, it's not helpful to pretend they do.
* behavior.el (read-behavior):
Do the same in this file, in some code evidently copied from
hash-table.el.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* info.el (Info-insert-dir):
* format.el (format-deannotate-region):
* files.el (cd, save-buffers-kill-emacs):
Use #'some, #'every and related functions for applying boolean
operations to lists, instead of rolling our own ones that cons and
don't short-circuit.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-initial-macro-environment):
* cl-macs.el (the):
Rephrase the docstring, make its implementation when compiling
files a little nicer.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* descr-text.el (unidata-initialize-unicodedata-database)
(unidata-initialize-unihan-database, describe-char-unicode-data)
(describe-char-unicode-data):
Wrap calls to the database functions with (with-fboundp ...),
avoiding byte compile warnings on builds without support for the
database functions.
(describe-char): (reduce #'max ...), not (apply #'max ...), no
need to cons needlessly.
(describe-char): Remove a redundant lambda wrapping
#'extent-properties.
(describe-char-unicode-data): Call #'nsubst when replacing "" with
nil in the result of #'split-string, instead of consing inside
mapcar.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* x-faces.el (x-available-font-sizes):
* specifier.el (let-specifier):
* package-ui.el (pui-add-required-packages):
* msw-faces.el (mswindows-available-font-sizes):
* modeline.el (modeline-minor-mode-menu):
* minibuf.el (minibuf-directory-files):
Replace the O2N (delq nil (mapcar (lambda (W) (and X Y)) Z)) with
the ON (mapcan (lambda (W) (and X (list Y))) Z) in these files.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (= < > <= >=):
When these functions are handed more than two arguments, and those
arguments have no side effects, transform to a series of two
argument calls, avoiding funcall in the byte-compiled code.
* mule/mule-cmds.el (finish-set-language-environment):
Take advantage of this change in a function called 256 times at
startup.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-function-form, byte-compile-quote)
(byte-compile-quote-form):
Warn at compile time, and error at runtime, if a (quote ...) or a
(function ...) form attempts to quote more than one object.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (byte-optimize-apply): Transform (apply 'nconc
(mapcar ...)) to (mapcan ...); warn about use of the first idiom.
* update-elc.el (do-autoload-commands):
* packages.el (packages-find-package-library-path):
* frame.el (frame-list):
* extents.el (extent-descendants):
* etags.el (buffer-tag-table-files):
* dumped-lisp.el (preloaded-file-list):
* device.el (device-list):
* bytecomp-runtime.el (proclaim-inline, proclaim-notinline)
Use #'mapcan, not (apply #'nconc (mapcar ...) in all these files.
* bytecomp-runtime.el (eval-when-compile, eval-and-compile):
In passing, mention that these macros also evaluate the body when
interpreted.
tests/ChangeLog addition:
2011-02-07 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
Test lexical scope for `block', `return-from'; add a
Known-Bug-Expect-Failure for a contorted example that fails when
byte-compiled.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Mon, 07 Feb 2011 12:01:24 +0000 |
parents | 3ecd8885ac67 |
children |
line wrap: on
line source
============================== GNUEMACS ภาษาญี่ปุ่น (Mule) เบื้องต้น ============================== หมายเหตุ: เอกสารฉบับเบื้องต้นนี้ ถูกเขียนขึ้นโดยยึดหลักที่ว่า "ลองเล่นเลยดีกว่าเรียนรู้" บรรทัดที่เริ่มต้นด้วย ">>" จะมีคำสั่งว่า ต่อไปจะให้ทำอะไร โดยทั่วไป การป้อนคำสั่งให้กับ Mule ทำได้โดยใช้ ปุ่มคอนโทรล (ปุ่มที่บนหน้าสัมผัส เขียนไว้ ว่า CTRL หรือ CTL) หรือ ปุ่ม META (โดยปกติ หมายถึงปุ่ม ESC) ในที่นี้ เราจะใช้สัญลักษณ์ต่อไป นี้ แทนการเขียนเต็ม ๆ ว่า CONTROL หรือ META C-<ตัวอักษร> หมายถึง ให้กดปุ่มคอนโทรลค้างไว้ แล้วกดปุ่ม <ตัวอักษร> ตัวอย่างเช่น C-f หมายถึง ให้กดปุ่มคอนโทรลค้างไว้ แล้วกดปุ่ม f <<Blank lines inserted here by startup of help-with-tutorial>> >> ตอนนี้ขอให้ลองกด C-v (View Next Screen ดูหน้าต่อไป) ดู เพื่อเลื่อนไปอ่านหน้า ต่อไป ต่อจากนี้เป็นต้นไป ทุกครั้งที่อ่านหน้าหนึ่ง ๆ จบขอให้ทำในทำนองเดียวกัน เพื่อเลื่อนไป ดูหน้าต่อไป ESC <ตัวอักษร> หมายถึง ให้กดปุ่ม ESC แล้วปล่อย หลังจากนั้นจึงกดปุ่ม <ตัวอักษร> ตาม หมายเหตุ: <ตัวอักษร> ไม่ว่าเป็นตัวใหญ่หรือตัวเล็ก จะให้ความหมายเหมือนกันเมื่อถูกใช้ใน คำสั่ง ถ้าหากมีปุ่ม META ให้กด ก็จะสามารถใช้การกด M-<ตัวอักษร> แทน การ ESC <ตัวอักษร> ได้ (คือให้กดปุ่ม META ค้างไว้ แล้วจึงกด <ตัวอักษร>) ข้อสำคัญ: เวลาจะเลิกใช้ Emacs ให้กด C-x C-c หรือในกรณีที่สั่ง Emacs จาก csh ก็สามารถใช้ suspend (หยุดชั่วคราว) ได้ การ suspend Emacs ทำได้โดย กด C-z ต่อจากนี้ ขอให้ป้อนคำสั่ง C-v ทุก ๆ ครั้งที่อ่านจบหนึ่งหน้า ภายในหน้าที่แล้วกับหน้าถัดไป จะมีเนื้อหาซ้ำกันอยู่บางบรรทัด ที่เป็นเช่นนี้ ก็เพื่อให้สามารถรู้ ได้ว่า เนื้อหาที่แสดงอยู่นั้น ต่อเนื่องกันอยู่ ก่อนอื่น จำเป็นจะต้องรู้วิธีการโยกย้ายตำแหน่งไปมา ภายในแฟ้มข้อมูลเสียก่อน ตามที่บอกไป แล้ว ก็คือ C-v ใช้สำหรับเลื่อนไปข้างหน้า ถ้าจะเลื่อนกลับที่เก่า ก็ให้กด ESC v >> ลองใช้ ESC v และ C-v เพื่อเลื่อนไปมาดู สักสองสามครั้ง สรุป === คำสั่ง สำหรับเลื่อนไปมาทีละหน้าภายในแฟ้มข้อมูล คือ C-v เลื่อนไปข้างหน้า หนึ่งหน้าจอ ESC v เลื่อนไปข้างหลัง หนึ่งหน้าจอ C-l เขียนหน้าจอใหม่ และในขณะเดียวกัน ก็ให้เลื่อนตำแหน่งของเคอร์เซอร์ (cursor) ไปอยู่ตรงกลางจอ >> ขอให้สังเกตดูว่า ในขณะนี้เคอร์เซอร์อยู่ที่ไหน พร้อมทั้งจำข้อความที่อยู่รอบข้างของ เคอร์เซอร์ด้วย แล้วลองกด C-l ดู ตรวจสอบดูว่า เคอร์เซอร์เลื่อนไปอยู่ที่ไหน ข้อความที่อยู่รอบข้างเปลี่ยนไปอย่างไร วิธีโยกย้ายเคอร์เซอร์ขั้นพื้นฐาน ======================= ตอนนี้ เราก็รู้วิธีโยกย้ายไปมาแบบทีละหน้าแล้ว ต่อไป ก็มาเรียนรู้วิธีโยกย้ายไปที่ตำแหน่งใด ตำแหน่งหนึ่งภายในหน้าเดียวกัน ซึ่งสามารถทำได้หลายวิธี วิธีหนึ่งก็คือให้ใช้คำสั่ง ไปบรรทัดก่อนหน้า (previous) ไปบรรทัดต่อไป (next) ไปด้านหน้า (forward) ไปด้านหลัง (backward) คำสั่ง เหล่านี้ ถูกตั้งไว้ที่ C-p C-n C-f และ C-b ตามลำดับ ซึ่งจะทำให้โยกย้ายไปมาได้ โดยเทียบกับ ตำแหน่งปัจจุบัน สรุปเขียนเป็นแผนภาพได้ดังนี้ บรรทัดที่แล้ว C-p : : ตัวอักษรด้านหลัง C-b .... ตำแหน่งเคอร์เซอร์ปัจจุบัน .... ตัวอักษรด้านหน้า C-f : : บรรทัดต่อไป C-n คำสั่งเหล่านี้ เอามาจากตัวอักษรตัวแรกของ คำว่า Previous Next Backward Forward ซึ่งจะช่วยให้จำได้ไม่ยาก คำสั่งเหล่านี้เป็นคำสั่งสำหรับการโยกย้ายขั้นพื้นฐาน ซึ่งต้องใช้อยู่เสมอ >> ลองกด C-n ดูหลาย ๆ ครั้ง เพื่อเลื่อนเคอร์เซอร์มายังบรรทัดนี้ (บรรทัดที่กำลังอ่าน อยู่นี้) >> ลองกด C-f ดูหลาย ๆ ครั้ง เพื่อเลื่อนเคอร์เซอร์ไปยังตรงกลางของบรรทัด แล้วลอง กด C-p เลื่อนขึ้นข้างบนดู สังเกตดูด้วยว่า ตำแหน่งของเคอร์เซอร์เปลี่ยนไปอย่างไร >> ลองกด C-b ขณะที่อยู่ที่ตำแหน่งหน้าสุดของบรรทัดดู สังเกตดูด้วยว่า เคอร์เซอร์เคลื่อน ไปอย่างไร จากนั้นให้กด C-b อีกสองสามครั้ง แล้วกด C-f เพื่อเลื่อนไปยังท้ายสุด ของบรรทัดดู เคอร์เซอร์จะเป็นอย่างไร ถ้ากดจนเลยท้ายบรรทัดไป เวลาที่เลื่อนเคอร์เซอร์ จนเลยบรรทัดแรกสุดหรือบรรทัดท้ายสุดของหน้าไป เคอร์เซอร์จะ เลื่อนไปยังบรรทัดต่อไปในทิศทางนั้น ๆ และปรับให้เคอร์เซอร์กลับมาอยู่บนหน้าจอเสมอ >> ลองกด C-n เพื่อเลื่อนเคอร์เซอร์ให้เลยบรรทัดล่างสุดของหน้าจอดู แล้วสังเกตดูว่า เกิดอะไรขึ้น และตำแหน่งของเคอร์เซอร์เปลี่ยนไปอย่างไร ถ้ารู้สึกว่าการขยับไปทีละตัวอักษรนั้นอืดอาดยืดยาด ก็สามารถใช้การเลื่อนเคอร์เซอร์ไปทีละคำ ได้ กด ESC f เพื่อให้เลื่อนไปข้างหน้าหนึ่งคำ และ ESC b เพื่อให้เลื่อนไปข้างหลังหนึ่งคำ หมายเหตุ: สำหรับภาษาไทย ยังไม่สามารถแบ่งแยกตำแหน่งของคำได้ถูกต้อง จึงไม่ สามารถใช้สองคำสั่งนี้ได้ >> ลองกด ESC f และ ESC b ลองดูหลาย ๆ ครั้ง และลองใช้ร่วมกับ C-f กับ C-b ดู ด้วย จะสังเกตเห็นได้ว่า ESC f และ ESC b มีรูปแบบคล้ายคลึงกับ C-f และ C-b โดยส่วนใหญ่ ESC <ตัวอักษร> จะใช้เกี่ยวกับการจัดการข้อความ ส่วน C-<ตัวอักษร> จะใช้กับสิ่งที่เป็นพื้นฐานมาก กว่า (เช่น ตัวอักษร หรือ บรรทัด) C-a กับ C-e เป็นคำสั่งน่าจะรู้ไว้ เพราะค่อนข้างสะดวกดีทีเดียว C-a ใช้สำหรับเลื่อน เคอร์เซอร์ไปที่ตำแหน่งหน้าสุดของบรรทัด C-e สำหรับเลื่อนไปที่ตำแหน่งท้ายสุดของบรรทัด >> ลองกด C-a ดูสองครั้ง หลังจากนั้นให้กด C-e ดูสองครั้ง แล้วลองสังเกตดูว่า การ กดคำสั่งนี้มากกว่าสองครั้ง จะไม่ช่วยให้เลื่อนเคอร์เซอร์ไปไหนได้มากกว่านั้นอีก ยังมีอีกสองคำสั่ง สำหรับการเลื่อนเคอร์เซอร์แบบง่าย ๆ คือ คำสั่ง ESC < สำหรับการเลื่อน เคอร์เซอร์ไปที่ตำแหน่งแรกสุดของแฟ้มข้อมูล และคำสั่ง ESC > สำหรับการเลื่อนไปตำแหน่งท้ายสุด เราเรียกตำแหน่งของข้อความ ที่มีเคอร์เซอร์อยู่ว่า "จุด (point)" หรือพูดอีกอย่างหนึ่งได้ ว่า เคอร์เซอร์ เป็นสิ่งที่บอกให้เรารู้ว่า จุด อยู่ตรงไหนของหน้าจอ สรุปคำสั่งสำหรับการเคลื่อนไปมา ซึ่งรวมการเคลื่อนที่ในหน่วยของคำ หน่วยของบรรทัดไว้ด้วย ได้ดังนี้ C-f ไปข้างหน้าหนึ่งตัวอักษร C-b กลับข้างหลังหนึ่งตัวอักษร ESC f ไปข้างหน้าหนึ่งคำ ESC b กลับข้างหลังหนึ่งคำ C-n เลื่อนไปบรรทัดต่อไป C-p เลื่อนไปบรรทัดที่แล้ว ESC ] เลื่อนไปตำแหน่งท้ายสุดของย่อหน้า (paragraph) ESC [ เลื่อนไปตำแหน่งแรกสุดของย่อหน้า C-a เลื่อนไปตำแหน่งแรกสุดของบรรทัด C-e เลื่อนไปตำแหน่งท้ายสุดของบรรทัด ESC < เลื่อนไปตำแหน่งแรกสุดของแฟ้มข้อมูล ESC > เลื่อนไปตำแหน่งท้ายสุดของแฟ้มข้อมูล >> ลองใช้คำสั่งแต่ละคำสั่งดู คำสั่งเหล่านี้เป็นคำสั่งที่ใช้กันบ่อยสุด คำสั่งสองคำสั่งหลัง จะเลื่อนเคอร์เซอร์ ไปยังที่ที่ค่อนข้างไกล ให้ลองใช้คำสั่ง C-v และ ESC v เพื่อ เลื่อนเคอร์เซอร์กลับมาที่ตรงนี้ สำหรับคำสั่งอื่น ๆ ของ Emacs ก็เช่นกัน คำสั่งเหล่านี้จะสามารถเพิ่มตัวเลือก (argument) เพื่อกำหนด จำนวนครั้ง ในการปฏิบัติงานได้ การกำหนดจำนวนครั้ง ทำได้โดยกด C-u แล้วตาม ด้วยจำนวนครั้งที่ต้องการก่อน แล้วจึงค่อยกดคำสั่งตาม ตัวอย่างเช่น คำสั่ง C-u 8 C-f หมายถึง ให้เลื่อนไปข้างหน้า 8 ตัวอักษร >> ให้ลองกำหนดจำนวนครั้งที่เหมาะสมสำหรับคำสั่ง C-n หรือ C-p เพื่อเลื่อนเคอร์เซอร์ ให้มาอยู่ใกล้บรรทัดนี้ให้มากที่สุดเท่าที่จะทำได้ ในการเลื่อนเคอร์เซอร์ครั้งเดียว สำหรับ C-v และ ESC v จะได้ผลแตกต่างไปสักเล็กน้อย ในกรณีนี้ จะเป็นการเลื่อนหน้าจอ ขึ้นลง ตามจำนวนบรรทัดแทน >> ลองกด C-u 3 C-v ดู เลื่อนกลับที่เก่าได้โดย C-u 3 ESC v คำสั่งยกเลิก ========= คำสั่ง C-g ใช้สำหรับสั่งยกเลิกคำสั่งต่าง ๆ ที่ต้องการการป้อนข้อมูลเพิ่มเติม ตัวอย่างเช่น ระหว่างที่ใส่ตัวเลือก (argument) อยู่ หรือระหว่างคำสั่งที่ต้องการกดปุ่มมากกว่า 2 ปุ่มขึ้นไป ถ้า หากต้องการยกเลิก ก็ให้กด C-g >> ลองกำหนดจำนวนครั้งให้เป็น 100 โดยการกด C-u 100 แล้วกด C-g ดู หลังจากนั้น ให้ลองกด C-f ดู แล้วสังเกตดูว่าเคอร์เซอร์เลื่อนไปกี่ตัวอักษร หรือตอนที่พลาดไปกด ESC โดยไม่ตั้งใจ ก็สามารถกด C-g ยกเลิกได้ ข้อผิดพลาด (Error) ================ ในบางครั้ง อาจจะมีการสั่งปฏิบัติงานบางอย่าง ที่ Emacs ยอมรับไม่ได้เกิดขึ้น ตัวอย่างเช่น การกดคำสั่งคอนโทรลบางคำสั่ง ที่ไม่ได้กำหนดไว้ใน Emacs ก็จะทำให้ Emacs ส่งเสียงเตือน และแสดงผลที่บรรทัดล่างสุดของจอ บอกว่าผิดพลาดอย่างไร คำสั่งบางคำสั่งที่เขียนไว้ในเอกสารฉบับนี้ อาจใช้ไม่ได้กับ Emacs บางรุ่น (version) ซึ่งจะ ทำให้มีการแสดงผลข้อผิดพลาด (error) ขึ้น ในกรณีนี้ ขอให้กดปุ่มอะไรก็ได้ เพื่อเลื่อนไปยังส่วน ต่อไป วินโดว์ (Window) ============== Emacs สามารถเปิดวินโดว์ได้พร้อมกันหลายวินโดว์ และใช้วินโดว์เหล่านั้นแสดงผลข้อความ ต่าง ๆ ตามต้องการได้ ก่อนอื่น ก็ควรจะทำความรู้จักกับคำสั่ง ที่ใช้สำหรับการลบวินโดว์ส่วนเกิน ในเวลาที่แสดงผลลัพธ์ของคำสั่งบางคำสั่ง หรือ Help ออกเสียก่อน C-x 1 ทำให้เป็นวินโดว์เดียว คำสั่ง C-x 1 ใช้สำหรับลบวินโดว์อื่น แล้วขยายวินโดว์ที่มีเคอร์เซอร์อยู่ ให้เต็มจอเป็น วินโดว์เดียว >> ให้เลื่อนเคอร์เซอร์มาที่บรรทัดนี้ แล้วกด C-u 0 C-l >> ลองกด C-h k C-f ดู แล้วสังเกตดูว่าวินโดว์นี้เปลี่ยนไปอย่างไร เมื่อมีวินโดว์ใหม่ซึ่ง อธิบายวิธีใช้คำสั่ง C-f ปรากฏขึ้น >> ลองกด C-x 1 เพื่อลบวินโดว์ที่โผล่ขึ้นมาใหม่ ออก การแทรก (insert) และ การลบ (delete) =================================== บน Emacs เราจะสามารถพิมพ์ตัวอักษรเข้าไปได้เลย เมื่อต้องการพิมพ์ข้อความ Emacs จะ ถือว่าตัวหนังสือที่มองเห็นได้ทุกตัว (เช่น 'A' '7' '*' 'ก' และอื่น ๆ) เป็นข้อความที่ต้องการจะ แทรก (insert) เข้าไปตรง ๆ เมื่อจะจบบรรทัด ให้กด <Return> เพื่อเติมอักษรขึ้นบรรทัดใหม่ (linefeed character) แทรกเข้าไป ให้กด <Delete> เมื่อต้องการจะลบตัวอักษรที่เพิ่งพิมพ์เข้าไป <Delete> หมายถึงปุ่มเขียน บนผิวหน้าไว้ว่า "Delete" หรือบางทีอาจจะเขียนไว้ "Rubout" ก็ได้ โดยทั่วไป <Delete> ใช้สำหรับลบตัวอักษรที่อยู่ก่อนหน้าตำแหน่งเคอร์เซอร์ปัจจุบัน >> ลองพิมพ์ตัวอักษรเข้าไปหลาย ๆ ตัว แล้วใช้ <Delete> ลบตัวอักษรเหล่านั้นทิ้ง >> ลองพิมพ์ข้อความลงไปให้เกินขอบขวา (right margin) เวลาที่พิมพ์ข้อความเข้าไป ยาวเกินความกว้างของหนึ่งบรรทัด บรรทัดนั้นก็จะ "ถูกต่อ" ให้ยาวเกินหนึ่งหน้าจอ โดยใส่เครื่องหมาย '\' ไว้ที่ขอบขวาสุด เพื่อบอกให้รู้ว่าบรรทัดนี้ยังมีต่อ Emacs จะ เลื่อน (scroll) หน้าจอเพื่อให้เห็นตำแหน่งที่กำลังแก้ไขอยู่ได้อย่างชัดเจน ถ้าหาก ขอบขวาหรือขอบซ้ายของมีเครื่องหมาย '\' อยู่ ก็เป็นการบอกให้รู้ว่า บรรทัดนั้นยังมีต่อ ไปในทิศทางนั้น ๆ ลองปฏิบัติดูเลย คงจะช่วยให้เข้าใจง่ายกว่าการอธิบายด้วยตัวหนังสือ >> ให้ขยับเคอร์เซอร์ไปไว้บนบรรทัดซึ่งถูกต่อให้ยาวเกินหนึ่งหน้าจอ ที่เพิ่งป้อนเข้าไปเมื่อ สักครู่นี้ แล้วใช้ C-d ลบข้อความออกบางส่วน จนความยาวของข้อความอยู่ภายในหนึ่ง บรรทัด สังเกตดูว่าเครื่องหมาย '\' จะหายไป >> ให้เลื่อนเคอร์เซอร์ไปไว้ที่ตำแหน่งแรกสุดของบรรทัด แล้วกด <Delete> ดู การทำ แบบนี้ จะทำให้สัญลักษณ์คั่นระหว่างบรรทัดถูกลบออกไป บรรทัดนั้นก็จะถูกเอาไปต่อกับ บรรทัดก่อนหน้านั้น รวมกันเป็นบรรทัดยาวบรรทัดเดียว และอาจจะมีสัญลักษณ์ต่อบรรทัด ปรากฏขึ้น >> ให้กด <Return> เพื่อเพิ่ม ตัวอักษรขึ้นบรรทัดใหม่ กลับไปอย่างเดิม คำสั่งส่วนใหญ่ของ Emacs จะสามารถกำหนดจำนวนครั้งที่ต้องการให้ปฏิบัติได้ รวมทั้งการ แทรก (insert) ตัวอักษรด้วย >> ลองป้อนคำสั่ง C-u 8 * ดู สังเกตดูว่าเกิดอะไรขึ้น ถ้าต้องการจะเพิ่มบรรทัดว่าง ๆ (blank line) ระหว่างสองบรรทัด ให้เลื่อนไปที่ตำแหน่ง แรกสุดของบรรทัดที่สอง แล้วกด C-o >> ให้เลื่อนไปที่ตำแหน่งแรกสุดของบรรทัดใดก็ได้ แล้วลองกด C-o ดู ถึงตรงนี้ เราก็ได้เรียนวิธีพื้นฐานสำหรับการป้อนข้อความ และการแก้ที่ผิดแล้ว นอกจากจะ ลบได้ทีละตัวอักษรแล้ว ยังมีคำสั่งซึ่งสามารถใช้ลบได้ในเป็นคำ ๆ หรือเป็นบรรทัด ๆ อีกด้วย สรุป คำสั่งสำหรับการลบได้ดังนี้ <Delete> ลบตัวอักษรที่อยู่หน้าเคอร์เซอร์ C-d ลบตัวอักษรที่อยู่ที่เคอร์เซอร์ ESC <Delete> ลบคำที่อยู่หน้าเคอร์เซอร์ ESC d ลบคำตั้งแต่ตำแหน่งที่เคอร์เซอร์อยู่ C-k ลบบรรทัดตั้งแต่ตำแหน่งที่เคอร์เซอร์อยู่ ในบางครั้ง เราอาจต้องการจะเอาส่วนที่ลบไปกลับคืนมา โปรแกรม Emacs จะจำส่วนที่ลบ ออกไว้ เวลาที่ลบข้อความในหน่วยที่มากกว่าหนึ่งตัวอักษร ให้ใช้คำสั่ง C-y เวลาที่ต้องการจะเอา ข้อความกลับคืน สิ่งที่ควรระวังก็คือ C-y ไม่ใช่ใช้ได้เพียงแค่ตำแหน่งที่ลบข้อความออกเท่านั้น แต่จะ ใช้กับตำแหน่งใดก็ได้ C-y เป็นคำสั่งสำหรับแทรกข้อความที่เก็บไว้ ลงในตำแหน่งที่มีเคอร์เซอร์อยู่ เราสามารถใช้ความสามารถนี้ในการเคลื่อนย้ายข้อความได้ คำสั่งสำหรับการลบมีอยู่สองแบบคือ คำสั่ง "Delete" กับ คำสั่ง "Kill" คำสั่ง "Kill" จะเก็บส่วนลบออกไว้ แต่คำสั่ง "Delete" จะไม่เก็บ แต่ถ้าหากใช้คำสั่งนี้หลาย ๆ ครั้ง ก็จะเก็บ ส่วนที่ลบออกไว้ให้ >> ให้กด C-n สักสองสามครั้ง เพื่อเลื่อนไปยังที่ที่เหมาะสมบนหน้าจอ แล้วลองกด C-k เพื่อ ลบบรรทัดนั้นออกดู เมื่อกด C-k ครั้งแรก ข้อความในบรรทัดนั้นจะถูกลบออก และเมื่อกดอีก C-k อีกครั้ง บรรทัด นั้นเองทั้งบรรทัดก็จะถูกลบออกไปด้วย แต่ถ้ากำหนดจำนวนครั้งให้กับคำสั่ง C-k ก็จะหมายถึง ให้ลบ บรรทัดออก (ทั้งเนื้อหาและตัวบรรทัด) เป็นจำนวนบรรทัด เท่ากับจำนวนครั้งที่กำหนด บรรทัดที่เพิ่งลบออกไป จะถูกเก็บไว้ และสามารถนำกลับคืนมาได้ โดยใช้คำสั่ง C-y >> ลองกด C-y ดู ข้อความที่ถูกลบออก โดยการกด C-k หลาย ๆ ครั้ง จะถูกเก็บรวบรวมไว้ และสามารถนำ กลับมาทั้งหมดได้ในครั้งเดียว โดยการกด C-y >> ลองกด C-k ดูหลาย ๆ ครั้ง >> คำสั่งสำหรับเรียกข้อความกลับมา คือ C-y ก่อนอื่นให้เลื่อนเคอร์เซอร์ลงไปข้างล่าง สักสองสามบรรทัด แล้วลองกด C-y ดู ก็จะสามารถคัดลอก (copy) ข้อความได้ ถ้าตอนนี้เก็บข้อความอะไรบางอย่างไว้ แล้วลบข้อความอื่นเพิ่มเข้าไปอีก จะเกิดอะไรขึ้น ผลลัพธ์คือ C-y จะเรียกคืนได้แค่เพียงข้อความที่ลบออกครั้งล่าสุดเท่านั้น >> ลองลบบรรทัดดูหนึ่งบรรทัด แล้วเลื่อนเคอร์เซอร์ไปที่อื่น แล้วลบบรรทัดออกดูอีกหนึ่ง บรรทัด ลองกด C-y ดู แล้วสังเกตดูว่าจะได้แค่เพียงบรรทัดที่สองคืนเท่านั้น การอันดู (UNDO) ============= เวลาที่แก้ไขข้อความบางอย่าง แล้วต้องการจะเปลี่ยนกลับให้เป็นอย่างเดิม ก็สามารถทำได้ทุก เมื่อด้วยคำสั่ง C-x u โดยปกติ จะใช้สำหรับยกเลิกคำสั่ง ที่ป้อนเข้าไปโดยไม่ตั้งใจ สามารถใช้ คำสั่งนี้กี่ครั้งก็ได้ตามต้องการ >> ลองลบบรรทัดนี้ออกดู ด้วยคำสั่ง C-k แล้วเรียกกลับคืนมาด้วย C-x u คำสั่ง C-_ ก็เป็นคำสั่งอันดูอีกอันหนึ่ง ความสามารถเหมือนกับคำสั่ง C-x u สามารถกำหนดจำนวนครั้งให้คำสั่ง C-_ และ C-x u ได้ แฟ้มข้อมูล (File) ============== เราจำเป็นต้องเก็บรักษา (save) ข้อความที่แก้ไขไว้ในแฟ้มข้อมูล ถ้าต้องการจะให้สิ่งที่ แก้ไขเปลี่ยนไปอย่างถาวร ไม่เช่นนั้น สิ่งที่แก้ไขไปก็จะหายไป ทันทีที่เลิกการใช้ Emacs แฟ้มข้อมูลที่มองเห็นอยู่ คือสิ่งที่บันทึกสิ่งที่กำลังแก้ไขอยู่ หรือพูดง่าย ๆ ก็คือแฟ้มข้อมูลที่มองเห็น อยู่คือตัวแฟ้มข้อมูลที่กำลังแก้ไขอยู่ แต่จนกว่าแฟ้มข้อมูลจะถูกเก็บรักษา (save) ลงไป แฟ้มข้อมูลที่ถูกแก้ไขอยู่ จะไม่ถูกเขียนทับ ลงไปอย่างเด็ดขาด อันนี้เพื่อเป็นการป้องกันการเขียนทับแฟ้มข้อมูลที่แก้ไขไปแบบครึ่ง ๆ กลาง ๆ โดยไม่ได้ตั้งใจ นอกจากนี้ เพื่อเป็นการป้องกันการเก็บรักษา (save) สิ่งที่แก้ไขผิดไปโดยไม่ตั้งใจ Emacs จะเปลี่ยนชื่อแฟ้มข้อมูลต้นฉบับเก็บไว้ให้ ก่อนการเก็บรักษา หมายเหตุ: Emacs ยังมีการป้องกันอุบัติเหตุที่คาดไม่ถึง โดยการเก็บรักษาแฟ้มข้อมูลที่กำลัง แก้ไขอยู่เป็นระยะ ๆ โดยใช้ชื่อแฟ้มข้อมูลต่างกัน ด้วยวิธีนี้ จะทำให้สามารถลด ความเสียหายที่อาจเกิดขึ้นได้ ให้น้อยที่สุดเท่าที่จะทำได้ ตรงส่วนล่างของจอ จะมีบรรทัดโหมด (mode line) ในลักษณะข้างล่างแสดงอยู่ (ตัวอย่าง) [--]J:--**-Mule: TUTORIAL.th (Fundamental) ---55%-------------- ฉบับสำเนาของ Tutorial ของ Emacs ที่กำลังอ่านอยู่นี้ชื่อ TUTORIAL.th เวลาที่สั่งให้หา แฟ้มข้อมูลหรือ find-file (ค้นหาแฟ้มข้อมูล แล้วอ่านเข้ามาในบัฟเฟอร์) ก็จะแสดงชื่อแฟ้มข้อมูลไว้ ตรงส่วน TUTORIAL.th ตัวอย่างเช่น ถ้าสั่งให้หาแฟ้มข้อมูลชื่อ new-file บรรทัดโหมดก็จะแสดง ผลว่า "Mule: new-file" หมายเหตุ: จะมีคำอธิบายเพิ่มเติมเกี่ยวกับบรรทัดโหมด (mode line) ในตอนหลัง คำสั่งให้หาแฟ้มข้อมูล และคำสั่งให้เก็บรักษาแฟ้มข้อมูล มีลักษณะแตกต่างจากคำสั่งที่ผ่าน ๆ มา ตรงที่ ประกอบไปด้วย 2 ตัวอักษร คือต้องกดคำสั่งบางอย่าง ตามหลังคำสั่ง C-x ซึ่งหมายถึงคำสั่ง เกี่ยวกับแฟ้มข้อมูล และอีกจุดหนึ่ง แต่แตกต่างจากคำสั่งที่ผ่านมาคือ เวลาสั่งให้ค้นหาแฟ้มข้อมูล เราจะถูก Emacs ถามชื่อของแฟ้มข้อมูลนั้น ๆ เราเรียกคำสั่งเหล่านั้นว่า คำสั่งประเภทที่ถามตัวเลือก (argument) จากเทอร์มินัล หมายเหตุ: ในที่นี้ ตัวเลือก (argument) คือชื่อแฟ้มข้อมูล C-x C-f สั่งให้หา (find) แฟ้มข้อมูล แล้ว Emacs จะถามชื่อของแฟ้มข้อมูล โดยปรากฏขึ้นที่ส่วนล่างของจอ เราเรียกส่วนที่ให้ป้อน ชื่อแฟ้มข้อมูลนั้นว่า มินิบัฟเฟอร์ (mini buffer) มินิบัฟเฟอร์จะถูกใช้งานในลักษณะนี้ มินิบัฟเฟอร์ จะหมดหน้าที่และหายไป หลังจากที่ป้อนชื่อแฟ้มข้อมูล แล้วกดปุ่ม <Return> >> ลองกด C-x C-f แล้วตามด้วย C-g ดู เป็นการสั่งยกเลิกเนื้อหาในมินิบัฟเฟอร์ หรือ ยกเลิกคำสั่ง C-x C-f ดังนั้น Emacs จะไม่ค้นหาแฟ้มข้อมูลใด ๆ คราวนี้ มาลองเก็บรักษาแฟ้มข้อมูลดู เวลาที่ต้องการเก็บรักษาสิ่งที่แก้ไขมาจนถึงตอนนี้ ก็ให้ใช้ คำสั่งดังนี้ C-x C-s เก็บรักษา (save) แฟ้มข้อมูล แล้วเนื้อหาที่อยู่ใน Emacs ก็จะถูกเขียนลงไปที่แฟ้มข้อมูล เวลาเก็บรักษาแฟ้มข้อมูล แฟ้มข้อมูล ต้นฉบับจะไม่สูญหายไป แต่จะถูกเก็บไว้ในชื่อใหม่ ซึ่งได้มาจากชื่อเก่าที่ต่อท้ายด้วย '~' หลังจากที่เก็บรักษาแฟ้มข้อมูลเสร็จแล้ว Emacs ก็จะแสดงชื่อแฟ้มข้อมูลที่เก็บให้ดู >> ลองกด C-x C-x เพื่อเก็บรักษาสำเนาของ Tutorial นี้ดู ก็จะเห็นว่า ที่ส่วนล่าง ของจอ มีข้อความว่า "Wrote ...../TUTORIAL.th" ปรากฏขึ้น เวลาที่จะสร้างแฟ้มข้อมูลใหม่ ก็ให้ทำราวกับว่าจะค้นหา (find-file) แฟ้มข้อมูลเก่าซึ่งมี อยู่ก่อนหน้านี้แล้ว แล้วพิมพ์ข้อความลงไปในแฟ้มข้อมูลที่หาเจอ และเวลาที่สั่งเก็บรักษาแฟ้มข้อมูลเท่านั้น คือตอนที่ Emacs จะเก็บเนื้อหาที่แก้ไขมาทั้งหมด ลง ในแฟ้มข้อมูลเป็นครั้งแรก บัฟเฟอร์ (Buffer) =============== ถ้าหากสั่งให้หาแฟ้มข้อมูลอันที่สอง ด้วยคำสั่ง C-x C-f เนื้อหาของแฟ้มข้อมูลแรก ก็จะยังคง ถูกเก็บรักษาอยู่ใน Emacs สิ่งที่เก็บรักษาแฟ้มข้อมูลที่อ่านเข้ามา ซึ่งอยู่ภายใน Emacs เรียกว่า บัฟเฟอร์ (Buffer) เวลาที่อ่านแฟ้มข้อมูลใหม่เข้ามา Emacs ก็จะสร้างบัฟเฟอร์ใหม่ ขึ้นมาภายใน ถ้าต้องการจะดูรายการของบัฟเฟอร์ ที่ถูกเก็บรักษาอยู่ภายใน Emacs ก็ให้กดคำสั่ง C-x C-b >> ลองกด C-x C-b ดู สังเกตดูว่าแต่ละบัฟเฟอร์มีชื่อว่าอะไร และถูกตั้งชื่อไว้ว่า อย่างไร ใน Emacs มีบางบัฟเฟอร์ ที่ไม่มีคู่กับแฟ้มข้อมูลจริง ๆ ตัวอย่างเช่น ไม่มีแฟ้มข้อมูลที่มีชื่อว่า "*Buffer List*" อยู่จริง ๆ แต่เป็นบัฟเฟอร์ที่สร้างขึ้นมาเพื่อแสดงรายการบัฟเฟอร์ โดยคำสั่ง C-x C-b ข้อความทุกข้อความที่ปรากฏอยู่ในวินโดว์ของ Emacs นั้น จะอยู่ในบัฟเฟอร์ใดบัฟเฟอร์หนึ่งเสมอ >> ลองกด C-x 1 เพื่อลบรายการบัฟเฟอร์ออกดู การเรียกแฟ้มข้อมูลอื่นขึ้นมาแก้ไข ตอนที่กำลังแก้ไขแฟ้มข้อมูลหนึ่งอยู่นั้น จะไม่ทำให้แฟ้มข้อมูล แรกถูกเก็บรักษา สิ่งที่แก้ไขไปในแฟ้มข้อมูลแรกจะถูกบันทึกไว้ในบัฟเฟอร์ของแฟ้มข้อมูลนั้น เท่านั้น การสร้างบัฟเฟอร์ใหม่ขึ้น สำหรับแก้ไขแฟ้มข้อมูลอันที่สอง แล้วแก้อะไรบางอย่างในบัฟเฟอร์นั้น จะไม่มีผลใด ๆ ต่อบัฟเฟอร์ของแฟ้มข้อมูลอันที่หนึ่งทั้งสิ้น จุดนี้ทำให้สามารถเก็บแฟ้มข้อมูลแรกไว้เพื่อ แก้ไขในตอนหลัง แต่เวลาที่ต้องการจะเก็บรักษา (save) บัฟเฟอร์ลงไปในแฟ้มข้อมูล ด้วยคำสั่ง C-x C-s นั้น จะต้องสวิทซ์ไปยังบัฟเฟอร์ที่ต้องการจะเก็บ ด้วยคำสั่ง C-x C-f ซึ่งค่อนข้างยุ่งยาก เรามีคำสั่งซึ่ง ใช้สำหรับการนี้โดยเฉพาะ คือ C-x s เก็บรักษา (save) ทุกบัฟเฟอร์ที่มีอยู่ C-x s จะเก็บรักษาทุกบัฟเฟอร์ที่ถูกแก้ไขเนื้อหาไป ลงในแฟ้มข้อมูล โดยจะถามก่อนว่าจะให้ เก็บบัฟเฟอร์นี้ไหม y หรือ n กับบัฟเฟอร์แต่ละบัฟเฟอร์ คำถามจะปรากฏในส่วนล่างของหน้าจอ ดัง ตัวอย่างนี้ Save file /usr/private/yours/TUTORIAL.th? (y or n) การขยายคำสั่ง (extension) ======================= ในโปรแกรม Editor นี้ มีจำนวนคำสั่งมากกว่า จำนวนคำสั่งซึ่งสามารถกดได้โดยปุ่มคอนโทรล หรือปุ่ม META ได้หมด คำสั่งขยาย (eXtend) มีไว้เพื่อให้สามารถใช้คำสั่งเหล่านี้ได้หมด มีอยู่ 2 แบบ ดังนี้ C-x ขยายเพิ่มด้วยตัวอักษร สำหรับกดตัวอักษรตามเข้าไป 1 ตัว ESC x ขยายเพิ่มด้วยชื่อคำสั่ง สำหรับกดชื่อคำสั่งตามเข้าไปทั้งหมด คำสั่งประเภทนี้ ก็เป็นคำสั่งที่มีประโยชน์ แต่ส่วนใหญ่จะถูกเรียกใช้ น้อยครั้งกว่าคำสั่งทั่วไป ตัวอย่างเช่น คำสั่งหาแฟ้มข้อมูล (find) C-x C-f คำสั่งเก็บรักษาแฟ้มข้อมูล (save) C-x C-s คำสั่ง C-x C-c (เลิก Editor) ต่างก็เป็นหนึ่งในคำสั่งเหล่านี้ คำสั่ง C-z เป็นคำสั่งที่ใช้ในในการออกจาก Emacs ค่อนข้างบ่อย คำสั่งนี้จะไม่ยกเลิก Emacs เลยทีเดียว แต่จะหยุด Emacs ไว้ชั่วคราว เพื่อให้สามารถกลับไปใช้ csh ได้อีก การกด C-z จึงเป็นการหยุด Emacs ไว้ชั่วคราวเท่านั้น จะไม่ทำความเสียหายให้กับเนื้อหาที่แก้ไขไป หมายเหตุ: แต่ทว่า ในกรณีที่ใช้บน X-window หรือใช้ sh อยู่ ก็จะไม่มีความสามารถนี้ คำสั่งประเภท C-x มีมากมายหลายคำสั่ง คำสั่งที่อธิบายไปแล้วมีดังนี้ C-x C-f หาแฟ้มข้อมูล (find) สำหรับแก้ไข C-x C-s เก็บรักษาแฟ้มข้อมูล (save) C-x C-b แสดงรายการบัฟเฟอร์ (buffer list) C-x C-c เลิกการใช้ Editor และเก็บรักษาแฟ้มข้อมูลโดยอัตโนมัติ แต่ถ้าหากมีแฟ้ม ข้อมูลบางอันถูกแก้ไข ก็ให้ถามว่าจะเก็บรักษาแฟ้มข้อมูลนั้นไหม โดยทั่วไป การออกจาก Emacs ทำได้โดยคำสั่ง C-x C-s C-x C-c คือให้เก็บรักษา ก่อนแล้วจึงเลิก คำสั่งขยายเพิ่มแบบชื่อนั้น ใช้สำหรับคำสั่งที่ไม่ค่อยได้ใช้ หรือคำสั่งที่ใช้เฉพาะกับโหมดพิเศษบาง โหมด ตัวอย่างเช่น คำสั่ง "command-apropos" ซึ่งจะถาม คีย์เวิร์ด (keyword) แล้วแสดงผล คำสั่งทุกคำสั่งที่มีชื่อเกี่ยวข้องกับกับคีย์เวิร์ดนั้น เวลาจะสั่งคำสั่งนี้ ก็ให้กด ESC x แล้วจะมีตัวอักษร "M-x" ปรากฏขึ้นที่ส่วนล่างของจอ จากนั้นก็ให้ใส่ชื่อคำสั่งที่ต้องการ (ในกรณีนี้คือ "command-apropos") เมื่อป้อนข้อมูลไปถึง "command-a" แล้วกด SPACE BAR ส่วนที่เหลือของ ชื่อคำสั่งก็จะถูกเติมเต็ม (completion) ให้เองโดยอัตโนมัติ หลังจากนั้น จะถูกถามคีย์เวิร์ด ก็ให้ กดสายอักขระ (string) ที่ต้องการรู้ลงไป ต้องไม่ใส่คีย์เวิร์ดอะไรเลย ก็จะได้คำสั่งทั้งหมดที่มีอยู่ >> ลองกด ESC x ตามด้วย "command-apropos<Return>" หรือ "command-a<Space><Return>" หลังจากนั้นก็กด "kanji<Return>" ดู ให้กด C-x 1 เวลาต้องการจะลบ "วินโดว์" ที่โผล่ขึ้นมาใหม่ บรรทัดโหมด (Mode Line) ===================== เวลาที่พิมพ์คำสั่งเข้าไปช้า ๆ Emacs จะแสดงสิ่งที่พิมพ์ลงไปตรงบรรทัดล่างสุดของจอซึ่งเรียก ว่า echo area บรรทัดซึ่งอยู่ถัดขึ้นมาหนึ่งบรรทัด เรียกว่าบรรทัดโหมด (mode line) บรรทัด โหมดมีลักษณะดังนี้ [--]J:--**-Mule: TUTORIAL.th (Fundamental) ---NN%-------------- หมายเหตุ: ตรงส่วน NN ของ NN% จะมีตัวเลขใส่อยู่ บรรทัดโหมดที่แสดงอยู่อาจจะแตกต่าง ไปจากตัวอย่างบ้าง แต่ก็ไม่เป็นไร ตัวอย่างเช่น อาจจะมีเวลาหรือ uptime แสดงผลอยู่ อันนี้เป็นความสามารถของโปรแกรม display-time บรรทัดนี้มีข้อมูลที่เป็นประโยชน์อยู่หลายอย่าง ข้อมูลแรกคือ ชื่อแฟ้มข้อมูลที่กำลังอ่านอยู่ ตัวเลข NN% จะแสดงให้รู้ว่ากำลังแสดงผลส่วนไหน ของแฟ้มข้อมูลอยู่ โดยคิดเป็นเปอร์เซนต์ ถ้าเป็นส่วนบนสุดของแฟ้มข้อมูลอยู่ก็จะมีข้อความว่า --Top-- แสดงอยู่ ถ้าเป็นส่วนล่างสุดก็จะมีข้อความว่า --Bot-- ถ้าหากสามารถแสดงแฟ้มข้อมูล ทั้งหมดบนหน้าจอได้ ก็จะมีข้อความว่า --All-- แสดงอยู่ ภายในวงเล็บของบรรทัดโหมด จะแสดงให้รู้ว่าตอนนี้อยู่ในโหมด (mode) อะไร ในตัวอย่าง ข้างบนคือ อยู่ในโหมด Fundamental ซึ่งเป็นโหมดเริ่มต้น (default) โหมดนี้เป็นหนึ่งในโหมด หลัก (Major Mode) Emacs มีโหมดหลัก (Major Mode) สำหรับการโปรแกรมภาษา หรือการแก้ข้อความ เช่น Lisp mode Text mode และโหมดอื่น ๆ อีกหลายโหมด โดยปกติ Emacs จะอยู่ในโหมดหลัก โหมดใดโหมดหนึ่งเสมอ คำสั่งบางคำสั่งจะมีพฤติกรรมที่แตกต่างกันโดยสิ้นเชิง เมื่ออยู่ในโหมดหลักที่ต่างกัน ตัวอย่าง เช่น เวลาโปรแกรมภาษา จะมีคำสั่งสำหรับสร้าง หมายเหตุ (comment) อยู่ เนื่องจากวิธีใส่ หมายเหตุของภาษาแต่ละภาษาแตกต่างกัน คำสั่งนี้ก็จะแตกต่างกันไปในแต่ละโหมดหลัก เพื่อให้ สามารถใส่หมายเหตุในแต่ละภาษาได้อย่างถูกต้อง คำสั่งสำหรับการเปลี่ยนโหมดให้เป็นโหมดหลักอื่น คือคำสั่งขยาย (extend) ซึ่งชื่อคำสั่งเป็นชื่อ โหมด ตัวอย่างเช่น คำสั่ง M-x fundamental-mode คือคำสั่งสำหรับเปลี่ยนโหมดเป็นโหมด Fundamental เวลาที่จะแก้ไขแฟ้มข้อมูลภาษาอังกฤษ ก็ให้ใช้ Text mode >> ลองป้อนคำสั่ง M-x text-mode<Return> ถ้าต้องการหาข้อมูลเพิ่มเกี่ยวกับโหมดหลักที่ใช้อยู่ในปัจจุบัน ก็ให้ป้อนคำสั่ง C-h m >> ให้กด C-h m เพื่อศึกษาข้อแตกต่างระหว่าง Text mode กับ Fundamental mode >> ให้กด C-x 1 เพื่อลบเอกสารออกจากจอ ตรงส่วนซ้ายของบรรทัดโหมด จะมีสัญลักษณ์ '[--]' เพื่อแสดงโหมดสำหรับการป้อนข้อมูล (input mode) อยู่ สัญลักษณ์ [--] หมายถึงสามารถป้อนข้อมูลได้ด้วยตัวอักษรภาษาอังกฤษ (English alphabets) กรุณาอ่านคู่มือของ "Tamago" สำหรับรายละเอียดของวิธีใช้ และตรงด้านขวาของสัญลักษณ์นั้น จะมีเครื่องหมายแสดงสถานะของ flag ของระบบรหัส (coding-system) อยู่ Mule สามารถกำหนดระบบรหัสแยกเฉพาะสำหรับ การเก็บอ่านแฟ้มข้อมูล การป้อนข้อมูลจากคีย์บอร์ด การแสดงผลออกทางจอ ได้อิสระจากกัน แต่โดยปกติจะแสดงเฉพาะ สัญลักษณ์ช่วยจำ (mnemonic) ของระบบรหัสสำหรับการเก็บอ่านแฟ้มข้อมูล เท่านั้น >> ตรวจดูว่ามีสัญลักษณ์ คล้ายคลึงกับ "J:" "S:" "E:" แสดงอยู่ที่บรรทัดโหมดหรือไม่ ตัวอักษรตัวแรกคือ สัญลักษณ์ช่วยจำ (mnemonic) ของระบบรหัสที่ใช้อยู่ ตัว ':' แสดงให้รู้ ว่ามีตัวอักษรของภาษาอื่น นอกจากภาษาอังกฤษแสดงอยู่ (เช่น ภาษาจีน ภาษาญี่ปุ่น เป็นต้น) ตัว J หมายถึง รหัสที่ใช้กับ JUNET คือ รหัส JIS ตัว S หมายถึง Shift-JIS และ ตัว E หมายถึง รหัส EUC ภาษาญี่ปุ่น จะสลับเปลี่ยน (toggle) การแสดงผลภาษานานาชาติได้โดย C-x C-k t ตัวอย่างข้างล่าง คือการสลับเปลี่ยนไม่ให้แสดงภาษานานาชาติ แล้วสลับกลับอีกครั้งหนึ่ง >> ลองป้อนคำสั่ง C-x C-k t ดูสองครั้ง ถ้าเทอร์มินัลที่ใช้อยู่มีปุ่ม META และโหมดที่ใช้อยู่เป็นรหัส JIS เราก็จะสามารถใช้ปุ่ม META แทนการกดปุ่ม ESCAPE ได้ วิธีใช้จะเหมือนกับการใช้ปุ่มคอนโทรล คือให้กดปุ่ม META ค้างไว้แล้วจึง กดตัวอักษรตาม M-<ตัวอักษร> จะทำหน้าที่เหมือนกับ ESC <ตัวอักษร> นั่นคือ ทุกอย่างที่อธิบายมา จนถึงจุดนี้ จะยังคงมีผลเหมือนเดิม หลังจากเปลี่ยน ESC <ตัวอักษร> ให้เป็น M-<ตัวอักษร> แต่ข้อ ควรระวังก็คือ ปุ่ม META จะไม่สามารถใช้ได้กับรหัส Shift-JIS และ EUC การเปลี่ยนระบบรหัสจะมีผลแค่เพียงกับแต่ละบัฟเฟอร์เท่านั้น สามารถดูคำสั่งเกี่ยวกับระบบรหัส ได้โดยคำสั่ง C-h a coding-system <Return> >> ให้ป้อนคำสั่ง C-h a coding-system <Return> แล้วอ่านรายละเอียดของคำสั่ง set-display-coding-system set-file-coding-system และ set-process-coding-system จากเอกสารที่ปรากฏขึ้น การค้นหา (search) ================ Emacs สามารถค้นหาสายอักขระ (string) ภายในแฟ้มข้อมูลไปทางข้างหน้าหรือข้างหลังได้ ถ้าต้องการค้นหาไปทางข้างหน้าของตำแหน่งเคอร์เซอร์ (cursor) ก็ให้กด C-s ถ้าต้องการค้นหา ไปทางข้างหลังของตำแหน่งเคอร์เซอร์ ก็ให้กด C-r หลังจากนั้นจะมีข้อความว่า "I-search:" ปรากฏขึ้นตรง echo area ยกเลิกการค้นหาได้ด้วยการกด ESC >> กด C-s เพื่อเริ่มการค้นหา แล้วกดตัวอักษรของคำว่า "cursor" ลงไปทีละตัวอย่าง ช้า แล้วสังเกตดูว่าเคอร์เซอร์ขยับไปอย่างไร >> ลองกด C-s ดูอีกหนึ่งครั้งเพื่อค้นหาคำว่า "cursor" ตัวต่อไป >> กด <Delete> ดู 4 ครั้ง แล้วสังเกตดูว่าการเคลื่อนที่ของเคอร์เซอร์ >> กด ESC เพื่อยกเลิกการค้นหา การค้นหาจะเริ่มขึ้นทันที ในระหว่างที่พิมพ์สายอักขระที่ต้องการจะค้นหา เข้าไปเพียงบางส่วน ถ้าต้องการจะค้นหาตัวต่อไป ก็ให้กด C-s อีกหนึ่งครั้ง ถ้าหากค้นหาสายอักขระที่ป้อนเข้าไปไม่พบ ก็ จะมีข้อความปรากฏขึ้น ให้กด C-g เพื่อยกเลิก ระหว่างที่ค้นหาอยู่ ถ้ากด <Delete> ตัวอักษรตัวสุดท้ายในสายอักขระก็จะถูกลบไป แล้ว เคอร์เซอร์ก็จะกลับไปตำแหน่งก่อนหน้า ตัวอย่างเช่น ถ้ากด "cu" ก็จะค้นหาไปถึงตำแหน่งที่มีคำว่า "cu" แต่ถ้ากด <Delete> ในจังหวะนี้ ตัว 'u' ใน search line ก็จะหายไป แล้วเคอร์เซอร์ จะขยับกลับไปที่ตำแหน่งที่มีตัว 'c' อยู่ ถ้ากดตัวอักษรคอนโทรล (control character) ตัวอื่น นอกเหนือจาก C-s หรือ C-r การค้นหาก็จะสิ้นสุดลง คำสั่ง C-s จะค้นหาสายอักขระที่ต้องการ ไปทางข้างหน้าของตำแหน่งเคอร์เซอร์ ถ้าต้องการ ค้นหาไปทางทิศหลัง ก็ให้กด C-r นั่นคือ สามารถใช้ C-s และ C-r สลับกันเพื่อค้นหาไปได้ในทั้ง สองทิศทาง C-s และ C-r ทำหน้าที่เหมือนกันทุกประการ จะต่างกันก็ตรงทิศทางการค้นหาเท่านั้น Recursive Editing Level บางที เราอาจจะหลุดเข้าไปอยู่ในสถานะที่เรียกว่า Recursive Editing Level ได้โดย ไม่ตั้งใจ ในโหมดนี้ เครื่องหมายวงเล็บ '()' ที่แสดงชื่อโหมดหลัก (major mode) อยู่จะมีวงเล็บ '[]' ล้อม เพิ่มขึ้นอีกหนึ่งชั้น ตัวอย่างเช่น ถ้าเดิมเป็น (Fundamental) อยู่ ก็จะเปลี่ยนเป็น [(Fundamental)] แทน หมายเหตุ: เราจะไม่อธิบายเกี่ยวกับ Recursive Editing Level ในที่นี้ ให้กด M-x top-level <Return> เพื่อที่จะออกจาก Recursive Editing Level >> ลองกดดู ตรงส่วนล่างของจอจะมีข้อความว่า "Back to top level" ปรากฏขึ้น เนื่องจาก เราอยู่ในระดับบนสุด (top level) อยู่แล้ว คำสั่งนี้จึงไม่มีผลใด ๆ ไม่สามารถใช้ คำสั่ง C-g เพื่อที่จะออกจาก Recursive Editing Level ได้ Help ==== Emacs มีความสามารถที่มีประโยชน์ มากมายหลายอย่าง ซึ่งไม่สามารถอธิบายได้หมดในที่นี้ แต่เราจะสามารถเรียกใช้ <HELP> เพื่อที่จะเรียนรู้ความสามารถเหล่านี้ ได้โดยการกด C-h ซึ่งจะ ช่วยให้เราได้รับรู้ข้อมูลเพิ่มเติมหลายอย่าง วิธีใช้คือให้กด C-h แล้วตามด้วยตัวเลือก (option) อีกหนึ่งตัวอักษร ถ้าไม่รู้ว่าจะต้องใช้ ตัวเลือกอะไร ก็ให้กด C-h ? แล้วจะมีคำอธิบายเกี่ยวกับตัวเลือกปรากฏขึ้น ได้หากเปลี่ยนใจจะ ไม่เรียก HELP หลังจากกด C-h ก็ให้กด C-g เพื่อยกเลิกได้ คำสั่ง HELP พื้นฐานที่สุดอันหนึ่งก็คือ C-h c แล้วตามด้วยการกดคำสั่งบางคำสั่ง ซึ่งจะให้คำ อธิบายสั้น ๆ เกี่ยวกับคำสั่งนั้น >> ลองกด C-h c C-p ดู ซึ่งจะให้ข้อความว่า "C-p runs the command previous-line" คำสั่งนี้จะช่วยรื้อฟื้นความจำ เกี่ยวกับคำสั่งที่เคยผ่านตาแล้ว แต่จำไม่ได้ ได้เป็นอย่างดี คำสั่ง ที่มีมากกว่าหนึ่งตัวอักษร เช่น C-x C-s ก็สามารถกดตามหลัง C-h c ได้ ถ้าหากต้องการรู้รายละเอียดมากกว่านี้ ก็ให้ใช้ k แทนตัว c >> ลองกด C-h k C-p ดู ก็จะมีวินโดว์เพิ่มใน Emacs อีกหนึ่งอัน เพื่อแสดงรายละเอียดของคำสั่งนั้น เมื่ออ่านจบแล้ว ก็ให้กด C-x 1 เพิ่มลบวินโดว์ออก ตัวเลือกอื่นที่มีประโยชน์ มีดังนี้ C-h f ให้ใส่ชื่อของคำสั่ง เพื่อแสดงรายละเอียดเกี่ยวกับคำสั่งนั้น >> ให้กด C-h f previous-line แล้วตามด้วย <Return> เพื่อแสดงรายละเอียดเกี่ยว กับคำสั่งซึ่งเรียกใช้ได้จากการกด C-p C-h a แล้วตามด้วยคีย์เวิร์ด (keyword) เพื่อแสดงคำสั่งทุกคำสั่ง ที่มีคีย์เวิร์ด รวมอยู่ คำสั่งเหล่านี้สามารถเรียกใช้ได้โดยการกด ESC x >> ลองกด C-h a file แล้วตามด้วย <Return> เพื่อแสดงชื่อคำสั่งทุกคำสั่งที่มีคำว่า "file" รวมอยู่ ซึ่งจะมี find-file และ write-file ที่เรียกใช้ได้โดยการกด C-x C-f และ C-x C-w รวมอยู่ด้วย ท้ายสุดนี้ ====== อย่าลืม: คำสั่งสำหรับการเลิก Emacs คือ C-x C-c เอกสารฉบับเบื้องต้นนี้ ตั้งใจเขียนขึ้นสำหรับผู้ที่เริ่มหัดใหม่ โดยเฉพาะ ถ้าหากมีจุดไหนที่ไม่ เข้าใจ ก็อย่ามัวแต่โทษตัวเอง แต่ขอให้โยนความผิดมายังผู้เขียนแทน หลังจากใช้ EMACS ดูสักสองสามวัน ก็คงจะชินไปเอง ในตอนแรก อาจจะมีจุดที่รู้สึกสับสนและ ไม่เข้าใจอยู่บ้าง แต่สิ่งนี้ย่อมเกิดขึ้นเสมอ เวลาแต่เริ่มใช้ Editor ใหม่ใด ๆ ก็ตาม โดยเฉพาะ อย่างยิ่งกับ EMACS เนื่องจากเป็นโปรแกรมที่มีความสามารถหลากหลายมาก อันที่จริงแล้ว EMACS ทำได้ทุกสิ่งทุกอย่าง ขอขอบคุณ ======= เอกสารฉบับนี้ ดัดแปลงมาจาก "MicroEMACS (kemacs) ภาษาญี่ปุ่น เบื้องต้น" ซึ่งได้มาจาก JUNET เพื่อให้ใช้เป็น Tutorial สำหรับ GNUEmacs (Nemacs) เอกสารนี้ ดัดแปลงมาจาก "JOVE Tutorial" (19 มกราคม 86) ของ Jonathan Payne ซึ่งดัดแปลงมาจากเอกสารของ Steve Zimmerman แห่ง CCA-UNIX ซึ่งดัดแปลง (อีกที) มา จากเอกสาร "Teach-Emacs" ฉบับเบื้องต้น (31 ตุลาคม 85) ของ MIT Update - February 1986 by Dana Hoggatt. Update - December 1986 by Kim Leburg. Update/Translate - July 1987 by SANETO Takanori ขอขอบคุณเป็นพิเศษ ============== คุณ SANETO Takanori (ซาเนโตะ ทากาโนริ) ผู้แปลภาษาญี่ปุ่นฉบับแรกสุด เอกสารฉบับนี้ เขียนด้วย GMW + Wnn + Nemacs ขอแสดงความขอบคุณ แด่ผู้ที่สร้างโปรแกรมสุดวิเศษเหล่านี้ขึ้น และขอขอบคุณ คุณ Fujiwara Shoko ที่ให้ความช่วยเหลือในการแปล การป้อนข้อมูล และอย่างอื่นอีก หลาย ๆ อย่าง ขอรับผิดชอบ การแปลที่ผิดพลาด ข้อมูลเท็จ และอื่น ๆ ไว้แต่เพียงผู้เดียว ซุซูกิ ฮิโรโนบุ@sra.co.jp Update/Add - December 1987 by Hironobu Suzuki Update/Add - November 1989 by Ken'ichi Handa Update/Add - January 1990 by Shigeki Yoshida Update/Add - March 1992 by Kenichi HANDA Translated into Thai - September 1994 by Manop Wongsaisuwan