gh のエディターにシェルスクリプトを使う
21/09/25現在、gh のエディターでシェルスクリプトを使用することはできない。(Editor is not passed to the shell #925)
ソースコードのエディターのコマンドを実行する箇所を見てみると os/exec を利用していることがわかる。指定したエディターコマンドの末尾にファイル名がくっついている。
ソースコードの該当箇所
args, err := shellquote.Split(editorCommand) if err != nil { return "", err } args = append(args, f.Name()) editorExe, env, err := lookPath(args[0]) if err != nil { return "", err } args = append(editorExe, args[1:]...) cmd := exec.Command(args[0], args[1:]...)
指定したエディターコマンドの末尾に(編集に使う一時ファイルの)ファイル名がくっついている。つまり、gh config set editor vim
をしていた場合は以下のようになる。
vim <tmp_filename>
さて、Bash や Zsh では-c
オプションを使ったときには引数が$0
あるいは$<n>
の位置パラメーターへと割り当てられる。
Bash:
-c
Read and execute commands from the first non-option argument command_string, then exit. If there are arguments after the command_string, the first argument is assigned to $0 and any remaining arguments are assigned to the positional parameters. The assignment to $0 sets the name of the shell, which is used in warning and error messages.
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Invoking-Bash
Zsh:
-c
Take the first argument as a command to execute, rather than reading commands from a script or standard input. If any further arguments are given, the first one is assigned to $0, rather than being used as a positional parameter.
https://zsh.sourceforge.io/Doc/Release/Invocation.html#Invocation
これを活用することで gh のエディターにシェルスクリプトを無理やり使うことができる。前述の issue の例を使うならば以下のように記述すると期待通り vim が開かれる。
VISUAL='zsh -c "f() { vim \"$@\" }; f \"$0\""' gh issue create
実際に設定した例を紹介しておく。
zsh -c '[[ -z $NVIM_LISTEN_ADDRESS ]] && exec nvim "$0" || exec nvr --remote-tab-wait -c "setlocal bufhidden=delete" "$0"'
なお、nvr
とは mhinz/neovim-remote で、Neovim の端末内からホストの Neovim でファイルを開いたりコマンドを実行したりできる。