📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

88行目: 88行目:
== グローバルエイリアス ==
== グローバルエイリアス ==
Fishでは、Zshにあるグローバルエイリアスは実装しない方針となっている。<br>
Fishでは、Zshにあるグローバルエイリアスは実装しない方針となっている。<br>
もし、Zshにあるようなグローバルエイリアスを定義するには、<code>bind</code>コマンドと<code>commandline</code>コマンドを使用する。<br>
これは、Fishが関数を多用するアーキテクチャであり、グローバルエイリアスが予期しない場所で展開される危険性があるためである。<br>
<br>
<br>
以下の例では、[L]キーを押下後に[Ctrl] + [X]キーを同時押下することにより、"| less"が展開されるように設定している。<br>
Fishでグローバルエイリアスと同等の機能を実現するには、以下の方法がある。<br>
なお、<code>headコマンド</code>、<code>tail</code>コマンド、<code>grep</code>コマンドも同様である。<br>
<br>
<br>
vi ~/.config/fish/bind_global_alias.fish
* <code>abbr</code> コマンドの <code>--position anywhere</code> オプションを使用する。(推奨)
* <code>fish_commandline_append</code> 関数 や <code>fish_commandline_prepend</code> 関数を使用する。
* <code>bind</code> コマンド と <code>commandline</code> コマンドを組み合わせて使用する。
<br>
<br>
  <syntaxhighlight lang="fish">
<center>
{| class="wikitable"
|+ グローバルエイリアスの実現方法の比較
! 方法 !! 必要なバージョン !! 特徴
|-
| abbr --position anywhere || Fish 3.6.0以降 || 公式推奨、[Space]キーで自動展開、履歴に展開後のコマンドが残る
|-
| fish_commandline_append関数 || Fish 3.3.0以降 || 組み込み関数、トグル動作をサポート
|-
| bind関数 + commandline関数 || 全バージョン || 柔軟なカスタマイズが可能、古いバージョンでも動作
|}
</center>
<br>
==== abbr --position anywhereオプション (推奨) ====
Fish 3.6.0以降では、<code>abbr</code> コマンドの <code>--positionanywhere</code>オプションを使用することにより、コマンドラインのどこでも略語を展開できる。<br>
これが公式に推奨されるグローバルエイリアスの代替手法である。<br>
<br>
===== 基本的な使用方法 =====
以下の例では、<code>L</code>と入力して[Space]キーを押下すると、<code>| less</code>に展開される。<br>
<br>
<syntaxhighlight lang="bash">
# グローバル展開の略語を追加
abbr -a --position anywhere -- L '| less'
abbr -a --position anywhere -- H '| head'
abbr -a --position anywhere -- T '| tail'
abbr -a --position anywhere -- G '| grep'
abbr -a --position anywhere -- W '| wc -l'
abbr -a --position anywhere -- S '| sort'
</syntaxhighlight>
<br>
上記の設定を永続化するには、<u>~/.config/fish/config.fish</u> ファイルに記述する。<br>
<br>
===== --set-cursorオプション =====
<code>--set-cursor</code> オプションを使用すると、展開後のカーソル位置を指定できる。<br>
マーカー (デフォルトは <code>%</code> ) の位置にカーソルが移動して、マーカーは削除される。<br>
<br>
<syntaxhighlight lang="bash">
# 展開後、カーソルがパイプの前に位置する
abbr -a --position anywhere --set-cursor -- L '% | less'
# 展開後、カーソルがgrepの引数位置に移動する
abbr -a --position anywhere --set-cursor -- G '| grep %'
</syntaxhighlight>
<br>
===== --commandオプション (Fish 4.0以降) =====
Fish 4.0以降では、<code>--command</code> オプションを使用して、特定のコマンドの引数としてのみ略語を展開できる。<br>
<br>
<syntaxhighlight lang="bash">
# gitコマンドでのみ展開される略語
abbr --add --command git -- co checkout
abbr --add --command git -- sw switch
abbr --add --command git -- br branch
abbr --add --command git -- st status
# 使用例
# git co main  → git checkout main に展開される
# echo co      → 展開されない
</syntaxhighlight>
<br>
===== --functionオプション =====
<code>--function</code> オプションを使用すると、関数を実行して動的に展開内容を生成できる。<br>
<br>
  <syntaxhighlight lang="bash">
  # 現在の日付を挿入する略語
  function _abbr_date
      echo (date +%Y-%m-%d)
  end
  abbr -a --position anywhere --function _abbr_date -- DATE
 
  # 使用例
  # echo DATE  → echo 2025-01-15 に展開される (日付は実行時の値)
  </syntaxhighlight>
