26 May 2017, 16:28

Emacs で conda.el をつかって環境が切り替えられない時の対処方法

Emacs で、anaconda 環境を切り替える便利な eLisp に conda.el というものがある。

しかし、これがどうもうまく動かなかったので調査してみた。

環境

  • fish shell 2.5.0
  • Emacs 25.1.2

事象

conda-env-activate を使うと、切り替わったよというメッセージはでるが、 実際は Anaconda の root を使っている。指定した環境を使ってくれない。

原因

PATH に何が設定されてるか調べてみると。 (getenv "PATH")

"/home/tsu-nera/anaconda3/envs/kaggles/bin:/home/tsu-nera/.rbenv/shims:/home/tsu-nera/anaconda3/bin:/home/tsu-nera/.cask/bin:/home/tsu-nera/bin:/home/tsu-nera/go/bin:/home/tsu-nera/.rbenv/bin:/home/tsu-nera/script/scala:/home/tsu-nera/script/ruby:/home/tsu-nera/script/sh:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin"

つまり、二つのパスが登録されている。

  1. /home/tsu-nera/anaconda3/envs/kaggle/bin
  2. /home/tsu-nera/anaconda3/bin

使いたいのは、1 のほうで2はいらない。

なぜかわからないが、Emacs を起動すると、PATH を自動で読み込んでくれるようなのだ。

こんな機能しらないぞ!exec-path-from-shell をつかって実現する機能ではなかったか? デフォルトで PATH を引き継ぐように仕様変更されたのか??

解決方法

fish shell の環境設定ファイル(自分の場合は env.fish に分けている)、 から、anaconda のパスを削除すると、Emacs で conda-activate をつかった切り替えができる。

しかし、これでは、ふだん conda コマンドが使えない。

そこで、fish shell にこんな関数を定義した。まず Emacs を立ち上げた上で、conda を有効にする。

# anaconda
function conda-activate
    set fish_user_paths $HOME/anaconda3/bin $fish_user_paths
end

一時しのぎだけれども、これで Emacs から conda で環境を切り替えることができるようになった。

13 Jan 2017, 15:18

fish ユーザなら入れておきたいプラグイン 13 選

fish ユーザなら、fisherman を使って、簡単にプラグインを入れることができます。

fish のいいところは、fisherman というプラグイン監理マネージャーがあるところです。

今日は、自分が入れているおすすめプラグインを紹介します。

oh-my-fish

oh-my-fish/plugin-balias

alias の代わりに balias と書くことで、alias を補間してくれる。

fisher oh-my-fish/plugin-balias

oh-my-fish/plugin-expand

cd を冒頭につけなくてもディレクトリ移動できる。zsh でもこんな機能あった。

fisher oh-my-fish/plugin-expand

oh-my-fish/plugin-peco

2 つの機能を提供してくれる.

  • peco_kill … プロセスキル
  • peco_select_history … コマンド履歴

peco i/f で どちらも選択して、アクションをする。

fisher oh-my-fish/plugin-peco

oh-my-fish/extract

どんな圧縮ファイルも解凍してくれる extract コマンド

fisher oh-my-fish/plugin-extract

fisherman

fisherman/fzf

ファイル検索や実行コマンド検索ができます。fzf のインストールが必要。 以下から fzf のバイナリが手に入る。

fisher fzf

fisherman/gitignore

.gitignore を作成します。

fisher gitignore

fisherman/spin

時間がかかる処理のときクルクル回るアイコンを表示してくれる。

fisher spin

fisherman/z

z (フォルダ名)で フォルダに移動できる超べんりコマンド

fisher z

その他

edc/bass

Bash の文法を fish シェルでも使えるようにしてくれる。

fisher edc/bass

0rax/fish-bd

ディレクトリを遡ることができる。back directory.

fisher 0rax/fish-bd

oshiori/fish-peco_select_ghq_repository

ghq コマンドと peco の連携。ghq リポジトリ群を peco で選択して移動できる。

fisher oshiori/fish-peco_select_ghq_repository

tsu-nera/fish-peco_open_gh_repository

拙作。ghq コマンドと peco の連携。 ghq リポジトリ群を peco で選択して gh-open コマンドで開くことができる。

fisher tsu-nera/fish-peco_open_gh_repository

tsu-nera/fish-peco_recentd

拙作。z コマンドで頻繁に訪れるディレクトリを peco で選択して移動する。

fisher tsu-nera/fish-peco_recentd

終わりに

