Emacs tutorial

# はじめに
Emacsのコマンドって覚えるの大変...
実際に練習してもなかなか覚えられないと思うので、すぐに見れるようにまとめてみた
後から見つけた神サイト
[Emacsチートシート](https://gihyo.jp/assets/files/magazine/SD/2015/201510/download/Furoku_CheatSheet_Emacs.pdf)

# 目次
[基本コマンド](https://qiita.com/drafts/78ce16f445bcd123b732/edit#基本コマンド)
[移動系](https://qiita.com/drafts/78ce16f445bcd123b732/edit#移動系)
[削除系](https://qiita.com/drafts/78ce16f445bcd123b732/edit#削除系)
[選択・コピー・ペースト](https://qiita.com/drafts/78ce16f445bcd123b732/edit#選択コピーペースト)
[分割機能](https://qiita.com/drafts/78ce16f445bcd123b732/edit#分割機能)
[検索系](https://qiita.com/drafts/78ce16f445bcd123b732/edit#検索系)
[モード](https://qiita.com/drafts/78ce16f445bcd123b732/edit#モード)
[置換モード](https://qiita.com/drafts/78ce16f445bcd123b732/edit#置換モード)
[ディレクトリモード](https://qiita.com/drafts/78ce16f445bcd123b732/edit#ディレクトリモード)

[おまけ](https://qiita.com/drafts/78ce16f445bcd123b732/edit#おまけ)
[縦・横にwindowをn分割にする。](https://qiita.com/drafts/78ce16f445bcd123b732/edit#縦横にwindowをn分割にする)
[tabを一括挿入・削除](https://qiita.com/drafts/78ce16f445bcd123b732/edit#tabを一括挿入削除)


## 基本コマンド
|名前|キーバインド|
|----------|----|
|ファイルを開く|C-x　C-f|
|シェルを開く|C-x z|
|Emacsを閉じる|C-x C-c|
|Emacsから抜ける|C-z|
|Emacsに戻る|fg|
|戻る|C-x u|
|キャンセル|C-x g|

困ったらC-x g これが最強

## 移動系
|名前|キーバインド|
|----------|----|
|←|C-b|
|→|C-f|
|↑|C-p|
|↓|C-n|
|最初|M-<|
|最後|M->|
|次ページ|C-v|
|前ページ|C-u|
|行頭|C-a|
|行末|C-e|

## 削除系
|名前|キーバインド|
|-----|-----|
|削除|C-d|
|delete|C-h|

## 選択・コピー・ペースト
|名前|キーバインド|
|----------|----|
|選択|C-space|
|全選択|C-a|
|コピー|M-y|
|カット|C-y|
|ペースト|C-y|
## 分割機能
|名前|キーバインド|
|----------|----|
|縦に分割|C-x 2|
|横に分割|C-x 3|
|window移動(次)|C-x o|
|window移動(後)|C-x p|
|window最大化|C-x 1|
|windowを閉じる|C-x 0|
## 検索系
|名前|キーバインド|
|----------|----|
|行に移動|C-x g|
|検索|C-s 文字|
|次の候補|C-s|
|前の候補|C-r|
## モード
|名前|キーバインド|
|----------|----|
|置換モード|M-%|
|ディレクトリモード|C-x C-f|
|バッファーモード|C-x b|
## 置換モード
|名前|キーバインド|
|----------|----|
|許可|Space,y|
|拒否|n|
|全部拒否|!|
|抜ける|q|
## ディレクトリモード
|名前|キーバインド|
|----------|----|
|戻る|^|
|ファイル作成|C-x C-f ファイル名|
|ディレクトリ作成|+ ディレクトリ名|
|マークつける|m|
|マーク削除|u|
|マーク全削除|U|
|コピー|C|
|名前変更/移動|R|
|削除|D

ゆっくり慣れていこう！！

## おまけ
キーバインドは実は好きなように増やせるんです！
いくつか自分で作った(by Chatgpt)のコマンドがあるので
よければ使ってみてください

### 縦・横にwindowをn分割にする。
emacsで以下のファイルを開く

```
~/.emacs.d/init.el
```

ここで一番下まで動かし(M->)、以下の文章をそのまま入力

```elisp
;現在のウィンドウを縦方向にN分割する。
(defun split-current-window-vertically (n)
  (interactive "n縦に分割する数を入力してください: ")
  (let ((i 1))
    (while (< i n)
      (split-window-below) ;; 横分割
      (setq i (1+ i)))
    (balance-windows)))
    
;現在のウィンドウを横方向にN分割する。
(defun split-current-window-horizontally (n)                
  (interactive "n横に分割する数を入力してください: ")
  (let ((i 1))
    (while (< i n)
      (split-window-right) ;; 縦分割
      (setq i (1+ i)))
    (balance-windows)))
    
;; キーバインドの設定
(global-set-key (kbd "C-x v") 'split-current-window-vertically)
(global-set-key (kbd "C-x h") 'split-current-window-horizontally)
```

これでemacsを閉じてひらけばOK

```
#縦方向に4つに分割
C-x v 4
#横方向に4つに分割
C-x h 4
```
7ぐらいまでならできる。

### tabを一括挿入・削除

コード書く時にtab挿入削除多いですよね、
for忘れたりいらなくなったりした時は特に...
それ用です
挿入は空白4つ
削除は文頭4つ削除なので、そこだけお気をつかて
実装は先ほどと同じなのでコードだけ

```elisp
;tabを挿入
(defun insert-tab-to-region (start end)                     
  (interactive "r")
  (save-excursion
    (goto-char start)
    (while (< (point) end)
      (insert "    ")        
      (forward-line 1))))

;行頭のタブを削除
(defun remove-tab-from-region (start end)                                                                               
  (interactive "r")
  (save-excursion
    (goto-char start)
    (while (< (point) end)
      (when (looking-at "^\t")  ; 行頭がタブの場合                         
        (delete-char 1))
      (forward-line 1))))
      
;キーバインド設定
(global-set-key (kbd "C-x ti") 'insert-tab-to-region)
(global-set-key (kbd "C-x tr") 'remove-tab-from-region)
```

```shell
#タブを行頭に挿入
C-x t-i
#タブを行頭から削除
C-x t-r
```