<br>
===== --regexオプション =====
<code>--regex</code>オプションを使用すると、正規表現 (PCRE2) でマッチングできる。<br>
<br>
<syntaxhighlight lang="bash">
# .txtファイルをvimで開く略語
function _abbr_vim_txt
    echo "vim $argv"
end
abbr -a --position anywhere --regex --function _abbr_vim_txt -- '.+\.txt'
</syntaxhighlight>
<br>
==== fish_commandline_append関数とfish_commandline_prepend関数 ====
Fish 3.3.0以降では、<code>fish_commandline_append</code>関数と<code>fish_commandline_prepend</code>関数が組み込まれている。<br>
これらの関数はトグル動作をサポートしており、既にコマンドラインに存在する場合は削除される。<br>
<br>
<center>
{| class="wikitable"
|+ fish_commandline_append関数とfish_commandline_prepend関数
! 関数 !! 説明 !! デフォルトのキーバインド
|-
| <code>fish_commandline_prepend</code> || コマンドラインの先頭に追加 || [Alt] + [S]キー (sudo追加)
|-
| <code>fish_commandline_append</code> || コマンドラインの末尾に追加 || なし
|}
</center>
<br>
以下の例では、キーバインドを設定して、パイプコマンドを簡単に追加できるようにしている。<br>
<br>
vi ~/.config/fish/config.fish
<br>
  <syntaxhighlight lang="bash">
# [Alt] + [L]キーで "| less" を追加
bind \el 'fish_commandline_append "| less"'
# [Alt] + [G]キーで "| grep " を追加
bind \eg 'fish_commandline_append "| grep "'
# [Alt] + [H]キーで "| head" を追加
bind \eh 'fish_commandline_append "| head"'
# [Alt] + [T]キーで "| tail" を追加
bind \et 'fish_commandline_append "| tail"'
</syntaxhighlight>
<br>
==== bindコマンドとcommandlineコマンドを使用する方法 ====
<code>bind</code> コマンド と <code>commandline</code> コマンドを組み合わせることにより、柔軟なグローバルエイリアスを実現できる。<br>
<br>
以下の例では、コマンドラインに <u>l</u> と入力した状態で[Ctrl] + [X]キーを同時押下することにより、<u>|less</u> に展開されるように設定している。<br>
headコマンド、tailコマンド、grepコマンド等も同様に設定可能である。<br>
<br>
  vi ~/.config/fish/bind_global_alias.fish
<br>
<syntaxhighlight lang="bash">
  # ~/.config/fish/bind_global_alias.fishファイル
  # ~/.config/fish/bind_global_alias.fishファイル
   
   
122行目: 248行目:
  # [Alt] + [X]キーに対応
  # [Alt] + [X]キーに対応
  bind \ex bind_global_alias
  bind \ex bind_global_alias
</syntaxhighlight>
<br>
上記のファイルを作成した後、<u>~/.config/fish/config.fish</u> ファイルで読み込む設定を追加する。<br>
<br>
vi ~/.config/fish/config.fish
<br>
<syntaxhighlight lang="bash">
# グローバルエイリアスの読み込み
source ~/.config/fish/bind_global_alias.fish
</syntaxhighlight>
<br>
===== 使用例 =====
グローバルエイリアスを使用するには、展開したい文字を入力した後、設定したキー ([Ctrl] + [X]キー または [Alt] + [X]キー) を押下する。<br>
<br>
* <code>l</code> と入力して[Ctrl] + [X]キーを押下
*: <u>| less</u> に展開される
* <code>h</code> と入力して[Ctrl] + [X]キーを押下
*: <u>| head</u>に展開される
* <code>t</code> と入力して[Ctrl] + [X]キーを押下
*: <u>| tail</u>に展開される
* <code>g</code> と入力して[Ctrl] + [X]キーを押下
*: <u>| grep</u>に展開される
<br>
例えば、<u>cat /var/log/messages l</u> と入力して[Ctrl] + [X]キーを押下すると、<u>cat /var/log/messages | less</u> に展開される。<br>
<br>
===== 独自のグローバルエイリアスを追加する =====
独自のグローバルエイリアスを追加するには、<code>switch</code>文の中に<code>case</code>を追加する。<br>
<br>
<syntaxhighlight lang="bash">
case "<展開前の文字列>"
    commandline -rt '<展開後の文字列>'
</syntaxhighlight>
<br>
以下に、独自のグローバルエイリアスの追加例を示す。<br>
<br>
<syntaxhighlight lang="bash">
# wcコマンドにパイプする
case "w"
    commandline -rt '| wc -l'
# sortコマンドにパイプする
case "s"
    commandline -rt '| sort'
   
   
  # by @GReagle@github
  # xargsコマンドにパイプする
  # https://github.com/fish-shell/fish-shell/issues/1963#issuecomment-93775067
  case "x"
    commandline -rt '| xargs '
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>