🔖

Helix をそれなりに使えるように設定する (snippets, copilot代替, typo-check)

に公開

Helix とは

KakouneとNeovimに影響を受けたエディタ。
キーバインドはKakouneに強く影響を受けている気がする。
lsp, treesitterははじめから利用可能。
helix

Helixのデメリットは

現状プラグイン機構がない。
自分がhelixを使っていて困るのはCopilotのようなAI CompletionとSnippets機能がないこと。

解決策

helixはプラグイン機構はないがlspを設定することができる。
今回は、copilotとsnippetsをlspとして設定する方法を記す。

copilot, snippets, typoそれぞれがlspとして提供されているためそれらを利用する。

hx-lspの設定方法

~/.config/helix/languages.tomlに以下を追加する。

[language-server.hx-lsp]
command= "hx-lsp" # github.com/erasin/hx-lsp
args = ["--dir", "~/.config/helix/snippets"]

~/.config/helix/snippetsディレクトリを作成して、その中にsnippetsを保存しておく。
例えばphpの場合は、~/.config/helix/snippets/php.jsonとして保存する。
その内容は例えば以下の通り。

{
	"this": {
		"prefix": "th",
		"body": ["\\$this->${1:prop}"],
		"description": "this"
	},
	"php": {
		"prefix": "?",
		"body": [
			"<?php"
		],
		"description": "php"
	},
	"function": {
		"prefix": "fn",
		"body": [
			"function ${1:functionName}(${2:args}): ${3:void}",
			"{",
			"\t${0}",
			"}"
		],
		"description": "function"
	},
	"php doc": {
		"prefix": "/*",
		"body": [
			"/**",
			"* ${0}",
			"*/"
		],
		"description": "php doc"
	},
	"php doc for function": {
		"prefix": "doc_f",
		"body": [
			"/**",
			"* ${1: comment}",
			"*",
			"* @param ${2:type} ${3:arg}",
			"* @return ${4:type}",
			"*/"
		],
		"description": "php doc for function"
	},
	"ternary": {
		"prefix": "=?",
		"body": ["${1:foo} = ${2:true} ? ${3:a} : ${4:b}"],
		"description": "ternary operation"
	},
	"?:": {
		"prefix": "=?",
		"body": ["${1:true} ? ${2:a} : ${3:b}"],
		"description": "?:"
	},
	"if": {
		"prefix": "if",
		"body": [
			"if (${1}) {",
			"\t${0:${VISUAL}}",
			"}"
		],
		"description": "if statement"
	},
	"foreach": {
		"prefix": "foreach",
		"body": [
			"foreach ($${1:variable} as $${2:value}) {",
			"\t${0:{VISUAL}}",
			"}"
		],
		"description": "foreach statement"
	},
	"interface": {
		"prefix": "interface",
		"body": [
			"interface ${1:InterfaceName}",
			"{",
			"\t${0}",
			"}"
		],
		"description": "interface"
	}
}

また~/.config/helix/languages.tomlのphpの項目に以下を設定する。

name = "php"
language-servers = ["intelephense", "hx-lsp"]

こうしておくとphpのファイルを読み込んだときに補完の選択候補に設定したsnippetsが表示される。
snippetsの設定ファイルはvscodeから持ってくると良い。

typos-lspの設定

~/.config/helix/languages.tomlに以下を追加する。

[language-server.typos]
command = "typos-lsp" # https://github.com/tekumara/typos-lsp?tab=readme-ov-file
environment = { "RUST_LOG" = "error" }

phpで利用したい場合は、

name = "php"
language-servers = ["intelephense", "hx-lsp", "typos"]

としておくと、typoしたときに注意が表示される。

helix-gptの設定

以下コマンドでインストールする。bunが必要。

wget https://github.com/leona/helix-gpt/releases/download/0.34/helix-gpt-0.34.js -O $HOME/.local/bin/helix-gpt

$HOME/.local/binのパスを通しておくこと

helix-gpt --authCopilotを実行するとブラウザでgithubの認証が行われる。
その後、PATがターミナルに出力されるのでメモっておく。

~/.config/helix/languages.tomlに以下を追加する。

[language-server.gpt]
command = "helix-gpt"
args = ["--handler", "copilot", "copilotApiKey", "{github PAT}"] # github PAT に先述のPATを入れる

phpで利用したい場合は、

name = "php"
language-servers = ["intelephense", "hx-lsp", "typos", "gpt"]

としておく。
ここで、gptの設定でgithub のPATをハードコーディングしている。
languages.tomlをdotfileとしてgithubなど管理している場合は、PATを隠しておきたい。
私は以下のようにしてshellとして実行することにした。 /path-to-key/copilot_keyにはPATが記載されており、これはgit 管理には含めない。

[language-server.gpt]
command = "sh"
# args の中でシェルスクリプト全体を記述します
args = [
    "-c",
    "helix-gpt --handler copilot --copilotApiKey $(cat /path-to-key/copilot_key | tr -d '[:space:]')"
]
GitHubで編集を提案

Discussion