私のキーバインドは以下のようになっています。

function fish_user_key_bindings
        # ghq を選択
        bind \cl peco_select_ghq_repository
        # gh-open
        bind \cx\cl peco_open_gh_repository
        # コマンド履歴を見る
        bind \cr peco_select_history
        # プロセスをキルする
        bind \cx\ck peco_kill
        # 最近見たディレクトリに移動
        bind \cx\cr peco_recentd

        # fzf
        bind \cx\cf '__fzf_find_file'
        bind \ctr '__fzf_reverse_isearch'
        bind \ex '__fzf_find_and_execute'
        bind \ed '__fzf_cd'
        bind \eD '__fzf_cd_with_hidden'
end

私の fishfile は以下です。日々進化しています。

12 Jan 2017, 15:23

ghq で管理しているリポジトリを peco で選択して、gh-open で開く fish プラグイン

peco, ghq, gh-open の組み合わせが便利。

ghq で管理しているリポジトリを peco で選択して、gh-open で開く。

これを、fish に移植した。リポジトリは以下。

あらかじめ、

をインストールしておいて, 以下でインストールできる。

fisher tsu-nera/fish-peco_open_gh_repository

12 Jan 2017, 13:13

oh-my-fish は古い!fisherman で置き換えられる。

今まで、oh-my-fish を fish のパッケージ管理として利用してました。

しかし、fisherman を利用すれば、oh-my-fish で利用してきた機能を置き換えることができることを知りました。

ということで、oh-my-fish は捨てて、これからは fisherman 一本で管理していくことにします。

置き換え例

たとえば、

  • omf で hoge というプラグインを利用していた場合、fisherman で omf/hoge に置き換え可能.
  • omf で fuga というテーマを利用していた場合、fisherman で omf/theme-fuga に置き換え可能.

移行手順

以下のチケットにまとまっていました。

  1. fisherman のインストール
curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman
  1. omf plugin を ~/.config/fish/fishfile に加えて fisher コマンドを叩く

加えるルールは以下のとおり

  • plugin xxxx を使っている場合は、oh-my-fish/plugin-xxxx
  • theme xxxx を使っている場合は、oh-my-fish/theme-xxxx
oh-my-fish/plugin-xxxx
oh-my-fish/theme-xxxx

そして、fisher コマンドを実行。

  1. oh-my-fish のアンインストール
omf destroy

トラブルシューティング

oh-my-fihs/theme-default をインストールしたら、git_is_repo という関数がないよと Warning がでた。

fiserman で、git_util をインストールしたら、warning はでなくなった。

29 Dec 2016, 07:52

fish で Emacs とターミナルのディレクトリを行ったり来たり。dired と cde を移植した。

zsh で大変お世話になっていたコマンド、dired と cde を fish に移植した。

dired

ターミナル上の fish で dired とタイプすると、 現在のディレクトリを Emacs の dired で開いてくれる。

function dired 
        emacsclient -e "(dired \"$PWD\")"
end

cde

ターミナル上で cde とタイプすると、 Emacs の現在のバッファに対応するディレクトリをターミナル上の fish で開いてくれる。

function cde
        emacsclient -e "(return-current-working-directory-to-shell)" | sed 's/^"\(.*\)"$/\1/' | read EMACS_CWD
        echo "chdir to $EMACS_CWD"
        cd "$EMACS_CWD"        
end

以下は、init.el に定義。

