Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@sgur
Last active April 10, 2018 12:16
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save sgur/1d96885a1cf34fc2bb86 to your computer and use it in GitHub Desktop.
Save sgur/1d96885a1cf34fc2bb86 to your computer and use it in GitHub Desktop.
MSYS2で fish を動作するようにするまで

1. msys2 で fish のインストール

pacman -S fish
pacman -S man

2. /usr/etc/fish/config.fish の編集

if status --is-login の条件内に以下のコードを追加 (/etc/profile と同様にパスを設定) する。

Windows の既存のパスを引き継ぎたくない場合は、1行目末尾の $PATH は抜いておいてもよい。

	set PATH /usr/local/bin /usr/bin /bin $PATH
	set MANPATH /usr/local/man /usr/share/fish/man /usr/share/man /usr/man /share/man $MANPATH
	set -gx INFOPATH /usr/local/info /usr/share/info /usr/info /share/info $INFOPATH
	if test -n $MSYSTEM
		switch $MSYSTEM
			case MINGW32
				set MINGW_MOUNT_POINT /mingw32
				set -gx PATH $MINGW_MOUNT_POINT/bin $MSYS2_PATH $PATH
				set -gx PKG_CONFIG_PATH $MINGW_MOUNT_POINT/lib/pkgconfig $MINGW_MOUNT_POINT/share/pkgconfig
				set ACLOCAL_PATH $MINGW_MOUNT_POINT/share/aclocal /usr/share/aclocal
				set -gx MANPATH $MINGW_MOUNT_POINT/share/man $MANPATH
			case MINGW64
				set MINGW_MOUNT_POINT /mingw64
				set -gx PATH $MINGW_MOUNT_POINT/bin $MSYS2_PATH $PATH
				set -gx PKG_CONFIG_PATH $MINGW_MOUNT_POINT/lib/pkgconfig $MINGW_MOUNT_POINT/share/pkgconfig
				set ACLOCAL_PATH $MINGW_MOUNT_POINT/share/aclocal /usr/share/aclocal
				set -gx MANPATH $MINGW_MOUNT_POINT/share/man $MANPATH
			case MSYS
				set -gx PATH $MSYS2_PATH /opt/bin:$PATH
				set -gx PKG_CONFIG_PATH /usr/lib/pkgconfig /usr/share/pkgconfig /lib/pkgconfig
				set -gx MANPATH $MANPATH
			case '*'
				set -gx PATH $MSYS2_PATH $PATH
				set -gx MANPATH $MANPATH
		end
	end

	set -gx SYSCONFDIR /etc

	set ORIGINAL_TMP $TMP
	set ORIGINAL_TEMP $TEMP
	set -e TMP
	set -e TEMP
	set -gx tmp (cygpath -w $ORIGINAL_TMP 2> /dev/null)
	set -gx temp (cygpath -w $ORIGINAL_TEMP 2> /dev/null)
	set -gx TMP /tmp
	set -gx TEMP /tmp

	set p "/proc/registry/HKEY_CURRENT_USER/Software/Microsoft/Windows NT/CurrentVersion/Windows/Device"
	if test -e $p
		read PRINTER < $p
		set -gx PRINTER (echo $PRINTER | sed -e 's/,.*$//g')
	end
	set -e p

	if test -n $ACLOCAL_PATH
		set -gx ACLOCAL_PATH $ACLOCAL_PATH
	end

	set -gx LC_COLLATE C
	for postinst in /etc/post-install/*.post
		if test -e $postinst
			sh -c $postinst
		end
	end

2-2 パスに (x86) が含まれているとき、<TAB> 補完に失敗する件への対応

complete.cpp does not parse PATH directories with parenthesis correctly. #952 fish-shell/fish-shell

64bit Windows の場合、$PATH(x86)が含まれている。

msys2 上の fish のプロンプトでコマンドの補完をした時、 $PATH中の (x86) をコマンド実行の置換のための (...) と勘違いして、x86というコマンドがないため <TAB> 補完中にエラーが出力される。

そこで、上記ファイルに、以下の function を定義する。

	function x86
		echo '(x86)'
	end
	function X86
		echo '(X86)'
	end

たいへんバカバカしいですが、ちゃんと動く。

3. c:/msys64/msys2_shell.bat を編集

スタートメニューのMSYS2 shell.batからも起動するように変更する。

start %WD%mintty -i /msys2.ico /usr/bin/bash --login %*

のところを

SET XDG_RUNTIME_DIR=/tmp/fish.%USERNAME%
start %WD%mintty -i /msys2.ico /usr/bin/fish --login %*

に変更する。

XDG_RUNTIME_DIR を変更しているのは、msys/cygwin ではこの変数がシェル起動時に自動的に設定できないようでエラーとなってしまうため。 (fish-shell/fish-shell#1887 (comment))

4. ConEmu からの起動

ConEmu に Task を追加して、以下のようなコマンドを指定

C:\msys64\usr\bin\sh.exe -c 'MSYSTEM=MSYS XDG_RUNTIME_DIR=/tmp/fish.$USERNAME exec /usr/bin/fish --login' -new_console:C:"\msys64\msys2.ico" -new_console:d:"%USERPROFILE%"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment