howto/emacs †一行メモ †
その他 †terminal-emulatorの使い方 †M-x ansi-term 又は M-x term のあと、動かすプログラムを入力する(bashやpython3など。引数は付けられない?) 使い方(ansi-term): 新規に *ansi-term*バッファとして開かれる(複数起動可) 主なキーバインディング(termより制限がゆるい) C-c C-j term-line-mode lineモードへ切替え。通常のバッファ操作をしたいときのモード C-c C-k term-char-mode charモードへ切替え(デフォルトでcharモード) C-c C-c charモードで、C-cを送信 C-x ... は有効らしい M-x ... は効かないので、lineモードに移行してから使う 使い方(term): 必ず *terminal*バッファに開かれる(ひとつだけ起動できる) 次のキーバインディングのみ(他は動かしたプログラムに渡される) C-c C-j term-line-mode lineモードへ切替え。通常のバッファ操作をしたいときのモード C-c C-k term-char-mode charモードへ切替え(デフォルトでcharモード) C-c C-c charモードで、C-cを送信 C-c CHAR charモードで、C-x CHAR の動作(例えば C-c o で C-x o の動作をする) C-c C-q ページ機能のon/offトグル(デフォルトoff)。長い出力はき**MORE**で一時停止 (コメント) M-x shell や M-x run-python もあるがこれらはいまいち。 TABをスペースに変換する †リージョンを指定して、 M-x untabify リージョンをLinuxコマンドに渡して、いろいろする †C-u M-| COMMAND リージョンをコマンドの標準入力に渡して、得た結果に置き換える。 M-| COMMAND リージョンをコマンドの標準入力に渡す。結果は *Shell Command Output*バッファ等に出力される。 C-u M-! COMMAND コマンドを実行させて、得た結果をバッファに挿入する。 (注) |はエルではなく、パイプの縦棒の文字。COMMANDにはパイプラインを与えることも出来る。 (例) バッファ内の次の5行をリージョンに選択しておき、 hoge3 hoge2 hoge0 hoge0 hoge1 C-u M-l sort | uniq -c をすると、 2 hoge0 1 hoge1 1 hoge2 1 hoge3 に置き換わる。 電卓がわりに使う †「*scratch*」バッファで直接 emacs-lispの実行ができる。実行は Ctrl-j を押す。 ; 計算例 (* 71 3 6) # 71 * 3 * 6 (* (+ 71 3 2) 3 6) # (71+3+2) * 3 * 6 (sqrt 2.0) # ルート2 検索 †
置換 †
文字の色を変更する †(1) 変更したい部分にカーソルを持って行き、 M-x describe-face とする。例えば、 Describe face (default `sh-heredoc'): と表示される(EnterかC-gを押して抜ける)。この sh-heredocの変数名を覚えておく。 (2) M-x list-faces-display (3) C-x C-s で変更の設定を .emacs.elに保存する。 [ref] ミニバッファの文字の色を変更する †例えばつぎのものを .emacs.elに加える。 (if (not (eq window-system 'x)) (progn (face-spec-set 'minibuffer-prompt '( (t (:foreground "cyan")) )) )) [ref] Emacsで文字コード指定してのファイル開き直しをしたい †C-x ret rとして、utf-8 とする(UTF-8で開く場合)。 (このショートカットにバインドされている関数は M-x revert-buffer-with-coding-system) ファイル先頭に、 # -*- coding:utf-8; mode:shell-script; -*- などを追加しておくとよい。 C言語のときは1行目に /* -*- coding:utf-8; -*- */ を入れるとよい。 ヘルプの表示、入力補完 †M-x describe-function 関数の説明表示 M-x describe-variable 変数の説明表示 M-x describe-bindings キーバインディングの一覧表示 M-x describe-key キーで実行される関数の表示 M-x variable-apropos 与えられた文字列と部分一致する関数名、変数名の説明一覧表示。標準にはなく、 D.Cameron, B.Rosenblatt, "GNU Emacs", p.400, ソフトバンク(株) (1993) にコードがある。 (defun variable-apropos (string) "Like apropos but lists only symbols that are names of variables that are user-modifiable." (interactive "sVariable apropos (regexp): ") (let ((message (let ((standard-output (get-buffer-create "*HELP*"))) (print-help-return-message 'identity)))) (apropos string 'user-variable-p) (and message (message message)))) (define-key help-map "\C-v" 'variable-apropos) M-Tab 変数名、関数名を補完する キーボードマクロ †定義と実行 †C-x ( マクロ定義を開始する このあいだのキー操作がキーボードマクロとして記録される C-x ) マクロ定義を終了する C-x e 記録したキーボードマクロを実行する C-u NNN C-x e として、NNN回 C-x e を実行することもできる 保存と読み込み †M-x name-last-kbd-macro 定義したマクロに名前を付ける(M-x 付けた名前 で実行できるようになる) M-x insert-kbd-macro 名前を付けたマクロを、バッファに挿入する(新規ファイルに挿入し保存できる) M-x load-file ファイルに保存したマクロを読み込む(M-x マクロ名 で実行できるようになる) .emacs.elに (load-file ファイル名) を追加しても可能。 リカーシブエディット(再帰編集) †マクロ定義中に C-x q を入力 マクロ実行時に確認応答する(継続、中止、再帰編集などができる) M-x query-replace など 実行中に ?でヘルプが出る(C-r で再帰編集ができる) M-x recursive-edit 再帰編集をする(編集終了は M-C-c) その他の編集 †単語の補間 †M-/ 単語を補間する(入力中の文字列を、既に入力済みの文字列に補完) 単語を大文字、小文字に変換 †M-u カーソル位置から、次の単語区切りまでの文字列を、大文字に変換する M-l カーソル位置から、次の単語区切りまでの文字列を、子文字に変換する 基本 †用語とチュートリアル †バッファ †emacsでは、開いたファイルはバッファというものに読み込まれます (特別な事をしなくてもふつうにそれを編集してファイルに上書き保存できます)。 つまり、開いたファイルは同じ名前のバッファに対応しています。 また、次のようにファイルに対応していないバッファもあります。
また、emacsではいくつでもファイルを開くことができます。 emacsでは 少なくとも1枚のバッファが表示されていますが、 emacsウィンドウを分割して、いくつでも同時にバッファを 表示することもできます。 (注)「ウィンドウとフレーム」 emacsでは、バッファを表示している部分を ウィンドウ(バッファウィンドウ)と呼び、 emacs自体の全体画面のことを、フレーム(フレームウィンドウ)と呼びます。 (X11でemacsを立ち上げている場合、フレームは X11の用語で言う ウィンドウに相当します。 キャラクタ端末でemacsを立ち上げている場合は、フレームは端末の画面全体の事になります。) モードライン †emacsでバッファを表示すると、バッファの下に反転した行が1行ある (バッファが1枚だけの場合はちょうど下から二行目に反転した行がある)。 この行をモードラインと呼ぶ。 そのバッファ名などが表示されている (利用している文字コード、使用しているモード、行数なども)。 ミニバッファ †emacsの一番下の行のことをミニバッファと呼ぶ。 コマンド実行後にメッセージが表示されたりします。 コマンドを入力したり、コマンドが要求する入力 (例えばファイル名入力する)にも使われます。 チュートリアル †emacs自身には簡単なチュートリアルが含まれています。 ちなみに、emacsのコマンドはほぼすべてがLispの関数です。 emacsは、実はLispインタープリタです。 いくつかの操作 †Ctrl, Meta, CAPS, Bindingに関する基本 †Ctrlキーはしばしば Cと標記される。 例えば C-x C-c は Ctrlキーを押しながらxを押す、 次に Ctrlキーを押しながらcを押すことを意味する。 Metaキーがあるキーボードはほとんど見受けられない。 MetaキーはもうひとつのCtrlキーのようなものである。 例えば M-f は Metaキーを押しながらfを押すことを意味する。 MetaキーをAltキーやOptキーなどで代用できる場合もある。 代用できない場合でも ESCを押して、 次に fキーを押すことで M-f と解釈される。 CAPSキーが aの左側にあるキーボードが日本ではほとんどである。 aの左側にCtrlがあると使いやすい。また CAPSキーはほぼ使わない。 そのためソフトウェア的にCAPSキーをCtrlキーと交換することがよく行われている。 (注) 客先で作業する場合にはこのようなことは出来ない。 CtrlとCAPSLOCKを逆にする方法 (Ubuntu 18.04の場合) 端末でつぎを実行 $ gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:swapcaps']" [ref] https://blog.sakaki333.com/blog/view/11 Bind, Bindingという言葉。 emacsのコマンドはほとんどLisp関数ですが、よく使うコマンドの実行は ショートカットとしていくつかのキーの組み合わせで実行できます。 コマンドとキーの対応をバインディングと呼びます。 (例) ファイルを開くコマンドは find-file です。 C-x C-f にバインドされています。 終了などの操作 †
ファイルに関する操作 †
カーソル移動 †
編集 †
コピー・キル・ペーストの編集 †コピーとキルは、マークされた位置とカーソル位置の間が対象となる。 なお、マークセットのキーバインドは使っている環境によって別のアプリケーションが使用している場合が 多く見かけられる(そのため設定の変更が必要となる場合もある)。
矩形の編集 †
コマンドに引数を渡す †
バッファに関する操作 †
.emacs.elに入れたらよいもの †;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Kanji-code ;;; ;(some commands) ; 'C-h C <RET>' : Describe the coding systems currently in use. ; 'M-x list-coding-systems' : Display a list of all coding systems. (set-language-environment "Japanese") (set-keyboard-coding-system 'utf-8) ; Coding system for keyboard input (set-terminal-coding-system 'utf-8) ; Coding system for terminal output (set-buffer-file-coding-system 'utf-8) ; Coding system for saving buffer (set-default-coding-systems 'utf-8) ; Coding system for new buffers, subprocess I/Os, ; file names, keyboard input and terminal output. (setq default-buffer-file-coding-system 'utf-8) ; set input method if available (cond ( (require 'mozc nil t) (setq default-input-method "japanese-mozc") ;(setq mozc-candidate-style 'echo-area) ) ( (require 'anthy nil t) (setq default-input-method "japanese-anthy") ) ) ; コードが未定義の時に、utf-8でバッファをセーブする。 (add-hook 'write-file-hooks (function (lambda () (if (eq buffer-file-coding-system 'undecided-unix) (setq buffer-file-coding-system 'utf-8)) nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; リージョンに引用マークをつける ;;; http://www.sawada.riec.tohoku.ac.jp/people/nobuyuki/CompSemi/Semi4/keisan.html ;;; (defvar quoting-marker "> ") (defun cite-region () "リージョンに引用マークをつける" (interactive) (setq quoting-marker (read-string "Quoting marker: " quoting-marker)) (save-excursion (let ((e (max (region-end) (region-beginning))) (b (min (region-end) (region-beginning))) (len (length quoting-marker))) (goto-char b) (while (<= (+ (point) 1) e) (insert quoting-marker) ;bugfix2023/12/15 (setq e (+ e len)) (forward-line 1))))) その他は ~okazaki/.emacs.elを見るなどして追加するとよい。 LISP (emacs-lisp) †*scratch*バッファを利用して lispプログラムを作る †「*scratch*」バッファは lisp-interaction-modeなので、lispプログラムを書いて実行できる。 インタープリタ言語なので lispの式をひとつづつ書いて、ひとつづつ実行できる。 lispプログラムの構成要素は、式です。式の実行のことを、評価といいます。 変数や、関数定義(これも関数の呼び出し)、関数呼び出し、が式です。 関数呼び出しは、リスト (hoge0 hoge1 hoge2 ...) の形になっています。 リストの先頭要素 hoge0が関数名で、それ以降 hoge1, hoge2, ... は引数として扱われます。 さらに リストの要素自身がリストになっている場合もあります。 「*scratch*」に書いた lispの式は C-j を押すことで評価できます。 なお、式を .emacs.elに書いておくと emacs起動時に評価することができます。 ;; 例 (defun fact (n) (cond ((zerop n) 1 ) (t (* n (fact (- n 1)) )))) ;; C-jを押して式を評価(関数factを定義する) (fact 5) ;; C-jを押して、引数5で関数を評価する ;; M-: (fact 5) Return でミニバッファからでも実行できる (defun my-fact (n) "calculate n!" (interactive "nNumber: ") (message "%s!=%s" n (fact n))) ;; C-jを押す (my-fact 5) ;; C-j押して、引数5で関数を実行する ;; my-factの場合、interactiveで関数を定義しているので、 ;; M-x my-fact Return 5 Return でも実行できる 用語? †整数 0, 1, 2, -1, など キャラクタ ?A ?a ?\C-a など(入力に対応する) 文字列 "..." ブール値 t, nil シンボル 関数名や変数名であり、評価され、値が返る 'シンボル シンボル名そのもの リストの例 †;; ( 1 2 3 4 5 ) のリストの作り方 '(1 . (2 . (3 . (4 . (5))))) (quate (1 2 3 4 5)) '(1 2 3 4 5) (setq hogeval '(1 2 3 4 5)) ; リストをグローバル変数hogevalに代入する hogeval ; 変数を評価すると 値が返る (hogeval) ; 評価するとリストの先頭にある「1」という名前の関数は無いのでエラーになる ; リストの構成要素が評価されて、最後に全体が評価される。全体の評価のとき「1」が無いとなる (car hogeval) ; 最初の要素を取り出す (cdr hogeval) ; 最初の要素を除いたリストを取り出す ; リストに要素追加 (1 2 3 4 5) -> (1 9 2 3 4 5) (setq hoge '( 1 2 3 4 5)) (setq hoge (cons (car hoge) (cons 9 (cdr hoge)))) ; これは別のリストになる (1 2 3 4 5) -> ((1 . 9) 2 3 4 5) (setq hoge '( 1 2 3 4 5)) (setq hoge (cons (cons (car hoge) 9) (cdr hoge))) (setq hoge '( 1 2 3 4 5 6 7 8)) (nthcdr 2 hoge) ; (3 4 5 6 7 8) (nthcdr 6 hoge) ; (7 8) (cons 9 (nthcdr 6 hoge)) ; (9 7 8) ; リストhogeの要素3 (2-th element)のリンク(CDR)が 要素9につながる (setcdr (nthcdr 2 hoge) (cons 9 (nthcdr 6 hoge))) ; (9 7 8) hoge ; 結果 (1 2 3 9 7 8) 演算 †論理演算 and, or, not, =, <, >, eq, など 算術演算 +, *, -, /, など (注) 関数名であるので、(+ 1 2) などと使う フロー制御 †(cond ((条件式1) (真のときの評価式)) ((条件式2) (真のときの評価式)) ... ((条件式N) (真のときの評価式)) ( t (どれも真にならないときの評価式))) (if (条件文) (真のときの評価式) (偽のときの評価式)) (progn (逐次処理の式1) (逐次処理の式2) ... (逐次処理の式N)) (let ((ローカル変数1 値1) (ローカル変数2 値2) ... (ローカル変数N 値N)) (逐次処理の式1) (逐次処理の式2) ... (逐次処理の式M)) (while (条件式) (逐次処理の式1) (逐次処理の式2) ... (逐次処理の式M)) |