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:]')"
]
Discussion