Humanity

Edit the world by your favorite way

macOS のターミナルエミュレーター環境放浪記

ぶっちゃけ vim の :terminal から色々起動したりしてるのでターミナルエミュレーターに求めるものはあんまりないのだけど、

  • タブが使えること (いちおう)
    • (2019/9/19 15:20 追記) Alacritty はタブ使えません
  • 速いこと

ということでおそらく最速らしい Alacritty をインストールしてみた。

ちなみに日本語は現在使えません。

Full unicode support · Issue #306 · jwilm/alacritty · GitHub

できる人もいるみたいですが、自分の環境 (macOS デフォルトの日本語 IM) だと全く日本語を入力できませんでした。

Cannot input japanese characters · Issue #1101 · jwilm/alacritty · GitHub

あと変換中もキーを処理しちゃうので↑とか↓のキーを押すと bash に渡って直前の履歴を表示したりします。

macOS: unexpected characters get deleted when using backspace in Pinyin input method · Issue #1606 · jwilm/alacritty · GitHub

こんな感じで日本語を使うにはなかなかつらそうですが、ちょっと試した限り描画には特に問題なさそうな感じだったので、しばらく vim + eskk と併用してしのぐことにしました。 (vim 以外で日本語を入力したかったら vim のバッファで入力してからコピペすることにする) もともとターミナルで日本語をそんな入力することもないのでおそらく大丈夫なはず。

インストール

$ brew cask install alacritty

セットアップ

