fishシェルで特定のコマンドがあるときのif文を書く

dotfilesの中にあるconfig書いているときに、「ビルトインじゃないコマンドを持っている環境の場合にこうしたい」みたいな気持ちになったのだけど、fishでいまいち書き方がわからなかったので調べた。

if…?

if構文がこれなんだけど、『コマンドがあるとき』のとり方がわからなかった。

fishshell.com

issueとかstackoverflowみてたら古めのIssueがあった。 type -q らしい。

Best way to check if command is available? · Issue #1774 · fish-shell/fish-shell · GitHub

ちなみにどういうことやりたかったのか

exaをインストールして、エイリアスを貼りたかった。

github.com

なんかこういう記事をたまたま読んで、エイリアス便利そうと思った。

Rust製ツールでおしゃれなターミナル環境を作る【Starship ✕ exa】

そういうわけで僕のdotfilesの中のfish.configにはこういうエイリアスが書かれた。

# ## exa
if type -q exa
  alias e='exa --icons --git'
  alias ls=e
  alias ea='exa -a --icons --git'
  alias la=ea
  alias ee='exa -aahl --icons --git'
  alias ll=ee
  alias et='exa -T -L 3 -a -I "node_modules|.git|.cache" --icons'
  alias lt=et
  alias eta='exa -T -a -I "node_modules|.git|.cache" --color=always --icons | less -r'
  alias lta=eta
end

URLリンクの遷移先のドメインをルビで表示する実験

人の日記を読むのが好きで、色んな人の日記を読んでいる。

以前にr7kamuraさんが日記でこういうことを書かれていた。

https://r7kamura.com/articles/2022-02-20-diary

記事にリンクを埋め込むときの形式として、URLを見せるべきか、見せないべきかというのを数年単位でずっと悩んでいて

悩ましいのわかる。スマホだとほぼ確実にリンクを踏んでからじゃないとどこのサイトへ飛ぶのかわからないし、PCブラウザだとマウスホバーして左下の表示を見るということをしないといけない。

どっちにしろ不便。

ふと思いついたソリューション

ふと、「ルビでドメインを表示するのは面白いのではないか?」と思ったのでちょっと書いてみた。

codesandboxが死んだとき用にスクショも貼っておこう。

Image from Gyazo

なんとなく悪くない気がしている。ちゃんとどこのサイトのURLなのかわかる。

コード

Reactの場合、なんかこういう感じに素朴なコンポーネントを書けばできあがる。

type Props = {
  text: string;
  url: URL;
};

export function LinkText(props: Props) {
  const { text, url } = props;
  const href = url.href;
  const hostName = url.hostname;

  return (
    <a href={href}>
      <ruby>
        {text}
        <rp>(</rp>
        <rt>{hostName}</rt>
        <rp>)</rp>
      </ruby>
    </a>
  );
}

懸念

htmlの <ruby> タグまわりのアクセシビリティが悪いという話はちょっとググるとすぐ出てくるくらいには問題児らしくて、ルビタグを濫用するのはまずいかも、という気はしている。有識者に意見を聞きたい。

あとルビが「リンクテキストのふりがなとかではなくURLドメインを表している」というのがいいのかもわからない。普通に怒られそうな気もするし、別に大丈夫そうな気もしている。