Mac × AlfredでNeoVimとVimをGUIかのように使う

2 min read読了の目安(約2500字

何がしたいの

Macで NeoVimVim をGUIライクに立ち上げたい

できたもの

Alfredから、 NeoVim Vim の両コマンドでそれぞれがGUIライクに立ち上がる。

https://youtu.be/WlJ1xk_sXG4

著しく便利。

How To

iTerm2には

  • NeoVimを起動するプロファイル
  • Vimを起動するプロファイル

の2つを作り、

Alfredには、それぞれのプロファイルでiTerm2を起動するように適当なコマンドを作った。

iTerm2の設定

さほど複雑なものではない。
ただし、プロファイル名はあとでAlfred側の設定をするときに必要になるので厳密につけること。
(この通りにつける必要はないが、Alfredのスクリプト内容とは一致する必要がある)

  1. NeoVimという名前のプロファイルを作る
  • Commandの設定で、 Send text at start:nvim && exit とする
  1. Vimという名前のプロファイルを作る
  • Commandの設定で、 Send text at start:vim && exit とする

下図はNeoVimの例:

Alfredの設定

こちらはそれぞれのWorkflowを定義して、Apple Scriptを使ってiTerm2の特定のプロファイルを起動している。
任意のプロファイルでiTerm2を起動するコマンド とかも世の中にはあるみたいだけど、
いちいち コマンド名 nvim みたいに2段階入力するのもちょっと間抜けなので、直接書いてしまうことにした。

  1. 適当な名前のWorkflowを作る
  2. Keyword neovim の Input Workflow Object を作る
  • ここにはアイコンを設定すると良い
  • 表記ゆれ( nvim など)も登録すると、他のキーワードと衝突する可能性が減らせて良い
  1. Action Workflow Object を作る
  • AppleScriptのやつ
  • 中身は後述のスクリプト
  1. InputとActionを線でつなぐ

スクリプト(NeoVim用):

-- this script will start iTerm then open a new session with a "neovim" profile
on is_running(appName)
    tell application "System Events" to (name of processes) contains appName
end is_running
set iTermRunning to is_running("iTerm2")
tell application "iTerm"
    if not (iTermRunning) then
        delay 0.5
        close the current window
    end if
    create window with profile "NeoVim"
end tell

Vim についても、NeoVim neovimvim に置き換える形で同じことをすれば良い。
ただし、NeoVimとVimでWorkflowを分ける必要はないので、2, 3, 4だけやれば良い。

背景

最近VimからNeoVimに乗り換えて、おいNeoVim悪くないぞNeoVim良いじゃないかとなっている。

が、常に :terminal on vim で生活している身としては、今まで iTerm2 を起動すれば
vim が起動して万々歳、で済んでいたところ、

  • たまにvim起動したい
  • でも概ねNeoVim起動したい

みたいな欲があって、どうしたもんかなと。

LinuxとMacで行き来していると、LinuxのランチャはNeoVimだろうがvimだろうがalacrittyだろうが任意に呼び出せちゃうので、
Mac側では iTerm2 を起動してプロファイル選んで…とかやってらんない。
Macでも NeoVim と呼び出してNeoVimを起動したい。

NeoVim GUIは群雄割拠

詳細は割愛するけれど、vimがGvimとMacVimで大体済んでいるところ、
Neovimは群雄割拠状態。時は戦国時代。
盛んに開発されていたと思ったらある日突然沈黙したり、ちょっと使うには勇気がいるものばかり。

Alfredは必須

なんやかんやいってもMac標準のQuickなんちゃらは使い勝手悪いし、カスタマイズできないんでAlfredを使ってる。
なのでこんかいのアイディアはあくまでもAlfred前提

iTerm2は必須

基本デフォルトが良いじゃないと思いつつ、Mac標準のターミナルは、True Color表示できないので諦め。
Alacrittyは、日本語入力に難があるし、Hi-DPI対応がイマイチなせいでLinux側でまともに使えておらず。
なのでこのアイディアもiTerm2前提。