Ctrl + [ が Esc として認識されない

設定しない限りは自動で認識はしないっぽい。 自由度は高いとはいえ通常のターミナルエミュレーターっぽい動きをするオプションとかないんでしょうか (あったら教えてください)。

という訳で

Keyboard mappings · jwilm/alacritty Wiki · GitHub

を参考に

/Applications/Alacritty.app/Contents/MacOS/alacritty --print-events | grep KeyboardInput

してキーコードのイベントを見て、 [ がどういう名前で呼ばれているか見る。 (grep しているのは大量にイベントが出力されるので)

見るべきは Some(...) で囲まれている中身。

[2019-08-12 05:25] [INFO] glutin event: WindowEvent { window_id: WindowId(Id(140290951381856)), event: KeyboardInput { device_id: DeviceId(DeviceId), input: KeyboardInput { scancode: 59, state: Pressed, virtual_keycode: Some(LControl), modifiers: ModifiersState { shift: false, ctrl: true, alt: false, logo: false } } } }
[2019-08-12 05:25] [INFO] glutin event: WindowEvent { window_id: WindowId(Id(140290951381856)), event: KeyboardInput { device_id: DeviceId(DeviceId), input: KeyboardInput { scancode: 30, state: Pressed, virtual_keycode: Some(LBracket), modifiers: ModifiersState { shift: false, ctrl: true, alt: false, logo: false } } } }

Ctrl + [ を押すと、Control キーが押されたというイベントに加えて LBracket が押されたと書いてあるのでそれを Esc にマッピングする。

設定ファイル (自分は $HOME/.config/alacritty/alacritty.yml に追加した) の key_bindings に以下を追加。

- { key: LBracket, mods: Control, chars: "\e" }

ベンチマーク (雑)

雑すぎるベンチマークなので参考にしないでください。 ただ個人的に乗り換えるきっかけにはなりました。

bash

$ time yes | head -1000000
# iTerm
real    0m2.701s
user    0m0.280s
sys     0m0.433s

# macOS 標準の「ターミナル」
real    0m1.009s
user    0m0.254s
sys     0m0.424s

# Alacritty
real    0m0.759s
user    0m0.249s
sys     0m0.494s

ベンチマークと言いつつ環境についての記載がないってどういうこと?って言われそうですが上記の通りです許して… (単なる比較として見てください。ちゃんとやるなら出力 (描画) のみじゃなくキー入力についてとかも必要そう) 自己満足かもしれないけど自分もデフォルト以外のナウいターミナルエミュレータ使いたかった () っていうのもある。 まぁ個人のブログなので… (それを言ったら終わり)

Vim の :terminal で動かしているシェルで cd したら Vim のカレントディレクトリも変えるプラグイン

github.com

Vim:terminal で動かしているシェルで cd したら、 Vim のカレントディレクトリも同じパスに :cd するプラグインを作りました。

セットアップ

.bashrc / .zshrc に以下を追加してください。

source (sync-term-cwd.vim のリポジトリ)/macros/synctermcwd.sh

仕組み

実質これだけです。

plugin/synctermcwd.vim

function! Tapi_SyncTermCwd(_, cwd) abort
  let cd = get(g:, 'synctermcwd_cd_command', 'cd')
  execute cd a:cwd
endfunction

macros/synctermcwd.sh

cd() {
  builtin cd "$@" || return $?
  if [ "$VIM_TERMINAL" ]; then
    printf '\e]51;["call","Tapi_SyncTermCwd","%s"]\x07' "$PWD"
  fi
}

追記 (2019-12-28 02:30): cd コマンドを書き換えると他の cd コマンドを書き換えるスクリプトとバッティングするので PS1 に追加するようにしました。

if [ "$VIM_TERMINAL" ]; then
  _synctermcwd_ps1() {
    printf '\e]51;["call","Tapi_SyncTermCwd","%s"]\x07' "$PWD"
  }
  PS1="\$(_synctermcwd_ps1)$PS1"
fi

sync-term-cwd.vim/synctermcwd.sh at 141dfbad64ce6c08d0867c98e8846bd983a624bc · tyru/sync-term-cwd.vim · GitHub

便利な設定

デフォルトだと :cd {path} を実行しますが、現在タブページのみカレントディレクトリを変えたければ以下を .vimrc に追加すればできます。

let g:synctermcwd_cd_command = 'tcd'

追記 (2019-12-28 02:30): 追加した SyncTermCwdConditionalCd を指定する方が大体の場合便利です。

let g:synctermcwd_cd_command = 'SyncTermCwdConditionalCd'

詳しくは

tyru.hatenablog.com

追記: :tcd について

:tcdVim 8.1.1218 からあるコマンドです。 現在タブページ固有のカレントディレクトリを設定する事ができます。

プラグインを作った当初は

let g:synctermcwd_cd_command = 'windo lcd'

と README にも書いていたのですが、 :windo は現在のウィンドウから移動してしまう事に気付き、 :SyncTermCwdTabLcd という Ex コマンドを実装したのですが*1

k-takata さんに :tcd があるよと教えてもらい、revert しました。 よって結局記事冒頭のシンプルな仕組みのままです。 素晴らしい… :tcd 便利すぎる…

あわせて読みたい

ちなみに sync-term-cwd.vim では :help terminal-api という機能を使っていますが、 過去も Terminal API を使った類似のプラグインとして以下があります。

tyru.hatenablog.com

macOS Mojave で Vim のソースコード (C 言語) のデバッグをする (clang, lldb)

  1. src/MakefileCC, CFLAGS を変更
diff --git a/src/Makefile b/src/Makefile
index 9c4a42893..d62c21b59 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -586,14 +586,14 @@ CClink = $(CC)
 # again.
 #CC = cc
 #CC = gcc
-#CC = clang
+CC = clang
 
 # COMPILER FLAGS - change as you please. Either before running {{{1
 # configure or afterwards. For examples see below.
 # When using -g with some older versions of Linux you might get a
 # statically linked executable.
 # When not defined, configure will try to use -O2 -g for gcc and -O for cc.
-#CFLAGS = -g
+CFLAGS = -g
 #CFLAGS = -O
 
 # Optimization limits - depends on the compiler.  Automatic check in configure

2. make clean distclean all で再度ビルド 3. lldb ./vim して r --clean で実行

$ lldb ./vim
(lldb) target create "./vim"
Current executable set to './vim' (x86_64).
(lldb) r --clean

TODO: leak detector 試す