howto/emacs

一行メモ

  • その他よく使う事柄 -- 2018-12-21 (金) 12:32:17
    • マクロ定義と実行
    • 初期設定ファイル .emacs.el
    • バッファのメジャーモードとマイナーモード
    • 漢字コードに関すること
    • コマンドの作成
    • キーバインディングの変更
    • 開いているファイルのコンパイル
  • 日本語表示・入力に関する事柄 -- 2019-08-27 (火) 13:49:44
    • TeraTermProの画面上で emacsを使うと、表示がずれて正常でない場合、 下記の".emacs.elに入れたらよいもの"から Kanji-codeの部分を .emacs.el または .emacs に追加するとよい
    • mozc,anthyによる日本語入力(Xmingで emacsウィンドウ)のためにも、 下記の".emacs.elに入れたらよいもの"から Kanji-codeの部分を追加するとよい
      [ref] http://mickey-happygolucky.hatenablog.com/entry/2015/12/11/001402
    • emacs-anthyのキーバインディング
      C-\ 日本語入力への切り替え
      C-o または Shift-→ 変換中の文節を1文字長くする。
      C-i または Shift-← 変換中の文節を1文字短くする。
      C-f または →       変換する文節を次のものに移動する。
      C-b または ←       変換する文節を次のものに移動する。
      SPC                 文節の変換
      ENTER または anykey すべての文節を確定する。
      など
    • windows上に Xmingで emacsのウィンドウ画面を表示している場合のデフォルトの日本語入力
      そのままではmozcやanthyは使えない(そもそもRocks7,CentOS7では標準で利用できないようだ)。
      emacsデフォルトのkkcインプットメソッドは使える。
      kkcのキーバインディング(あまり便利ではない。辞書学習機能は無い)。TeraTermProの画面上で emacsを使う場合は windowsの
      IMEが利用できる。
      C-\ 日本語入力への切り替え
      C-o 変換中の文節を1文字長くする。
      C-i 変換中の文節を1文字短くする。
      C-f 変換中の文節を確定し、次の文節に移動する。
      SPC 変換
      K   カタカナに変換
    • emacs-mozcのキーバインディング、略

その他

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

検索

  • C-sを押し前方検索する文字をタイプしてゆく。次を検索するには C-sを押す。検索終了は ENTER
  • C-rを押し後方検索する文字をタイプしてゆく。次を検索するには C-rを押す。
  • M-x isearch-forward-regexp で正規表現を使った前方検索ができる。
    たとえば
    [0-9]\.[0-9]+\(e-[0-9]+\)L
    と打つと、1.234e-5Lや2.3e-4Lなどを検索できる。次を検索するには C-sを押す。

置換

  • M-% または M-x query-replace で文字列を置換できる。
  • M-x query-replace-regexp で文字列を正規表現を使って置換できる。

文字の色を変更する

(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では、開いたファイルはバッファというものに読み込まれます (特別な事をしなくてもふつうにそれを編集してファイルに上書き保存できます)。 つまり、開いたファイルは同じ名前のバッファに対応しています。 また、次のようにファイルに対応していないバッファもあります。

  • Buffer Listsバッファ (バッファのリストを表示する)
  • scratchバッファ (デフォルトでつくられている)
  • Messagesバッファ (メッセージの履歴が保存されている)
  • など

また、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の終了 C-x C-c
  • コマンドの途中終了(quit) C-g (何か不明なコマンドを実行してしまうなどして、 キー入力待ちなどになっている。途中終了したいときは C-gを押す)

ファイルに関する操作

  • ファイルを開く C-x C-f (ディレクトリも開ける)
  • ファイルの保存 C-x C-s
  • ディレクトリを開く C-x d (ファイラーとして使えて、カーソルをファイル名のある行に もってゆくことで、例えば次のような操作ができる)
    • f を押すとそのファイルを開く。
    • R を押すと、ファイル名を変更できる。
    • d でマークする。xを押すとマークしたファイルを削除できる。
    • C でファイルをコピーする。

カーソル移動

  • カーソルの移動 ← → ↑ ↓キー、またはそれぞれ C-b C-f C-p C-n でもよい。
  • 行の先頭に移動 C-a
  • 行の末尾に移動 C-e
  • バッファの先頭に移動 M-<
  • バッファの末尾に移動 M->
  • 関数の先頭に移動 M-a (C言語モードのときなど)
  • 関数の末尾に移動 M-e (C言語モードのときなど)
  • カーソルのある行が画面中央にくるようにバッファを表示 C-l (何回か押すと画面上、画面下、にもできる)

編集

  • カーソル位置の1文字を消す C-d
    • Del, BSが効かない場合は、キーのバインディングがデフォルトで変更されているため。 Del, BSで消すにはバインディングを変更する。
  • カーソル位置から1単語を消す M-d
  • カーソルから行の右側を消す C-k
  • アンドゥ C-x u
  • 直前の操作を繰り返す C-x z
    • 直前に C-x z をしていた場合は単に z を押すと再度その操作を繰り返す

コピー・キル・ペーストの編集

コピーとキルは、マークされた位置とカーソル位置の間が対象となる。 なお、マークセットのキーバインドは使っている環境によって別のアプリケーションが使用している場合が 多く見かけられる(そのため設定の変更が必要となる場合もある)。

  • コピー: C-SPC (または C-@) でマークセットをしてカーソルを移動させ M-w
  • キル: C-SPC (または C-@) でマークセットをしてカーソルを移動させ C-w
  • ペースト: C-y でカーソル位置に、最後にコピー又はキルしたものをペースト

矩形の編集

  • 矩形のキル: C-SPC (または C-@) でマークセットをしてカーソルを移動させ C-x r k (または M-x kill-rectangle)
  • 矩形のペースト: C-x r y (または M-x yank-rectangle)でカーソル位置に、ペースト

コマンドに引数を渡す

  • C-u 数字をタイプし コマンドをタイプ。 コマンドはなんでもよく( 例) C-f や M-x f や M-x forward-word などなど )、そのコマンドを数字の回数だけ繰り返される。

バッファに関する操作

  • 一画面下を表示 C-v
  • 一画面上を表示 M-v
  • バッファの一覧を表示 C-x C-b (カーソルをバッファ名のある行に もってゆくことで、例えば次のような操作が出来る)
    • ENTER を押すとそのバッファを表示する。
    • d でマークする。xを押すとマークしたバッファは削除できる。
  • バッファの切り替え C-x b
  • カーソルを次のバッファの移動 C-x o
  • カーソルのあるバッファを非表示 C-x 0
  • カーソルのあるバッファのみを表示 C-x 1
  • バッファを上下に二分割 C-x 2
  • バッファを左右に二分割 C-x 3

.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))

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-01-11 (木) 17:18:24 (129d)