Project Paper A4 5mm

清書したメモが置かれる

vim-voltのfish用補完プラグインを作った

概要

タイトルママ

github.com

結構前に作って、記事書いてないことに気がついたので今書いている。

vim-volt

github 作者ブログ記事

vimプラグインマネージャー

goで開発されている、ターミナルから実行してプラグインの管理を行うタイプ。

機能としては - 分割統治: プラグインごとの設定がファイルで分割されている - プロファイル: プラグイン開発時に他のプラグイン全部消して動作確認、などで使える

詳細はvim-voltを確認してください。

fish

github.com

私が使っているシェル

作ったもの

vim-voltの補完を提供するfishのプラグインを作った。リンクは概要欄参照

voltにはbash, zsh用の補完ファイルがあるが、fish用のものはなかったので作ってしまった。

スクリーンショット

f:id:konafx:20200829184720p:plain
こんな感じ

感想

簡単にできるやろって手を出したらサブコマンドprofileが深くてぎゃーーーってなった。

苦労ポイントは初心者ゆえ多々あったが、qiitaやfish標準の補完記述などを見てなんとか完成にたどり着いた……と思う。

細かいポイントについて下書きを書いていたが、結構参考記事との被りが多くなって新規性がないなってなってやめた。

参考

exaのfish-completionsを追加したかった(非推奨方法)

概要

github.com

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.fish1)を叩いた。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を見に行ったら

f:id:konafx:20200222180714p:plain

原因はかんたんで、公開鍵のコピペをミスってた。Hyper.jsというターミナルソフトを使っているのだが、(おそらく設定不足で)コピペが微妙におかしい時がある。

今回は-----BEGIN PGP PUBLIC KEY BLOCK-----の次の行に鍵本文(?)が貼り付けられていた。ちまちま直してUpload成功させたあとにようやく

f:id:konafx:20200222181039p:plain


  1. Terminalソフトを(よっぽど稀だが)変えるとおそらく確実に、また、ターミナルを開き直してGPGの認証をするときは稀に「GPG認証が立ち上がらない」「パスワードが隠れない」「うまく打てない(pinentryの不調のような動作)」のような現象が起きる。このとき、$GPG_TTYttyの値が異なっていた。ターミナルを開くたびに変わるのであればターミナルを開くたび(=ログインするたび)に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.fishset -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です。

fish: Documentation

雑談

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円になる
  • 地味に春・夏の利用期間が長い

欠点

結論

青春18きっぷIGRいわて銀河鉄道線に乗らせろ

その他の参考サイト


  1. 急行列車に限り、別に料金券をお買い求めいただけばご利用になれます。新函館北斗新青森間内相互発着の場合に限り、別に特定特急券をお買い求めいただければ北海道新幹線の普通車の立席(空いている席)がご利用になれます。

  2. 石勝線 新夕張駅~新得駅間(北海道)、奥羽線 青森駅新青森駅間(青森県北海道&東日本パスで乗れる列車・乗れない列車, 18きっぷで特急に乗れる特例区間