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
をして表示されるバッファにsh-heredocがあるので、そこにカーソルを移動して Enterを押す。
表示されるバッファにある、Foregroundのところの [Choose]にカーソルを移動して Enterを押す。
色を選ぶ。同じ要領で他も変更できる。

なお、[Choose]が無い場合は、Show All Attributesから Foregroundをチェックして、色を選ぶ。

(3) C-x C-s で変更の設定を .emacs.elに保存する。
適当に .emacs.elを書き直しても良いだろう。

[ref]
http://qiita.com/AnchorBlues/items/91026c4f1c0745f5b851

ミニバッファの文字の色を変更する

例えばつぎのものを .emacs.elに加える。

(if (not (eq window-system 'x))
    (progn
      (face-spec-set 'minibuffer-prompt
                     '(
                       (t (:foreground "cyan"))
                       ))
      ))

[ref]
http://blog.livedoor.jp/moya_pro/archives/23686456.html
http://kei10in.hatenablog.jp/entry/20101101/1288617632

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
とした後、
ESC
そして
x
とキーを押すと、ミニバッファに M-x が表示され、 その右にカーソルが表示されます。 つづけて、
help-with-tutorial
という文字を入力(これはコマンド名になります)して ENTERキー を押す。 すると TUTORIALのバッファがでてくるので、 説明を読みながら操作を学習できます。

ちなみに、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-string quoting-marker)
        (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))

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS