SlideShare a Scribd company logo
Submit Search
Upload
Emacs上のターミナルを最強に
Report
Lintaro Ina
Software Engineer at Hatena
Follow
•
1 like
•
13,073 views
1
of
37
Emacs上のターミナルを最強に
•
1 like
•
13,073 views
Download Now
Download to read offline
Report
Software
2012-10-20 @関西Emacs#x06
Read more
Lintaro Ina
Software Engineer at Hatena
Follow
Recommended
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
2.6K views
•
59 slides
Building the Game Server both API and Realtime via c#
Yoshifumi Kawai
53.8K views
•
67 slides
Zshでデキるプロンプト
Maruyama Tetsutaro
22.1K views
•
25 slides
例外設計における大罪
Takuto Wada
68.5K views
•
37 slides
Mavenの真実とウソ
Yoshitaka Kawashima
13K views
•
67 slides
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
モノビット エンジン
3.2K views
•
47 slides
More Related Content
What's hot
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
21.8K views
•
64 slides
Serf / Consul 入門 ~仕事を楽しくしよう~
Masahito Zembutsu
19.3K views
•
64 slides
プログラミング言語Clojureのニャンパスでの活用事例
sohta
13.6K views
•
34 slides
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
Naoya Kishimoto
2.5K views
•
123 slides
200人での対戦も可能!?Photon 新SDKについて
Photon運営事務局
720 views
•
31 slides
やはりお前らのMVCは間違っている
Koichi Tanaka
145.6K views
•
66 slides
What's hot
(20)
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
•
21.8K views
Serf / Consul 入門 ~仕事を楽しくしよう~
Masahito Zembutsu
•
19.3K views
プログラミング言語Clojureのニャンパスでの活用事例
sohta
•
13.6K views
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
Naoya Kishimoto
•
2.5K views
200人での対戦も可能!?Photon 新SDKについて
Photon運営事務局
•
720 views
やはりお前らのMVCは間違っている
Koichi Tanaka
•
145.6K views
MQTTとAMQPと.NET
terurou
•
39.8K views
Docker Tokyo
cyberblack28 Ichikawa
•
22.4K views
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
•
138K views
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
•
25.9K views
Fluentdのお勧めシステム構成パターン
Kentaro Yoshida
•
51.1K views
SFUの話
tnoho
•
14.3K views
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
•
61.4K views
Redisの特徴と活用方法について
Yuji Otani
•
101.5K views
"Simple Made Easy" Made Easy
Kent Ohashi
•
2.6K views
Prometheus入門から運用まで徹底解説
貴仁 大和屋
•
34.8K views
暗号技術の実装と数学
MITSUNARI Shigeo
•
9.6K views
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
gree_tech
•
10.4K views
Redis勉強会資料(2015/06 update)
Yuji Otani
•
52.5K views
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
NTT DATA Technology & Innovation
•
2.2K views
Similar to Emacs上のターミナルを最強に
Tmux
harutsugu shimoji
618 views
•
11 slides
Tmux
harutsugu shimoji
1.4K views
•
12 slides
いまさら聞けないRake入門
Tomoya Kawanishi
11.4K views
•
24 slides
最強のPHP統合開発環境 PHPStorm
晃 遠山
12.3K views
•
39 slides
仕事で使えるシェルスクリプト
bsdhack
18.9K views
•
32 slides
ソースコードの共通化
Jun Hosokawa
1.7K views
•
52 slides
Similar to Emacs上のターミナルを最強に
(20)
Tmux
harutsugu shimoji
•
618 views
Tmux
harutsugu shimoji
•
1.4K views
いまさら聞けないRake入門
Tomoya Kawanishi
•
11.4K views
最強のPHP統合開発環境 PHPStorm
晃 遠山
•
12.3K views
仕事で使えるシェルスクリプト
bsdhack
•
18.9K views
ソースコードの共通化
Jun Hosokawa
•
1.7K views
鈴木:Net commonsでの中国語使用について
michiosuzuki
•
264 views
鈴木:Net commonsでの中国語使用について
michiosuzuki
•
244 views
卒研発表
yayugu
•
1.6K views
8F Emacs seminar 1st
toshi_pp
•
1.1K views
End-to-End音声認識ためのMulti-Head Decoderネットワーク
NU_I_TODALAB
•
1.9K views
最低限の開発環境を整えるには
vi-iv
•
1.3K views
Erlangやってみた
ina job
•
663 views
C++ Transactional Memory言語拡張の紹介
yohhoy
•
4.8K views
エコSmalltalk
Sho Yoshida
•
689 views
DelphiでWin/Macクロスコンパイル
Tomonori Ohba
•
6.8K views
2017-12-04 Linuxの基本構造とBashでの扱い方
浩平 渡邉
•
187 views
20130228 Goノススメ(BPStudy #66)
Yoshifumi Yamaguchi
•
11.6K views
181106 02
openrtm
•
438 views
Buffer overflow
ionis111
•
3.1K views
More from Lintaro Ina
Gradual Typing for Generics
Lintaro Ina
3.4K views
•
47 slides
論理と計算のしくみ 5.3 型付きλ計算 (前半)
Lintaro Ina
19.4K views
•
60 slides
HTMLからの本文抽出
Lintaro Ina
9.6K views
•
27 slides
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
Lintaro Ina
36.2K views
•
42 slides
はてなブックマーク in Scala
Lintaro Ina
68.7K views
•
40 slides
『BrandSafe はてな』のアドベリフィケーションのしくみ
Lintaro Ina
8.9K views
•
38 slides
More from Lintaro Ina
(7)
Gradual Typing for Generics
Lintaro Ina
•
3.4K views
論理と計算のしくみ 5.3 型付きλ計算 (前半)
Lintaro Ina
•
19.4K views
HTMLからの本文抽出
Lintaro Ina
•
9.6K views
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
Lintaro Ina
•
36.2K views
はてなブックマーク in Scala
Lintaro Ina
•
68.7K views
『BrandSafe はてな』のアドベリフィケーションのしくみ
Lintaro Ina
•
8.9K views
『BrandSafe はてな』のアドベリフィケーションのしくみ
Lintaro Ina
•
21K views
Emacs上のターミナルを最強に
1.
Emacs上のターミナルを最強に 伊奈 林太郎 2012-10-20 @
関西 Emacs#x06 伊奈 林太郎 Emacs 上のターミナルを最強に 1
2.
ターミナル使ってますか? ◮ 素のターミナル ◮ 標準的なターミナルエミュレータ xterm,
gnome-terminal, Terminal.app, ... ◮ マルチプレクサ screen, tmux, ... ◮ ssh といっしょになってるもの PuTTY, Tera Term, ... ◮ Emacs 上 term.el ◮ 使ってない eshell.el, ... ◮ その他 伊奈 林太郎 Emacs 上のターミナルを最強に 2
3.
ターミナル使ってますか? ◮ 素のターミナル ◮ 標準的なターミナルエミュレータ xterm,
gnome-terminal, Terminal.app, ... ◮ マルチプレクサ screen, tmux, ... ◮ ssh といっしょになってるもの PuTTY, Tera Term, ... ◮ Emacs 上 term.el ◮ 使ってない eshell.el, ... ◮ その他 伊奈 林太郎 Emacs 上のターミナルを最強に 2
4.
ターミナルとEmacs ターミナルエミュレータを使う理由 ◮ ncurses アプリもちゃんと動いてほしい ◮
素の端末を触るときにパニくらない Emacs との共存 ◮ Emacs は別窓で ◮ ウィンドウが増えてうざい ◮ 端末とのコピペが面倒 ◮ screenの中で Emacs ◮ キーボードだけでコピペ ◮ Emacs ごと detach 伊奈 林太郎 Emacs 上のターミナルを最強に 3
5.
screenのままならないところ ◮ 改造しにくい ◮ CJK
ambiguous width ◮ 問題の切り分けが難しくなる ◮ (X などの) クリップボードとの連携 ◮ 面倒なハックが必要 ◮ 環境変数の引き渡し ◮ 外部からのコマンド発行で解決 (要開発版) # この辺は tmux でも同じですね 伊奈 林太郎 Emacs 上のターミナルを最強に 4
6.
すべてEmacsでやる ◮ CJK, クリップボード なども
OK ◮ detach もできる (emacs --daemon) ◮ Emacs 本体と連携 ⊚ ◮ 操作性を一体に ◮ Lisp で改造しまくり 伊奈 林太郎 Emacs 上のターミナルを最強に 5
7.
Emacs内端末エミュレータterm.el 使い方 M-x term, M-x
ansi-term 特徴 — 2 つのモード ◮ term-char-mode ◮ 打ったものがそのまま端末へ ◮ term-line-mode ◮ Emacs のバッファに近い編集 しくみ ◮ process-filterで制御シーケンスを解釈 ◮ バッファに put-text-propertyしながら表示 伊奈 林太郎 Emacs 上のターミナルを最強に 6
8.
term.elのいけてないところ ◮ キーがほぼすべて端末に持っていかれる ◮ M-x
とかきかない ◮ でも ESC とかどっちで認識すべき? ◮ 端末が 1 つしか開けない (内部的には可能だけどインタフェースが無い) ◮ 色が 8 色しかない ◮ term-line-modeがちょっと貧弱 ◮ コードがレガシーで拡張しにくい ◮ 関数がでかい ◮ hook も少ない ◮ 遅い 伊奈 林太郎 Emacs 上のターミナルを最強に 7
9.
term+.el — term.elを強化する 主な機能 ◮
256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 8
10.
term+.elをとりあえず使ってみる ダウンロード → 真っ新な状態でのお試し °
git clone git://github.com/tarao/term-plus-all.git ° cd term-plus-all ° git submodule update --init ° make emacs # or make term # or make EMACS=emacs-snapshot term 注意点 ◮ Emacs 24.1.50 で開発してます ◮ 22 はサポートしません ◮ 23 は細かいところが不安定かも ◮ 24.2 はおそらく OK ◮ 24.3 (24.2.50) の term.elの変更には未対応 伊奈 林太郎 Emacs 上のターミナルを最強に 9
11.
デモ 伊奈 林太郎 Emacs
上のターミナルを最強に 10
12.
term+.el — term.elを強化する 主な機能 ◮
256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 11
13.
256色対応 / xterm互換性 (require
³xterm-256color) 256 色対応 ◮ 256 色表示の制御シーケンスの解釈を実装 ◮ ついでに斜体 , 取り消し線等にも対応 ◮ 原理的には 24bit 色に対応可能 (cf. Konsole) (24bit 色表示しようとするアプリはあるのか?) xterm 互換性 (TERM=xterm-256color) ◮ TERM=eterm-256colorを定義すればよい? ◮ たいていのアプリは terminfo なんか見てない ◮ xterm を騙れば 256 色表示しようとしてくれる ◮ 騙るからには xterm 制御シーケンスを処理 (不完全) 伊奈 林太郎 Emacs 上のターミナルを最強に 12
14.
term+.el — term.elを強化する 主な機能 ◮
256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 13
15.
キーバインド強化 [1/2] (require ³term+) 端末に奪わせないキーを定義 ◮
term+char-mapに define-key 定義 するだけ (multi-term.elでもできますね) ◮ 定義済みのキー (M-x des-fun, term-char-mode) C-q 後続のキーをそのまま端末に渡す C-y 端末へ貼り付け M-RET 編集モード (term-line-mode)へスイッチ ESC 端末へ ESC を送る C-c 0.5 秒間何も入力がなければ端末へ C-c 直後に何か入力すればプレフィックスキー ◮ Emacs 本体で実行 (nil をマップ): M-x, M-:, C-x 伊奈 林太郎 Emacs 上のターミナルを最強に 14
16.
キーバインド強化 [2/2] (require ³key-intercept) 後続のキーがあるかどうかで意味が違う! ESC
端末へ ESC を送る M-x ふつうの M-x C-c 0.5 秒間何も入力がなければ端末へ C-c 直後に何か入力すればプレフィックスキー 実装: key-intercept.el ◮ https://github.com/tarao/key-intercept-el ◮ プレフィックスキーにもコマンドを割り当てる http://d.hatena.ne.jp/tarao/20120427/1335527960 伊奈 林太郎 Emacs 上のターミナルを最強に 15
17.
term+.el — term.elを強化する 主な機能 ◮
256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 16
18.
編集機能強化 [1/2] (require ³term+) 編集モード
(term-line-mode)中は ◮ 入力フィールド外では読取専用 ◮ SPC で選択開始 もう一度 SPC で範囲コピー → 編集モード終了 ◮ RET, ESC で編集モード終了 ◮ 入力フィールド内ではふつうのバッファ ◮ ただし RET で端末に送信 ◮ ふつうの改行は C-j ◮ 別のメジャーモードにもできる e.g. シェルのプロンプトに sh-modeで入力 伊奈 林太郎 Emacs 上のターミナルを最強に 17
19.
編集機能強化 [1/2] (require ³term+) 編集モード
(term-line-mode)中は ◮ 入力フィールド外では読取専用 ◮ SPC で選択開始 もう一度 SPC で範囲コピー → 編集モード終了 ◮ RET, ESC で編集モード終了 ◮ 入力フィールド内ではふつうのバッファ ◮ ただし RET で端末に送信 ◮ ふつうの改行は C-j ◮ 別のメジャーモードにもできる e.g. シェルのプロンプトに sh-modeで入力 伊奈 林太郎 Emacs 上のターミナルを最強に 17
20.
編集機能強化 [2/2] (require ³multi-mode-util) 入力フィールドだけ別モード ◮
あらかじめどのモードにするか指定 (後述) ◮ 編集モードに入ると indirect buffer 間接バッファ を作成 ◮ multi-mode.el http://www.loveshack.ukfsn.org/emacs/multi-mode.el ◮ multi-mode-util.el https://github.com/tarao/multi-mode-util 伊奈 林太郎 Emacs 上のターミナルを最強に 18
21.
term+.el — term.elを強化する 主な機能 ◮
256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 19
22.
ログ機能 (require ³term+) term-start-output-log ◮ term.elに元からある
(ほぼデバッグ用) term+hardcopy (C-c h) ◮ 一画面だけテキスト保存 (追記可) ◮ screenの:hardcopy相当 term+start-buffer-log (C-c l) ◮ いままでの累積テキストを保存 ◮ 表示限界 (2048 行) を超えた分も保存 term+start-record (C-c r) ◮ 端末の制御シーケンスを時系列で保存 ◮ ttyrec互換 (ttyplayで再生可) 伊奈 林太郎 Emacs 上のターミナルを最強に 20
23.
term+.el — term.elを強化する 主な機能 ◮
256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 21
24.
マルチプレクサ [1/3] (require ³term+mux) やりたいこと ◮
複数の端末をタブ表示 (tabbar.el, emux.elでもできますね) ◮ 編集モード以外のときはモードラインをタブに ◮ セッション (ユーザ/ホストの別) ごとにグループ化 ◮ 同一セッションからは 1 つだけバッファ一覧に ◮ セッション内の選択中のタブが代表 ◮ 一覧中ではバッファ名ではなくセッション名 伊奈 林太郎 Emacs 上のターミナルを最強に 22
25.
マルチプレクサ [2/3] タブグループ (require
³term+mux) 実装: tab-group.el ◮ https://github.com/tarao/tab-group-el ◮ 車輪の再発明 ◮ tabbar.elでできることはだいたいできる ◮ モードラインにも表示できる ◮ バッファをひとまとめにできる ◮ かっこいいタブ選択 UI ◮ D&D でタブ移動 伊奈 林太郎 Emacs 上のターミナルを最強に 23
26.
マルチプレクサ [3/3] セッション管理 (require
³term+mux) M-x term+mux-new ◮ 現在のセッションで (or 選択して) 端末を開く M-x term+mux-new-command ◮ 現在のセッションで指定のコマンドを実行 M-x term+mux-remote-session ◮ ユーザ/ホストを指定してセッションを作成 ◮ シェル端末も 1 つ開く ◮ ローカルで root なら sudo する ◮ リモートなら ssh する 伊奈 林太郎 Emacs 上のターミナルを最強に 24
27.
term+.el — term.elを強化する 主な機能 ◮
256 色対応 / xterm 互換性向上 ◮ キーバインド強化 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサ (+ マルチセッション) ◮ シェル連携強化 伊奈 林太郎 Emacs 上のターミナルを最強に 25
28.
シェル連携 できること ◮ 編集モード ◮ 編集モードでのメジャーモード指定 ◮
バッファ内容を引き継いで編集モードへ ◮ ユーザ/ホスト/ディレクトリ通知 ◮ ファイル転送 (open / view / get / put) ◮ シェルコマンド履歴選択 ◮ マルチプレクサ ◮ タブタイトル設定 ◮ cdd (別タブの現在ディレクトリを取得) 方法 ◮ 端末内から特殊な制御コマンドを送る 伊奈 林太郎 Emacs 上のターミナルを最強に 26
29.
シェル連携 [1/6] 編集モード M-i
で sh-modeの編集モードへ (zsh) function switch-to-line-mode-insert () {1 local buf="°BUFFER"2 zle kill-buffer3 zle -R # reset command line4 echo -ne "e]51;mode;sh-modee" > /dev/tty5 echo -ne "e]52;i;°bufe" > /dev/tty6 }7 zle -N switch-to-line-mode-insert8 bindkey ³^[i³ switch-to-line-mode-insert9 参照 https://raw.github.com/tarao/dotfiles/master/.zsh/eterm.zsh 伊奈 林太郎 Emacs 上のターミナルを最強に 27
30.
シェル連携 [2/6] セッション情報 ユーザ名/ホスト名を通知 host=
hostname # ホスト名10 echo -ne "e]51;host;°hoste" > /dev/tty11 user= id -run # ユーザ名12 echo -ne "e]51;user;°usere" > /dev/tty13 ディレクトリ通知 (zsh) function precmd_eterm_cwd () {14 local dir; dir= pwd15 echo -ne "e]51;cd;°dire" > /dev/tty16 }17 typeset -Uga precmd_functions # これは一回だけ18 precmd_functions+=precmd_eterm_cwd19 ◮ Emacs 側の default-directoryが変更される ◮ TRAMP でリモートファイルも開ける 伊奈 林太郎 Emacs 上のターミナルを最強に 28
31.
シェル連携 [3/6] ファイル転送 function
o() { # シェルで見えてるファイルを開く20 echo -ne "e]51;open;°1e" > /dev/tty }21 function v() { # シェルで見えてるファイルを view-mode で開く22 echo -ne "e]51;view;°1e" > /dev/tty }23 function get() { # シェルで見えてるファイルを手元にコピー24 echo -ne "e]51;get;°1e" > /dev/tty }25 function put() { # シェルで見えてる場所に26 # ファイルを選択してコピー27 echo -ne "e]51;put;e" > /dev/tty }28 ◮ セッション情報を通知しておく必要あり ◮ get/put は FTP と同じ向き ◮ put するとミニバッファでファイルを訊く ◮ dired インタフェースでの複数選択も可 伊奈 林太郎 Emacs 上のターミナルを最強に 29
32.
シェル連携 [4/6] 履歴選択 C-r
で履歴選択 (zsh) echo -ne "e]51;histfile;°HISTFILEe" >/dev/tty #一回だけ29 30 function history-search-eterm () {31 local buf="°BUFFER"32 zle kill-buffer33 echo -ne "e]52;h;°bufe" > /dev/tty }34 zle -N history-search-eterm35 bindkey ³^R³ history-search-eterm36 ◮ 類似: zsh の履歴検索に anything.elを使う http://d.hatena.ne.jp/tarao/20100429/1272509893 伊奈 林太郎 Emacs 上のターミナルを最強に 30
33.
シェル連携 [5/6] マルチプレクサ タブタイトル変更 ◮
screen の ekSTR e 形式 ◮ tmux の e]2;STRe 形式 参考 https://raw.github.com/tarao/dotfiles/master/.zsh/screen-title.zsh cdd ◮ 他のタブの pwd に移動する ◮ オリジナルは id:secondlife さん (screen用) http://d.hatena.ne.jp/secondlife/20080218/1203303528 参照 https://raw.github.com/tarao/dotfiles/master/.zsh/eterm.zsh 伊奈 林太郎 Emacs 上のターミナルを最強に 31
34.
シェル連携 [6/6] カスタマイズ 定義済みの特殊制御コマンドを調べる ◮
M-x des-fun, term-emulate-terminal ◮ M-x term+control-command-list 新しい特殊制御コマンドを定義する (require ³term+vars)37 (defun my-control-command (text) ...)38 (term+new-control-command39 "START" "END " ³my-control-command)40 例 (defun term+open (files &optional find-file) ...)41 (term+new-control-command42 "033]51;open;" "033" ³term+open)43 伊奈 林太郎 Emacs 上のターミナルを最強に 32
35.
まとめ Emacs 上でだって端末機能をフルに使いたい! ◮ 256
色対応 ◮ xterm 互換性向上 ◮ キーバインド Emacs なのをいいことに魔改造 ◮ 編集機能の強化 ◮ ログ機能 ◮ マルチプレクサをまるごと実装 ◮ シェル連携しまくり 伊奈 林太郎 Emacs 上のターミナルを最強に 33
36.
参考URL 伊奈林太郎. このスライド. http://up.orezdnu.org/papers/kansai-emacs/%23x06/slide/slide.pdf. INA Lintaro. term+.el のソースリポジトリ. https://github.com/tarao/term-plus-el. INA
Lintaro. term+.el の emacs 側設定例. https://github.com/tarao/dotfiles/blob/master/.emacs.d/init/term.el https://github.com/tarao/dotfiles/blob/master/.emacs.d/init/tarao/term.el. INA Lintaro. term+.el のシェル側設定例. https://github.com/tarao/dotfiles/blob/master/.zsh/eterm.zsh. 伊奈 林太郎 Emacs 上のターミナルを最強に 34
37.
おわり