とりあえずcygwinにemacs入れて使ってみた。shellとか。

Pocket

20170908 emacs shell-mode bash
20170908 emacs shell-mode bash

なぜか、cygwinのemacsでshellモードを使うと、lsもwhichもcpもmvとかも使えなかった。

どうも、PATHの環境変数の設定がshellモードでは伝達できていないらしい。

PATHをemacsに伝えるには、~/.emacs.d/shellenv.elというファイルを作る必要があるらしい。

作るのはPerlのワンライナーで、一発でできる。

以下、Perlの出力をリダイレクトして、~/.emacs.d/shellenv.elを作成する方法。PATHをemacsに伝えるEmacsLISPが出力される。ワンライナーすげ。

#create emacs env file
perl -wle \
'do { print qq/(setenv "$_" "$ENV{$_}")/ if exists $ENV{$_} } for @ARGV' \
PATH > ~/.emacs.d/shellenv.el

2017/9/13追記:

以下のEmacsLISPも必要でした。主にbashにcygwinのコマンド群のパスを伝えるのに必要です。

;; より下に記述した物が PATH の先頭に追加されます
(dolist (dir (list
              "/sbin"
              "/usr/sbin"
              "/bin"
              "/usr/bin"
              "/opt/local/bin"
              "/sw/bin"
              "/usr/local/bin"
              (expand-file-name "~/bin")
              (expand-file-name "~/.emacs.d/bin")
              ))
  ;; PATH と exec-path に同じ物を追加します
  (when (and (file-exists-p dir) (not (member dir exec-path)))
    (setenv "PATH" (concat dir ":" (getenv "PATH")))
    (setq exec-path (append (list dir) exec-path))))

上のコードを、~/emacs.d/init.elに入れてください。
以下のコードより先にも先に入れる必要があります。

あとは、~/.emacs.d/shellenv.elを読み込むEmacsLISPを書くだけ。

emacsの初期設定ファイル~/.emacs.d/init.elに以下のコードを書きます。

;; load environment value
(load-file (expand-file-name "~/.emacs.d/shellenv.el"))
(dolist (path (reverse (split-string (getenv "PATH") ":")))
(add-to-list 'exec-path path))

これで、emacsのshellモードでシェルに対して環境変数PATHが伝達されます。

PATHが設定されるため、shellモードのシェルで、lsとかcpとかmvとかOKできます。GJ牧場。

以下、参考にしたサイトのURL:(ありがとうございます OSZ)

20170908

シェルと Emacsの PATHを共有する – syohex’s diary
Linuxコマンド集 – 【iconv】文字コードを変換して出力する:ITpro
Linuxコマンド集 – 【 nkf 】 文字コードを変換する:ITpro
The Org Manual
dotfiles/init.el at master · kawabata/dotfiles · GitHub