surround.vimのEmacsバージョン作りました

surround.vimemacsバージョンみたいな感じです. emacsバージョンを探したんですがなかったので悔しくて作りました.

リポジトリ

ganmacs/emacs-surround · GitHub

設定

1.どうにかして入れます

caskの場合はCaskファイルに以下を追加

(depends-on "emacs-surround" :git "https://github.com/ganmacs/emacs-surround.git")

cloneしてくるのは

$ git clone https://github.com/ganmacs/emacs-surround.git

こんなかんじでロードパスが通ってるところにおいてください.

2.設定ファイル

init.elに以下を追加.

(require 'emacs-surround)
(global-set-key (kbd "C-q") 'emacs-surround)

使い方

変更

囲まれた文字列を変更したいときC-q '"と打つと

'He|llo World'

ダブルクォートをシングルクォートに変更します.

"Hello World"

削除

囲まれた文字列を削除したい場合はC-q d "と打ちます

"He|llo World"

そうすると以下のようになります

Hello World

挿入

文字列を囲みたいときはC-q i (C-q ( <return>とうつと

He|llo World

文字列で囲みます

(Hello) World

または,込みたい範囲をリージョンで囲むと以下のように囲むこともできます

(Hello World)

カスタマイズ

emacs-surround-alistに囲むペアのリストを渡すと任意の文字列で囲むことができます.

例えば以下のコードをinit.elに書くと{で囲むときにスペースを入れることができます.

(add-to-list 'emacs-surround-alist '("b" . ("{ " . " }")))

つまり,以下のrubyのブロック内にいる状態でC-q {bとすると

[1, 2, 3].each {p |1+i}

前後にスペースが入った{になります.

[1, 2, 3].each { p 1+i }

終わりに

問題があれば教えてください

参考

vim-surround

Vim のプラグイン紹介 〜 surround.vim でカッコつける 〜

emacs-dayone作った

なぜ

Macにはdayoneというmarkdownで日記をかけるおしゃれUIのアプリがある. 文章はemacsで書いて,読むときだけdayoneを使いたい. emacs-dayone

入れ方

  • Day One Toolsを入れます.
  • cask使って自分の環境に入れる
  • あとは適当にキー割り当ててつかう
  • (READMEにかいてある)

使い方

  • 範囲指定していない時は現在のバッファがすべてdayoneに保存されます
  • 範囲指定してる時は指定範囲のみdayoneに保存されます

emacs-git-grep作ってました

emacsにパッケージ管理をel-getからcaksに変更した際に自分で作ったemacs-git-grepにゴニョゴニョした時に思い出した

発端

デモ

github.com

f:id:ganmacs:20141031115516g:plain

実際

  • 初めて作ったのでたしかemacs-helm-agのコードとか参考に書いてあるコードをかなり真似て作った気がします
  • helm使ってるのに名前に入ってないのはどうなんだろうってずっと思ってる

感想

めっっっっっっっちゃ便利でした

参考

with-eval-after-loadとrequireとautoloadとadd-hookと

発端

違いは何だ!!

まとめ

違ったら教えてください

  • 起動してずっと使ってる -> require
  • 起動時には必要ないけどmodeごとでは使う -> autoload
  • ライブラリでのsetqとかの設定 -> add-hook
  • ライブラリでのdefine-keyとかの設定 -> with-eval-after-load

調べた感じ

  • autoloadrequireは使うタイミングは似てる?
  • autoladは必要なときに読んでくるので起動時に必要ではないものを設定するといい
  • requireはこれが呼ばれたタイミングでライブラリ読むので起動時必要なものだけにしたほうが良さそう

起動時にjs2-modeが呼び出される

(require 'js2-mode)
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))

初めてjsファイルを開いた時にjs2-modeが読み出される

(autoload 'js2-mode "js2-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))

eval-after-loadwith-eval-after-loadadd-hookの違い

  • eval-after-loadwith-eval-after-loadの違いはwith-eval-after-loadはemacs24.4から新しく入ったマクロでprogn使わなくて良くなった
  • add-hookはバッファを呼び出すたびに呼ばれる
  • eval-after-loadは最初に設定しているライブラリがloadされるたびに呼ばれるが2回目以降は早いらしい

This macro arranges to evaluate body at the end of loading the file library, each time library is loaded. If library is already loaded, it evaluates body right away. 15.10 Hooks for Loading

  • setqとかはadd-hookがよくてdefine-keyとかはwith-eval-after-loadかな?

参考

YosemiteにEmacs24.4いれてみた

Yosemiteにする際についでにクリーンインストールしたので設定しなおした記録

書くこと

  • Emacs24.4をYosemiteに入れたところ
  • Emacsを上げて困ったこところ

Emacs24.4をYosemiteに入れたところ

inline patch当てなくていい人は1と5だけやればいい

  • 1 何はともあれまずはEmacsを取ってくる
$ curl -L -O http://ftpmirror.gnu.org/emacs/emacs-24.4.tar.gz
$ tar zxvf emacs-24.4.tar.gz
  • 2 今回はinline-pathもあてようと思うのでそっちも取ってくる
$ curl -L -O http://plamo.linet.gr.jp/~matsuki/mac/emacs-24.4-20140417-inline.patch
  • 3 パッチ当てるとビルドするときにライブラリが必要になるのでいくつか入れる
$ brew install autoconf automake
  • 4 パッチ当てる
$ cd emacs-24.4
$ patch -p1 < ../emacs-24.4-20140417-inline.patch

5 ビルドする

$ ./configure --with-ns --without-x | make -j2 | make install

以上でnextstep/Emacsができてるはずなので/Application以下に移動すると使えるようになる

困ったところ

1. helmがmakeできない

helmが(require 'cl-lib)してるんだけど,そんなものはないって怒られる

原因

makeするときは/usr/local/bin/emacsの方を使っているのが原因っぽかった
/usr/local/bin/emacsのバージョンが21くらいでcl-libが入ったので24からなのでほんとにそんなものはなかった
Cocoa Emacsにしなかったらこんなことにはならなかったな?

解決策

バージョンが24以上のemacsを入れる

brew install emacs

2. zlcが動かない

(wrong-number-of-arguments (2 . 4) 0)こんなかんじのエラーが出る

以下に詳しくのってた

emacs24.4 にアップデートして困ってることとか

zlc-minibuffer-complete(completion--do-completion)(completion--do-completion (minibuffer-prompt-end) (point-max)) にすれば動くようになりました。

らしい

参考

OS X Mavericksにemacs 24.4.50を導入

emacsでScala環境設定

Scala開発環境の覚え書き

前提

インストール

brew で入れたもの

el-getでemacsに入れたもの

実際

brew を使って要りそうなものを入れる(sbtが何なのかよくわかってないけどなんかみんな入れてた)

brew install scala
brew install sbt

emacsにはel-getscala-mode2とensimeを入れる
scala-modeもあったんだけどscala-mode2のがemacs24向けらしい

設定

パスは通ってるのでemacsの設定ファイルに以下を書くだけ

(require 'scala-mode2)
(require 'ensime)
(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)

~/.sbt/0.13/plugins/plugins.sbtに以下をついか(なかったら作る)

resolvers += Resolver.sonatypeRepo("snapshots")

addSbtPlugin("org.ensime" % "ensime-sbt" % "0.1.5-SNAPSHOT")

ちょっと書いて見よう

参考

Rails4でActiveAdminとdeviseとcancancanをつかって管理者ページを作る

環境

  • Rails 4.1.2
  • ruby 2.1.1
  • devise 3.3.0
  • active_admin 1.0.0 pre
  • cancancan 1.9.2

Gemfile

gem 'rails', '4.1.2'
gem 'cancancan'
gem 'devise'
gem 'activeadmin', github: 'activeadmin'

bundleする

$ bundle install

まずはdeviseでモデルを作る. roleでadminかどうかを判定するのでUserコントローラに追加

$ rails generate devise:install
$ rails generate devise User
$ rails generate migration add_role_to_users role:integer
$ rake db:migrate

Deviseのモデルを使うのでActiveAdminでUserモデルをつくらないようにするために--skip-users

$ rails generate active_admin:install --skip-users
 create  config/initializers/active_admin.rb
      create  app/admin
      create  app/admin/dashboard.rb
       route  ActiveAdmin.routes(self)
    generate  active_admin:assets
      create  app/assets/javascripts/active_admin.js.coffee
      create  app/assets/stylesheets/active_admin.css.scss
      create  db/migrate/20140829091410_create_active_admin_comments.rb
$ rake db:migrate

これするとconfig/intializers/active_admin.rbのなかを幾つか変えないといけない

config.current_user_method = :current_admin_user
↓
config.current_user_method = :current_user

config.logout_link_path = :destroy_admin_user_session_path
↓
config.logout_link_path = :destroy_user_session_path

またapp/application_controller.rbに以下を追加

def authenticate_admin_user!
  authenticate_user!
  unless current_user.admin?
    flash[:alert] = "This area is restricted to administrators only."
    redirect_to root_path
  end
end

userモデルはadmin?は持ってないので以下をmodel/user.rbに追加(Rails 4からenumが使える)

enum role: %(admin normal)

cancancanいらなかった!!!

roleが3つ以上あるといる気がするけどめんどくさそう

参考

Railsで新規にWebサービスを立ち上げる際にやったことまとめ [Rails] Devise and Active Admin Single User Model