vim-voltのfish用補完プラグインを作った
概要
タイトルママ
結構前に作って、記事書いてないことに気がついたので今書いている。
vim-volt
goで開発されている、ターミナルから実行してプラグインの管理を行うタイプ。
機能としては - 分割統治: プラグインごとの設定がファイルで分割されている - プロファイル: プラグイン開発時に他のプラグイン全部消して動作確認、などで使える
詳細はvim-voltを確認してください。
fish
私が使っているシェル
作ったもの
vim-voltの補完を提供するfishのプラグインを作った。リンクは概要欄参照
voltにはbash, zsh用の補完ファイルがあるが、fish用のものはなかったので作ってしまった。
スクリーンショット
感想
簡単にできるやろって手を出したらサブコマンドprofile
が深くてぎゃーーーってなった。
苦労ポイントは初心者ゆえ多々あったが、qiitaやfish標準の補完記述などを見てなんとか完成にたどり着いた……と思う。
細かいポイントについて下書きを書いていたが、結構参考記事との被りが多くなって新規性がないなってなってやめた。
参考
- fishの補完設定覚え書き - Qiita
- 前述の通り、fish標準の補完記述いろいろ
exaのfish-completionsを追加したかった(非推奨方法)
概要
exaをcargoでインストールしたとき、fish-completionsが追加されていなかった。
ln -s $HOME/.cargo/registry/src/github.com-1ecc6299db9ec823/exa-0.9.0/contrib/completions.fish $__fish_config_dir/completions/exa.fish
でリンクを貼って無理やり追加した。
より良い方法を知りたい。
経緯
Rust製のexaというコマンドがある。ls, treeの代替として優秀らしい。 実際触ってみて、カラフルで良いなと思った。
しかし、補完が効かない。fishプラグインとしてどっかにあるかなと検索したらexaのリポジトリにcompletions.fishが存在していた。 インストール時にこのファイルがcompletions以下に置かれなかったらしい。
install-fish-completions
オプションはどうすれば……?
どうやればインストール時に補完ファイルも持ってきてくれるのか確認したところ、Makefileに以下のような記述があった。
install-fish-completions: install -m644 -- contrib/completions.fish "$(DESTDIR)$(FISHDIR)/exa.fish"
Rust, Cargoについて全く知らないので、とりあえずcargo install exa --features install-fish-completions
と試してみたが、"Package exa v0.9.0
does not have these features" らしい。
そもそもCargo.tomlに
exclude = ["/devtools/*", "/Makefile", "/Vagrantfile", "/screenshots.png"]
とあり、Makefileの記述はcargo install
のときには参考にならないかも……?
結果
あれこれ調べたが、結局わからずじまいだったので、ひとまず .cargo/
以下にあるexaのソースコードからcompletions.fish
ファイルを拝借した。
ln -s $HOME/.cargo/registry/src/github.com-1ecc6299db9ec823/exa-0.9.0/contrib/completions.fish $__fish_config_dir/completions/exa.fish
上記コマンドはhash値のようなディレクトリを指定していて、あまり褒められたものではない(アプデ時に消えそう)が、ひとまずコレでALL OKとした(い)。
Git commitにGPGのサブキーで署名を付ける
執筆理由
日本語でTutorialMoreしか見つからんかった
ちなみに、サブキーでやる必要はぶっちゃけないと思う。セキュリティ詳しい人はどっちが良いと言うんだろうか。
概要
Git commit時にサブキーによるGPG署名を付ける。
$ git config --global user.signingkey = <keyid>!
と設定する1。
作業ログ
サブキーをhatsusatoさんのgpg のはなしを参考に作成。
gitにそのサブキーで署名するためkeyid
を確認
$ gpg --list-secret-keys --keyid-format long ------------------------------- sec algo/ABCDEFGHIJKLMNOP 2006-01-02 [SC] ABCDEFGHIJKLMNOPQRSTUVWXYZABCD uid [xx-xx-xx] John Doe <johndoe@nanashi.xxx> ssb algo/SUB001HOGEHOG 2016-01-02 [E] [xx-xx-xx] ssb algo/SUB002HOGEHOG 2006-01-02 [S] [xx-xx-xx]
署名機能が有効になっている([S]
がある)SUB002HOGEHOG
を使います。
git config --global user.signingkey SUB002HOGEHOG
と設定すればサブキーが登録されるが……
$ git commit -m "Add nanika" error: gpg failed to sign the data fatal: failed to write commit object
何故かエラーを吐く。echo "test" | gpg --clearsign
は問題ない(そらそうか)。
検索してStackOverFlowのこのサイトを機械翻訳したものがヒットした。そこで
Solution: KEYID must be appended with ! to use a specifc subkey.
ということで、git config --global user.signingkey SUB002HOGEHOG!
で登録し、再コミット
$ git commit -m "Add nanika" [master xxxxxxx] Add nanika ~~~~
成功した。わざわざ!
付けないと動かないらしい
Git commit時にGPG署名に失敗する
概要
GPG署名に失敗する。
今回の解決策は、このIssueに書いてる通り、export GPG_TTY=$(tty)
(fish使いはset -Ux GPG_TTY (tty)
)を実行すること。
無事、コミットにVerifiedの文字を輝かせることができた。
署名に失敗する
コミットにVerifiedを付けたいのでGPG署名をしようと思った。 鍵発行、登録、ローカル設定を順調に終え、さあコミットだ!という段階で以下のエラー
$ git commit -m "First commit" -S error: gpg failed to sign the data fatal: failed to write commit object
GPGのtestをしよう
ググるとgpg-agent
がないとか言われたがそんなことはなかった。pinentry
もあるし(そもそもないと鍵作成できないのでは)、gpg
が古いのか……?など色々調べていったときに以下のサイトにぶち当たった。
For troubleshooting, see this answer (though that is about linux not brew), it suggests a good test:
echo "test" | gpg --clearsign
github - gpg failed to sign the data fatal: failed to write commit object [Git 2.10.0] - Stack Overflow
で、結果は
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 test gpg: signing failed: Inappropriate ioctl for device gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
あーやっぱり失敗するんですね……(バージョン古いとかかな~と思った)
解決へ
signing failed: Inappropriate ioctl for device
で検索してようやく解決に至った。その方法が以下のexport実行
Since this is a fatal error and also quite difficult to debug, maybe the fix could be put somewhere (in the provided command line?):
export GPG_TTY=$(tty)
gpg: signing failed: Inappropriate ioctl for device · Issue #2798 · keybase/keybase-issues
僕はfisher(この呼称は正しいか?)なのでゴキゲンに(追記: set -Ux GPG_TTY (tty)
echo 'set -x GPG_TTY (tty)' >> $__fish_config_dir/conf.d/gpg.fish
1)を叩いた。bash, zshの人は上記引用コマンドを打てばいいと思う。
export後にecho "test" | gpg --clearsign
すると、
┌────────────────────────────────────────────────────────────────┐ │ Please enter the passphrase to unlock the OpenPGP secret key: │ │ "John Doe <johndoe@nanashi.local>" │ │ 4096-bit RSA key, ID XXXXXXXXXXXXXXXX, │ │ created 2020-02-22. │ │ │ │ │ │ Passphrase: __________________________________________________ │ │ │ │ <OK> <Cancel> │ └────────────────────────────────────────────────────────────────┘
パスフレーズを間違えないように打って認証成功。無事にコミットもできた。
後日談
いや当日談なんだが
コミットもできたしプッシュして早速Verifiedを見に行ったら
原因はかんたんで、公開鍵のコピペをミスってた。Hyper.jsというターミナルソフトを使っているのだが、(おそらく設定不足で)コピペが微妙におかしい時がある。
今回は-----BEGIN PGP PUBLIC KEY BLOCK-----
の次の行に鍵本文(?)が貼り付けられていた。ちまちま直してUpload成功させたあとにようやく
-
Terminalソフトを(よっぽど稀だが)変えるとおそらく確実に、また、ターミナルを開き直してGPGの認証をするときは稀に「GPG認証が立ち上がらない」「パスワードが隠れない」「うまく打てない(
pinentry
の不調のような動作)」のような現象が起きる。このとき、$GPG_TTY
とtty
の値が異なっていた。ターミナルを開くたびに変わるのであればターミナルを開くたび(=ログインするたび)にtty
の更新値に合わせて$GPG_TTY
を設定するように変更した。↩
fish_user_paths がうまく働かない
概要
パスを再設定しているとき、fish_user_paths
にパスを渡しているのに肝心のパスが通らない!という現象に陥った。
解決方法はset -U fish_user_paths /path/to/bin /hoge/to/bin /fuga/to/bin
と一つずつ宣言していくこと。
背景
- fish 3.0.2
- fish 3.1.0
- バージョンアップすれば解決する?と思ってバージョンアップした。もちろん関係なかった。
dotfileを更新していたら、パスが通らなくなった(この原因は不明)。
fish_user_paths
を再設定しても全く通らない。
いろいろ試してみると、fish_user_paths
の設定の仕方が悪いことに気が付いた。
原因
再設定の方法、fish_user_paths.txt
に記入したパスら(例: /path/to/bin /hoge/to/bin /fuga/to/bin
)をセットしようと思い、
set -U fish_user_paths (cat fish_user_paths.txt)
と設定したこと。
この方法だと"/path/to/bin /hoge/to/bin /fuga/to/bin\"
がfish_user_paths[1]
に格納されることになり、パスが
PATH=/path/to/bin /hoge/to/bin /fuga/to/bin:/usr/local/sbin:/usr/local/bin:...
になってしまう(というか、なってしまっていた)。
解決方法
set -U fish_user_paths /path/to/bin /hoge/to/bin /fuga/to/bin
と、catを使わずに行う。
あとがき
大量にfish_user_paths
を宣言したいときはどうすればいいのだろう。
黙ってconfig.fish
にset -x PATH /path/to/bin:$PATH
を列挙していくしかないのか(やったことがないのでわからない)?
あと、よくset -U fish_user_paths /path/to/bin $fish_user_paths
する方法が推奨されているが、set -U -p fish_user_paths /path/to/bin
のほうがタイプ少なく済むから好き。なぜ公式サイトでも伝統的なPATH設定みたいな方法で書いてあるのか。
追記
正常なときの$__fish_config_dir/fish_variables
を見ると
SETUVAR fish_user_paths:/path/to/bin\x1e/hoge/to/bin\x1e/fuga/to/bin
と書いてある。
catを使って宣言すると
SETUVAR fish_user_paths:/path/to/bin\x20/hoge/to/bin\x20/fuga/to/bin
になる。
ここで、/path/to/bin
と/hoge/to/bin
の区切り文字を見てみると、
16進数コード | 意味 |
---|---|
\x1e |
レコードセパレーター[^1] |
\x20 |
半角空白[^1] |
参考: ASCIIコードの秘密 - ザリガニが見ていた...。
うーん、なるほど(?)
解決方法2
cat $__fish_config_dir/fish_variables | grep -n 'fish_user_paths'
で行数を確認してから、以下のコマンドで(58
は行数、↑の出力に変えて)
sed -i -r '58 s/x20\//x1e\//g' $__fish_config_dir/fish_variables
とすればいい。
fish 3.0.2でgit switch/restoreの補完をする
結論
git switch、restoreの補完がfishで効かないのでmasterからcompletionsをもってくる | けんちゃんくんさんのWeb日記に書いてあります。
環境
- Windows 10 (Version 10.0.17763.973)
- WSL
- Ubuntu 18.04.3 LTS (Bionic Beaver)
- apt 1.6.12
- fish 3.0.2
- git 2.25.0
背景
fish 3.0.2 (released Feb 19, 2019) にはgit restore, switchの補完追加 (Aug 22, 2019) が入ってない。Pre-release 3.1b1では実装されているがapt(の標準リポジトリ)だと3.0.2を見ている(のでapt update & upgradeで解決はない)。
fish_update_completionsで補完をmanコマンドから追加できるらしいが、git-switch
にmanがあるのでgit switch
の補完は追加されない(と思っている)。
解決手段
結論で述べたとおり、参照先のページに書いてあります。 以下は私の環境(ghqとln)の方法
ghq get --shallow fish-shell/fish-shell ln -s (ghq root)/github.com/fish-shell/fish-shell/share/completions/git.fish $__fish_config_dir/completions/git.fish source $__fish_config_dir/config.fish
restoreの補完
よくわからんが、git restore
の時点では補完がない。git restore --
まで打つと補完候補が出てくる。
補足
ghq get --shallow ..
With '--shallow' option, a "shallow clone" will be performed (for Git repositories only, 'git clone --depth 1 …' eg.).
x-motemen/ghq: Remote repository management made easy
(ghq root)
bashだと$(ghq root)
、サブコマンドの展開をする
$__fish_config_dir
一般的には$HOME/.config/fish
です。
雑談
Pre-releaseをcloneしてmake & make installが一番幸せ
北海道&東日本パスを使った
概要
JR北海道線、JR東日本線、青い森鉄道線、IGRいわて銀河鉄道線及び北越急行線の普通列車(快速含む)普通車自由席及びBRTが乗り放題なおトクなきっぷです。
北海道&東日本パス|JR北海道のおトクなきっぷ
快速も乗れる。急行は金を払えば乗れるらしい1。特急は例外的に乗れる区間がある2。
青春18きっぷとの違い
青春18きっぷとは売り方が違う。青春の方は「1枚の切符で5回」、北&東パスは「1枚の切符で7日間」といった感じ。
きっぷ | 値段 | 利用可能日数 | 一日あたりの値段 | 2日間のみ利用の場合 |
---|---|---|---|---|
北海道&東日本パス | 10850円 | 7日 | 1550円 | 5425円 |
青春18きっぷ | 11850円 | 5日 | 2370円 | (5925-α)円 |
きっぷ | 利用期間(春) | 利用期間(夏) | 利用期間(冬) | 利用可能日数 | 分割可能 |
---|---|---|---|---|---|
北海道&東日本パス | 3月1日~4月22日 | 7月1日~9月30日 | 12月10日~1月10日 | 7日 | x |
青春18きっぷ | 3月1日~4月10日 | 7月20日~9月10日 | 12月10日~1月10日 | 5日 | o |
中部地方での利用について
このサイトがわかりやすい
北海道&東日本パスの利用可能区間
北&東パスの個人的な感想
青春18きっぷと違って青い森鉄道線、IGRいわて銀河鉄道線に乗れるので、私にとって会津-青森間を最短経路で行けるのが嬉しかった。
帰省のために利用したが、7日間連続の縛りのために帰りの日程を伸ばすことができなかったのが面倒だった。
利点
- 青い森鉄道線、 IGRいわて銀河鉄道線 、北越急行線に乗れる
- これが一番の理由
- 使える日数が連続した 7日間 と長め
- 7日間全日利用するとして、一日あたり1550円になる
- 地味に春・夏の利用期間が長い
欠点
- 三陸鉄道は乗れない
- あそこらへんの観光もしたかったが残念
- たぶん理由としてはこれ(第三セクター鉄道って何?鉄道事業者の分類のはなし | 汽車旅指南所)か?
- 使える日数が 連続した 7日間なので長期旅程には適さない
- 行きの日と帰りの日にしか使わないのであれば、一日あたり5425円になる。
- 複数人の利用はできない
- (たぶん、阿武隈急行線は利用できない)
結論
青春18きっぷでIGRいわて銀河鉄道線に乗らせろ