Closed2

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:]...)

https://github.com/cli/cli/blob/750c3e38f32d0bb845922fa4d96d0c9341928d1c/pkg/surveyext/editor_manual.go#L65-L77

指定したエディターコマンドの末尾に(編集に使う一時ファイルの)ファイル名がくっついている。つまり、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
このスクラップは2021/09/26にクローズされました