(defun return-current-working-directory-to-shell ()
  (expand-file-name
   (with-current-buffer
       (if (featurep 'elscreen)
           (let* ((frame-confs (elscreen-get-frame-confs (selected-frame)))
                  (num (nth 1 (assoc 'screen-history frame-confs)))
                  (cur-window-conf
                   (assoc 'window-configuration
                          (assoc num (assoc 'screen-property frame-confs))))
                  (marker (nth 2 cur-window-conf)))
             (marker-buffer marker))
         (nth 1
              (assoc 'buffer-list
                     (nth 1 (nth 1 (current-frame-configuration))))))
     default-directory)))

29 Dec 2016, 04:06

fish で 最近訪れたディレクトリに peco で選択して移動する

fish シェルを使っていて、最近訪れたディレクトリに peco で選択して移動する方法を紹介します。

zsh のときは

最近訪れたディレクトリをどうやって覚えるかが最大の課題だった。 zsh のときは、zsh の組み込み関数があったので以下のように対応していた。

# ------------------------------------------------------------------------
# Name     : cdr
# Function : 最近訪れたフォルダへ移動
# ------------------------------------------------------------------------
autoload -Uz is-at-least
if is-at-least 4.3.11
then
  autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
  add-zsh-hook chpwd chpwd_recent_dirs
  zstyle ':chpwd:*' recent-dirs-max 5000
  zstyle ':chpwd:*' recent-dirs-default yes
  zstyle ':completion:*' recent-dirs-insert both
fi
# ------------------------------------------------------------------------
# peco-recentd
# 最近訪れたディレクトリに移動
# ------------------------------------------------------------------------
function peco-recentd () {
    local selected_dir=$(cdr -l | awk '{ print $2 }' | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-recentd

fish 版 z の導入

fish で、最近訪れたディレクトリをどう管理するか? z という fish 用のライブラリがあり、これが利用できそうだ。

以下のコマンドで最近訪れたディレクトリの一覧を取得できる。

$ z -l 

peco と組み合わせる

以下のような関数を用意した。これを config.fish に書くか、 .config/fish/functions ディレクトリ配下に peco_recentd.fish ファイルを作成して書けばよい。

function peco_recentd
        z -l | peco | awk '{ print $2 }' | read recentd
        cd $recentd
end

キーバインドを以下のように設定する。.config/fish/config.fish に以下を記述。

function fish_user_key_bindings
        # 最近見たディレクトリに移動
        bind \cx\cr peco_recentd
end

これで、zsh でできていた、選択的ディレクトリ移動が fish でもできるようになった。

24 Dec 2016, 08:18

デフォルト設定で強力に便利!zsh から fish に乗り換えたまとめ

3 年間くらいずっと zsh を使ってきたけれども、fish という新しいシェルに移行しました。

[toc]

環境

  • Ubuntu 16.04 LTS
  • fish 2.4.0

fish とは

賢くて、ユーザーフレンドリーなコマンドラインシェル。

  • fish shell

    Fish の由来は、Finally, shell らしい。

なぜ fish に乗り換えようとしたか?

るびきち(@rubikitch)さん の書いた記事に煽られたからです。

そんなにすごいものなのか?るびきちさんは、 Emacs の先駆者としてとても尊敬しているので、 そんな彼が進めるのならば、いいものなのではないか?

新しいものが好きなので、早速試してみました。

ちなみに、Google トレンドによると、だんだん上昇しています。

fish のインストール

各ディストリビューションによって異なる。Ubuntu の場合は、

sudo apt-add-repository ppa:fish-shell/release-2
sudo apt-get update
sudo apt-get install fish

いよいよデフォルトのシェルを zsh から fish に乗り換え

以下のコマンドで乗り換える。心の準備はいいかい?

chsh -s `which fish`

設定ファイルの移行 .zshrc -> config.fish

現状の.zshrc はこんな感じ。

これを config.fish に移行しなければいけない。。621 行の移行。これは大変だぞ!

どこから手をつけようか? と、その前に fish-mode.el の導入。

Emacs major mode for fish shell scripts.

(require 'fish-mode)

これで、作業が楽になる。

まずはコピペから

.zshrc を config.fish にコピペする

cp $HOME/.zshrc $HOME/.config/fish/config.fish

そのままだとエラーが多発するので、とりあえず、全部コメントアウト。

zsh 関係の設定は全武消す

ここは、思い切って消してしまう。fish の魅力を信じる。

alias の移行

以下の形式でかけるので、zsh と変わらない。zsh らしさをなくすために=を除去する。

alias NAME DEFINITION
alias NAME=DEFINITION

~/.config/fish/alias.fish に alias と関数をまとめていく。 そのためには、config.fish 冒頭に以下を追記。

. ~/.config/fish/aliases.fish

alias は関数を簡単に書いたものらしい。

file / directory の存在確認

以下でできる。

file:

if test -e ~/.foobar
    echo "File exists"
end

directory:

if test -d ~/.hello
    echo "Dir exists"
end

プログラムの存在確認

if test -x "emacs"
   function fish_title; end
end

関数の移行

関数は以下の function - end で挟み込む。

function dual
        xrandr --output eDP1 --primary --left-of HDMI1 --output HDMI1 --mode 1280x720
end

Emacs の関数たち

# Emacs で dired をひらく
function dired 
        emacsclient -e "(dired \"$PWD\")"
end

cde が移植できませんでした。

PATH の移行

環境変数は .config/fish/env.fish にまとめることにする。以下を config.fish にかく。

if status --is-login
    . ~/.config/fish/env.fish
end

PATH は以下の形式で設定する。set -U がポイント。

set -U fish_user_paths /usr/local/bin $fish_user_paths

プラグイン

oh-my-fish

  • fish shell をさらに魅力的にしてくれるツール.

17@112:追記 : fisherman を使った方がよい。

curl -L http://get.oh-my.fish | fish

インストールすると、画面がカラフルになる。さまざまなフレームワークを含んでいるらしい。

詳しくは README.md で!

function fish_user_key_bindings
        # ghq を選択
        bind \cl peco_select_ghq_repository
        # コマンド履歴を見る
        bind \cr peco_select_history
        # プロセスをキルする
        bind \cx\ck peco_kill        
end

テーマの設定

ここから好きなテーマが選べる。

迷うからデフォルトで

omf theme default

powerline

かっこいいパワーラインを入れてみる。

と思ったけれども、かっこ悪いので封印。

z

訪れたフォルダにジャンプ。

完成した設定ファイル

config.fish

# alias & function 読み込み
. ~/.config/fish/aliases.fish

# 環境変数読み込み
if status --is-login
    . ~/.config/fish/env.fish
end

env.fish

export LANG=ja_JP.UTF-8
export LD_LIBRARY_PATH=/usr/local/lib
export LIBRARY_PATH=/usr/local/lib
export CPATH=/usr/local/include

if test -d ~/script
        set fish_user_paths ~/script/sh $fish_user_paths
        set fish_user_paths ~/script/ruby $fish_user_paths
        set fish_user_paths ~/script/scala $fish_user_paths        
end

set -x EDITOR emacs
set -x VISUAL "emacsclient -nw"

# for ruby
if test -x "`which ruby`"
        set fish_user_paths $HOME/.gem/ruby/2.1.0/bin $fish_user_paths
end

# for go
if test -x go
        set -x GOPATH $HOME/go
        set fish_user_paths $GOROOT/bin $fish_user_paths 
        set fish_user_paths $GOPATH/bin $fish_user_paths 
end

# my bin
set fish_user_paths $HOME/bin $fish_user_paths

aliases.fish

alias o ‘xdg-open’ alias c ‘cygstart’ alias forced_git_local_destroy ‘git fetch origin;git reset –hard origin/master’ alias xmap ‘xmodmap ~/.Xmodmap’

alias m ‘emacsclient -nw’ alias kill_emacs “emacsclient -e (kill-emacs)“” alias boot_emacs “emacs –daemon”

function reboot_emacs kill_emacs;boot_emacs end

alias lock ‘gnome-screensaver-command -l’

alias fault ‘sudo shutdown -P now’

####################################### ## peco ###################################### function peco command peco –layout=bottom-up \$argv end

function fish_user_key_bindings

bind \cl peco_select_ghq_repository

bind \cr peco_select_history

bind \cx\ck peco_kill end

#######################################################

#######################################################

function dual xrandr –output eDP1 –primary –left-of HDMI1 –output HDMI1 –mode 1280x720 end

function dual2 xrandr –output eDP1 –primary –left-of HDMI1 –output HDMI1 –auto end

function single xrandr –output HDMI1 –off end

############ ## Emacs ########### function dired emacsclient -e “(dired “\$PWD)” end

## Chdir to the ``default-directory” of currently opened in Emacs buffer. function cde end

#+end_src

使ってみた感想など

メリット

  • 軽い

    体感だけれども、zsh よりも、サクサク動作する気がする。

  • 色鮮やか

    デフォルトでも十分色鮮やかだ。黒背景にカラフルな色が好きな自分にとってはうれしい。

  • 設定がとても簡単

    驚くほどに簡単だ。zsh の職人技じみた設定はなんだったのだろうか?

    デフォルトで強力な機能が備わっている。

    設定ファイルをみても、zsh では 600 行あったものが 100 行程度に収まっている。

  • 補完がつよい

    困った時は、タブを押す。 すると、補完がきいて助けてくれる。この機能が一番気に入っている。

デメリット

  • ドキュメントやブログ記事が少ない。
  • 利用者がまだまだ少ない。

    このことによって、他人の設定を参考にすることができない。

  • zsh でできたことが fish でできなかったりする

    zsh では、いろいろと自作関数をつくって便利にしたのだけれども、 fish では同じ機能が実現できなかった。たとえば Emacs との連携など。 時間をかければできるかもしれない。暇な時にハックしよう。

参考