scala-modeのインデントが気に食わない
なんかscala-modeの\C-jって挙動おかしくないですかね?
誰か同じ悩みを持つ人はいないかなとググッてみたらすばらしき先人が
(defadvice scala-block-indentation (around improve-indentation-after-brace activate) (if (eq (char-before) ?\{) (setq ad-return-value (+ (current-indentation) scala-mode-indent:step)) ad-do-it)) (defun scala-newline-and-indent () (interactive) (delete-horizontal-space) (let ((last-command nil)) (newline-and-indent)) (when (scala-in-multi-line-comment-p) (insert "* "))) (add-hook 'scala-mode-hook (lambda () (define-key scala-mode-map (kbd "RET") 'scala-newline-and-indent)))
scala-mode.elのインデントの挙動を改善する, .emacsまとめ(1) - 継続にっき(2010-11-06)
すばらしい! まだちょっと変だけど改善されました。
それにしても、Scalaだけやけにやることが多い……まだまだできたての言語だからかしら。
EmacsのREPLで日本語が文字化けする
EmacsでScalaを書いているとき、常にREPLを起動して式の評価やオブジェクトの挙動を確認しているのですが、日本語がうまく表示できない、読み込めない。
このままでは作業しづらいので、いろいろ設定を変えて試した結果以下のコードを.emacsに追加すればうまくいくようです。
; shellの文字コード指定 (add-hook 'shell-mode-hook '(lambda () (set-buffer-process-coding-system 'sjis 'sjis))) ; Scalaのインタプリタの位置を指定する際に、-Xnojlineのオプションを加えておく (setq scala-interpreter "C:/scala/bin/scala -Xnojline")
問題点は、-Xnojlineを指定しちゃうとREPLでのタブ補完が効かなくなるんですけどね。悩ましい。
追記
上記の設定でREPL上で日本語を入力することはできるようになったのですが、eval-regionなどで日本語を含んだスクリプトを評価させると再び文字化けが。
下記の設定を追加したところ治りました。
(add-hook 'set-language-environment-hook (lambda () (when (equal "ja_JP.UTF-8" (getenv "LANG")) (setq default-process-coding-system '(utf-8 . utf-8)) (setq default-file-name-coding-system 'utf-8)) (when (equal "Japanese" current-language-environment) (setq default-buffer-file-coding-system 'iso-2022-jp)))) (set-language-environment "Japanese") ; ansi-color関係が原因の場合 (autoload 'ansi-color-for-comint-mode-on "ansi-color" "Set `ansi-color-for-comint-mode' to t." t) (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
それにしても、Windowsだと面倒なことが多い……。
NTEmacsでESSを使う
統計解析向けプログラミング言語RをEmacsで使うための拡張にESS(EmacsSpeaksStatistics)があります。
Linuxで使う分には特に問題なかったのですが、WindowsのNTEmacsで利用しようとしたときにちょっとだけはまったので手順をメモ。
Rのインストール
Download R-3.6.0 for Windows. The R-project for statistical computing.
ここからWindows用のインストーラをダウンロードして、exeファイルをダブルクリックしてインストール。
フルパスにスペースが入るとエラーの原因になりますので、Cドライブ直下にインストールすることをおすすめします。(例:C:\R)
設定ファイルを編集する
- Rconsole、Rdevga、Rprofile.siteの3つのファイルをRのインストールフォルダにあるetcフォルダから設定したホームディレクトリコピーする。
- Rconsoleをメモ帳などテキストエディタで開き、"font = "で続く部分を"TT MS Gothic"に変更する。
- Rdevgaをメモ帳などテキストエディタで開き、"TT Arial"をすべて"TT MS Gothic"に変更する。
- Rprofile.siteをメモ帳などテキストエディタで開き、以下のおまじないを追加する。setHook(packageEvent("grDevices", "onLoad"),function(...) grDevices::pdf.options(family="Japan1"))
参考URL:インストール関連 - R on Windows
.emacsの編集
以下の設定を書き加えます。
(require 'ess-site) ;; R起動時にワーキングディレクトリを訊ねない (setq ess-ask-for-ess-directory nil) (setq inferior-R-program-name "c:/R/bin/i386/Rterm.exe")
以上で完了です。(setq inferior-R-program-name "c:/R/bin/i386/Rterm.exe")とRtermの場所をちゃんと指定しないとEmacsがRの対話モードを探せないので注意が必要です。
ESSには多数のキーバインドが設定されているので、以下を参考にしてください。
ボクらのScala練習問題その5
第9章 クラスとオブジェクト
シングルトンオブジェクト
練習問題「class」で作成したCustomerクラスのシングルトンオブジェクト「YamadaTaro」を定義するScalaスクリプトを定義してください。
object YamadaTaro{ val c = new Customer() }
インスタンス変数
練習問題「class」で作成したCustomerクラスに、名前と住所を格納するためのインスタンス変数を追加してください。
class Customer{ var name = "" var adress = "" }
メソッド
練習問題「インスタンス変数」で作成したCustomerクラスに、名前と住所を参照と更新するためのメソッドを追加してください。
class Customer{ var name = "" var adress = "" def getAdress = { adress } def setAdress(str: String) = { adress = str } def getName = { name } def setName(str: String) = { name = str } }
コンストラクタ
練習問題「メソッド」で作成したCustomerクラスに、名前をパラメータにしたコンストラクタを追加してください。この名前はインスタンス変数に格納され、更新されないようにします。
class Customer(val name: String){ var adress = "" def getAdress = { adress } def setAdress(str: String) = { adress = str } def getName = { name } }
補助コンストラクタ
練習問題「コンストラクタ」で作成したCustomerクラスに、名前の姓と名をパラメータにした補助コンストラクタを追加してください。補助コンストラクタでは引数を空白を区切り記号にして連結して、コンストラクタに渡すこととします。
class Customer(val name: String){ var adress = "" def this(front: String, back: String) = this(front + " " + back) def getAdress = { adress } def setAdress(str: String) = { adress = str } def getName = { name } }
統一アクセス
練習問題「コンストラクタ」で作成したCustomerクラスに、インスタンス変数として格納している名前と住所に対して統一アクセスできるようにメソッドを追加してください。
class Customer(val nVal: String){ private var aVal = "" def this(front: String, back: String) = this(front + " " + back) def adress: String = { aVal } def adress_= (str: String) { aVal = str } def name: String = { nVal } }
パッケージとインポート
練習問題「コンストラクタ」で作成したCustomerクラスをパッケージに所属させてください。またREPLでこのCustomerクラスをインポートしてから、newでCustomerクラスのオブジェクトを生成してください。
package customer class Customer(val nVal: String){ private var aVal = "" def this(front: String, back: String) = this(front + " " + back) def adress: String = { aVal } def adress_= (str: String) { aVal = str } def name: String = { nVal } }
customer.scalaをコンパイル後REPLでimport customer.Customer、new Customer("Toto", "Book")。
scala-mode
うちのおんぼろPCだとIDEがきついので最近はScalaを書くのにEmacsを使ってます。
Scala用.elファイルはScalaの本体フォルダ-> misc -> scala-tool-support -> emacs の中に入っています。
これをパスが通っている場所において、.emacsに
(require 'scala-mode-auto) (add-to-list 'auto-mode-alist '("\\.scala$" . scala-mode)) (require 'scala-mode-feature-electric) (add-hook 'scala-mode-hook (lambda () (set-buffer-file-coding-system 'utf-8) (setq default-buffer-file-coding-systems 'utf-8) (scala-electric-mode) (define-key global-map "\C-cs" 'scala-run-scala) (define-key global-map "\C-c\C-e" 'scala-eval-definition)))
と書けばOK。最初の2行だけでscala-modeとして利用するには十分ですが、scala-mode-feature-electricで閉じカッコ保管、あとは文字コード指定やREPLの起動などをキーバインドとして登録しています。
全体的なキーバインドは
- C-cC-l : scala-load-file ファイル読み込み
- C-cC-r : scala-eval-region リージョン範囲のプログラム実行
- C-cC-b : scala-eval-buffer バッファ全体のプログラム実行
- C-cC-c : comment-region リージョン範囲のコメントアウト
- C-cs : scala-run-scala 別窓を開いてREPLの起動
- C-c C-e : カレントの式(ポイントが乗ってる式、または直前の式)を評価
といった感じ。スクリプトとして編集するなら割とサクサクできます。コンパイルしてテスト書きながらガリガリやるならsbtの設定もほしいところですが、それはまたいずれ。
漫画家西原理恵子先生の電子マガジンがすごい
ほぼタイトルで言いたいこと終わってますが。
何がすごいってこの雑誌、無料なのに電子書籍として私が思いつく「紙の本との差別化」要素の半分近くが盛り込まれてるんですよ。
ざっとあげると、
- 動画の埋込み
- 漫画のコマ単位での拡大→ページ移動するようにコマを移動
- 有料漫画アプリへのリンク(iTunesが起動しちゃいますが、これはしゃあない。むしろAppleさんなんとかしてください)
- 内蔵ブラウザ(Safariが別個起動しないのは何気に大事だと思います)によるURL先の確認
などなど。かなり気合の入ったアプリになってます。そして無料。
ただ、インターフェイスが他の電子書籍アプリとあまり似てないためにページ移動や情報バーを表示することに手間取るのはちょっと残念。もしかしたら西原先生の他の漫画アプリの共通インターフェイスだったりするんだろうか。買って確認してみようかな。