#author("2024-10-21T22:59:10+09:00","default:okazaki","okazaki")
#author("2024-10-30T22:15:10+09:00","default:okazaki","okazaki")
#menu(howto/MenuBar)

* howto/emacs [#ca2c810f]
#contents

** 一行メモ [#p4db8e34]
- その他よく使う事柄 --  &new{2018-12-21 (金) 12:32:17};
-- マクロ定義と実行
-- 初期設定ファイル .emacs.el
-- バッファのメジャーモードとマイナーモード
-- 漢字コードに関すること
-- コマンドの作成
-- キーバインディングの変更
-- 開いているファイルのコンパイル

- 日本語表示・入力に関する事柄 --  &new{2019-08-27 (火) 13:49:44};
-- TeraTermProの画面上で emacsを使うと、表示がずれて正常でない場合、
下記の"[[.emacs.elに入れたらよいもの>#ebd16c95]]"から Kanji-codeの部分を .emacs.el または .emacs に追加するとよい
-- mozc,anthyによる日本語入力(Xmingで emacsウィンドウ)のためにも、
下記の"[[.emacs.elに入れたらよいもの>#ebd16c95]]"から 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のキーバインディング、略

- emacsのウィンドウだと}や]が入力できない? --  &new{2019-09-02 (月) 18:02:55};
-- Xmingのインストール時に保存したショートカット config.xlaunchのプロパティを開いて、リンク先を ...\config.xlaunch" -xkbmodel jp106 のようにオプション -xkbmodel jp106 をつけると良い。 --  &new{2019-09-02 (月) 18:37:13};
-- オプション -wgl でOpenGLのアクセラレーションを有効化するらしい。 --  &new{2019-09-06 (金) 18:25:29};
- emacsのウィンドウで等幅フォントを使うには? --  &new{2019-09-03 (火) 13:09:06};
- TABでspace入力! --  &new{2020-03-09 (月) 05:01:48};
- リンクメモ --  &new{2021-11-18 (木) 14:48:35};
-- https://emacs-jp.github.io/
-- [[https://qiita.com/Ladicle/items/>https://qiita.com/Ladicle/items/feb5f9dce9adf89652cf#%E3%82%B3%E3%83%BC%E3%83%89%E5%86%85%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97%E3%81%A8%E5%85%A8%E4%BD%93%E5%83%8F%E3%81%AE%E6%8A%8A%E6%8F%A1----imenu-list]]
-- https://github.com/DarthFennec/highlight-indent-guides#screenshots
-- https://mako-note.com/python-emacs-ide/#highlight-indent-guides
-- https://github.com/zk-phi/indent-guide
- load-pathとload https://www.math.s.chiba-u.ac.jp/~matsu/emacs/emacs-aux.html --  &new{2021-11-19 (金) 15:53:41};
- emacs -q     #.emacs.el を読み込まない --  &new{2021-11-21 (日) 00:56:41};
- M-C-v  他のウィンドウ(次のもののみ)をスクロールする --  &new{2021-11-21 (日) 08:21:18};
- M-:    そのバッファのもとで、ミニバッファを使って式を評価する --  &new{2021-11-21 (日) 08:21:41};
- emacsマニュアル --  &new{2021-11-21 (日) 21:46:07};
-- https://ayatakesi.github.io/emacs/24.5/elisp_html/Dedicated-Windows.html
-- https://ayatakesi.github.io/emacs/24.5/elisp_html/Windows.html#Windows
-- https://ayatakesi.github.io/emacs/24.5/elisp_html/Frames.html#Frames
-- https://ayatakesi.github.io/emacs/24.5/elisp_html/Splitting-Windows.html#Splitting-Windows
-- https://ayatakesi.github.io/emacs/24.5/elisp_html/Window-Parameters.html#Window-Parameters
- 2020年代のEmacs入門 https://emacs-jp.github.io/tips/emacs-in-2020?utm_source=pocket_mylist --  &new{2021-12-19 (日) 12:29:57};
- emacsのフレーム操作 --  &new{2022-01-24 (月) 14:45:16};
 C-x 5 2 新しいフレームを開く
 C-x 5 o 次のフレームに移る(フレームをアクティブにする)
 C-x 5 0 カレントフレームを閉じる
 C-x 5 1 カレントフレーム以外を閉じる
- M-x sort-lines でリージョンを並べ替えることが出来る --  &new{2022-06-15 (水) 17:31:57};
- diredモード: sで日付順/名前順に並び替える; (setq dired-listing-switches "-alv")をしておくと便利か。 --  &new{2022-08-24 (水) 10:49:02};
- C-x C-v 今のバッファにファイルを開く(ファイルを開いているバッファだとファイルを再度開き直すことができる)。 --  &new{2023-12-15 (金) 16:08:28};
- M-x view-lossage  #直近でタイプした100キーを表示(さらにさかのぼれる) --  &new{2024-10-30 (水) 22:15:10};

#comment



//--------------------------------------------------------------------------------

* その他 [#w51c7db1]

** terminal-emulatorの使い方 [#g6ec0608]

 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をスペースに変換する [#n2210e79]

 リージョンを指定して、
 M-x untabify


** リージョンをLinuxコマンドに渡して、いろいろする [#qc8b7990]

 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
 に置き換わる。


** 電卓がわりに使う [#if0c0dd7]

「*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


** 検索 [#h936bd94]

- 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を押す。


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


** 文字の色を変更する [#naf1b35a]

(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


** ミニバッファの文字の色を変更する [#a724145f]

例えばつぎのものを .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で文字コード指定してのファイル開き直しをしたい [#a8c94474]

 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; -*- */
 を入れるとよい。


** Emacsで自動的に変数設定やe-Lispコードを動かす例 [#k3ac5960]

 scriptversion=2024-10-21.22:51:27; # JST
 
 #-*- coding:utf-8; mode:shell-script; -*-
 #Local Variables:
 #mode: shell-script
 #sh-indentation: 2
 #eval: (add-hook 'before-save-hook 'time-stamp)  #最初にある "scriptver=" と "; " の間に日時が入る
 #time-stamp-start:     "scriptversion="
 #time-stamp-format:    "%:y-%02m-%02d.%02H:%02M:%02S"
 #time-stamp-time-zone: "Asia/Tokyo"
 #time-stamp-end:       "; "
 #End:


** ヘルプの表示、入力補完 [#nac1c120]
 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  変数名、関数名を補完する

** キーボードマクロ [#fd69937d]

*** 定義と実行 [#i5d0ebb8]
 C-x (  マクロ定義を開始する
 このあいだのキー操作がキーボードマクロとして記録される
 C-x )  マクロ定義を終了する

 C-x e  記録したキーボードマクロを実行する
 C-u NNN C-x e として、NNN回 C-x e を実行することもできる

*** 保存と読み込み [#sa8b6d73]
 M-x name-last-kbd-macro   定義したマクロに名前を付ける(M-x 付けた名前 で実行できるようになる)
 M-x insert-kbd-macro      名前を付けたマクロを、バッファに挿入する(新規ファイルに挿入し保存できる)
 M-x load-file             ファイルに保存したマクロを読み込む(M-x マクロ名 で実行できるようになる)
                           .emacs.elに (load-file ファイル名) を追加しても可能。

** リカーシブエディット(再帰編集) [#rf29e7c0]
 マクロ定義中に C-x q を入力   マクロ実行時に確認応答する(継続、中止、再帰編集などができる)
 
 M-x query-replace など        実行中に ?でヘルプが出る(C-r で再帰編集ができる)
 
 M-x recursive-edit            再帰編集をする(編集終了は M-C-c)


** その他の編集 [#df4df1ba]

*** 単語の補間 [#d10d1919]

 M-/    単語を補間する(入力中の文字列を、既に入力済みの文字列に補完)

*** 単語を大文字、小文字に変換 [#f9000cdc]

 M-u    カーソル位置から、次の単語区切りまでの文字列を、大文字に変換する
 M-l    カーソル位置から、次の単語区切りまでの文字列を、子文字に変換する


//--------------------------------------------------------------------------------
* 基本 [#g5ba951c]

** 用語とチュートリアル [#w06b9ac0]

*** バッファ [#ba693e00]

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

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

また、emacsではいくつでもファイルを開くことができます。

emacsでは
少なくとも1枚のバッファが表示されていますが、
emacsウィンドウを分割して、いくつでも同時にバッファを
表示することもできます。

(注)「ウィンドウとフレーム」 
emacsでは、バッファを表示している部分を ウィンドウ(バッファウィンドウ)と呼び、
emacs自体の全体画面のことを、フレーム(フレームウィンドウ)と呼びます。
(X11でemacsを立ち上げている場合、フレームは X11の用語で言う ウィンドウに相当します。
キャラクタ端末でemacsを立ち上げている場合は、フレームは端末の画面全体の事になります。)

*** モードライン [#ib7eb327]

emacsでバッファを表示すると、バッファの下に反転した行が1行ある
(バッファが1枚だけの場合はちょうど下から二行目に反転した行がある)。
この行をモードラインと呼ぶ。
そのバッファ名などが表示されている
(利用している文字コード、使用しているモード、行数なども)。

*** ミニバッファ [#s11386ee]

emacsの一番下の行のことをミニバッファと呼ぶ。
コマンド実行後にメッセージが表示されたりします。
コマンドを入力したり、コマンドが要求する入力
(例えばファイル名入力する)にも使われます。


*** チュートリアル [#r0f3a0fc]

emacs自身には簡単なチュートリアルが含まれています。~
$ emacs~
とした後、~
ESC~
そして~
x~
とキーを押すと、ミニバッファに M-x が表示され、
その右にカーソルが表示されます。
つづけて、~
help-with-tutorial~
という文字を入力(これはコマンド名になります)して ENTERキー
を押す。
すると TUTORIALのバッファがでてくるので、
説明を読みながら操作を学習できます。

ちなみに、emacsのコマンドはほぼすべてがLispの関数です。
emacsは、実はLispインタープリタです。

//--------------------------------------------------------------------------------

** いくつかの操作 [#kac255bc]

*** Ctrl, Meta, CAPS, Bindingに関する基本 [#z7985c5d]

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 にバインドされています。


*** 終了などの操作 [#y9b1c444]

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


*** ファイルに関する操作 [#obee60d3]

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


*** カーソル移動 [#gff0cfec]

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


*** 編集 [#y4f8406d]
- カーソル位置の1文字を消す  C-d
-- Del, BSが効かない場合は、キーのバインディングがデフォルトで変更されているため。
Del, BSで消すにはバインディングを変更する。
- カーソル位置から1単語を消す  M-d

- カーソルから行の右側を消す  C-k

- アンドゥ C-x u

- 直前の操作を繰り返す  C-x z
-- 直前に C-x z をしていた場合は単に z を押すと再度その操作を繰り返す

*** コピー・キル・ペーストの編集 [#q6b93273]
コピーとキルは、マークされた位置とカーソル位置の間が対象となる。
なお、マークセットのキーバインドは使っている環境によって別のアプリケーションが使用している場合が
多く見かけられる(そのため設定の変更が必要となる場合もある)。
- コピー: C-SPC (または C-@) でマークセットをしてカーソルを移動させ M-w
- キル: C-SPC (または C-@) でマークセットをしてカーソルを移動させ C-w
- ペースト: C-y でカーソル位置に、最後にコピー又はキルしたものをペースト

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


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


*** バッファに関する操作 [#w539e8ca]

- 一画面下を表示  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に入れたらよいもの [#ebd16c95]

とくに、cygtermやtera term上でemacsを起動したとき、下記が無いと表示がずれることがあるので
必須でもある。
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
 ;;; 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) [#w6d7f0a3]

** *scratch*バッファを利用して lispプログラムを作る [#x3e10e0e]

「*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 でも実行できる                                                                  

** 用語? [#d2b80a35]

 整数       0, 1, 2, -1, など
 キャラクタ ?A ?a ?\C-a など(入力に対応する)
 文字列     "..."
 ブール値   t, nil
 シンボル   関数名や変数名であり、評価され、値が返る
 'シンボル  シンボル名そのもの

** リストの例 [#x6f343f0]

 ;; ( 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)                                                                    


** 演算 [#f665b947]

 論理演算  and, or, not, =, <, >, eq, など
 算術演算  +, *, -, /, など

(注) 関数名であるので、(+ 1 2) などと使う

** フロー制御 [#n0ca2871]

 (cond ((条件式1) (真のときの評価式))
       ((条件式2) (真のときの評価式))
       ...
       ((条件式N) (真のときの評価式))
       ( t  (どれも真にならないときの評価式)))

 (if (条件文) (真のときの評価式)
              (偽のときの評価式))

 (progn (逐次処理の式1)
       (逐次処理の式2)
       ...
       (逐次処理の式N))

 (let ((ローカル変数1 値1)
       (ローカル変数2 値2)
       ...
       (ローカル変数N 値N))
       (逐次処理の式1)
       (逐次処理の式2)
       ...
       (逐次処理の式M))

 (while (条件式)
        (逐次処理の式1)
        (逐次処理の式2)
        ...
        (逐次処理の式M))



//--------------------------------------------------------------------------------

* emacsclient [#qcbac301]

ある意味便利そうではあるが、ずぼらな人は使うのを避けたほうが無難と思われる(?)

できること:~
あるマシンでバックグラウンドでサーバーのemacsをひとつ動かしておく。
emacsclientで通常のemacsと同じ操作ができる。
ただし、開いたファイルはすべてサーバーemacsがもっており、
別途emacsclientを起動しても、先にemacsclientで開いていたファイルを編集できるし、
その逆もできる(別途起動したemacsclientで開いたファイルを先のemacsclientで編集できる)。
すなわち、バッファは共有されし、コピペ(クリップボードやキリングリスト)も共有される。
サーバーemacsは明示的に終了させるまで、ログアウトしても動き続ける、
ファイル(バッファ)も明示的に閉じない限り開きっぱなしになる。
別の言い方をすると、再ログインして続きから作業が可能である。
もしかしたら、ひとつのマシンに限らず、複数のマシンでひとつのサーバーemacsを起動して使えるかもしれない(未調査)。

具体的には、~
1) 複数の端末(TeraTermなど)で動かしたemacsclientで共同・共有してファイル編集・コピペができる。~
2) 複数のフレーム(X11ウィンドウ)を表示させるようにemacsclientを動かして、共同・共有でファイルを編集・コピペができる。
これはあまり有意義な使い方ではないだろう。~
3) フレーム(X11ウィンドウ)をひとつだけ表示させて、端末(gnome-termなど)からemacsclientを動かし、
どの端末からでも表示済みのフレームで作業する。~

** 1) 複数の端末(TeraTermなど)で動かしたemacsclientで共同・共有 [#dc9973c0]

 emacs --daemon  #サーバーemacsを起動
                 #(ひとつだけが実行可。どこの端末からでもいいので一度だけする)
 
 emacsclient -nw  #-nwのかわりに-tや-ttyでも同じ
 
 emacsclient -e '(kill-emacs)'  #サーバーemacsの終了
 
 サーバーemacsの起動を次のようにしてもよい。
 emacsclient -a '' -nw       #サーバーが動いていなければ起動する
 
 emacsclient -a '' hoge.txt  # 〃 そして、ファイルを開く。
                             #ただし、Windows IMSで日本語が入力できなくなる(理由不明)

** 3) フレーム(X11ウィンドウ)をひとつだけ表示させてemacsclientで共同・共有 [#b0af5fa8]

 emacs --daemon  #サーバー起動
                 #(ひとつだけが実行可。どこの端末からでもいいので一度だけする)
 
 emacsclient --no-wait -c  #-cオプションで新規フレーム(X11ウィンドウ)を開く
                           #--no-waitでプロンプトをすぐ返す。つけ忘れても、Ctrl-z, bgで同様。
                           #なお、フレームをC-x C-cで閉じてもサーバーemacsは動いていることに注意
 
 emacsclient --no-wait hoge.txt  #動いているフレームでファイルが開かれる
                                 #もしフレームがなければ現在の端末で共同・共有されないemacsが動く
 
 emacsclient -e '(kill-emacs)'  #サーバーemacsの終了
 
 サーバーemacsの起動を次のようにしてもよい。
 emacsclient -a '' -c           #サーバーが動いていなければ起動し、新規フレームを開く
 
 emacsclient -a '' -c hoge.txt  # 〃                             、〃   そして、ファイルを開く
 
 emacsclient -a ''    hoge.txt  # 〃                       起動する。そして、ファイルを開く
                                #もしフレームがなければ現在の端末で共同・共有されないemacsが動く



//--------------------------------------------------------------------------------

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS