for loop

バッファローカルにEvilを有効にする/momonga.vim #6

目標

Emacs Evil (Extensible VI Layer) をバッファローカルに有効にする

動機

Amazon.co.jp: 実践Vim 思考のスピードで編集しよう!: Drew Neil, 新丈径: 本を読んでvimのキーバインドや文字列操作に対する考えかたの有効性も理解して、vimを使いつつ、過去のmomonga.vimにも参加して.vimrcを弄ったりしたものの、エディタというか作業のベースがEmacsになってしまっていて、これはVimに置き換えもできないと感じていた

一方で以前から Evil: EmacsをVimのごとく使う – 導入編 – 貳佰伍拾陸夜日記 を読んで使ってみたいと気にはしていたのだけど(evil-mode t)を実行するとEmacs上の全てのバッファで有効になってしまうので導入に踏み切れないでいた。種々のアプリはEmacs上での動作を基本としているのでVimキーバインドはプログラミングするバッファのみで有効になって欲しい

で、momonga.vim#6がドワンゴでやる、ということだったので会場に対する興味もありつつこれを期にやってしまおうと企ててみた

結果

evil-local-modeという関数が用意されてて、完全に確認不足

経過

ちょっと頑張ってみないと、と思っていたevilをローカルバッファのみで有効にする、という処理が公式に用意されていて何をしに来たのか良くわからない状態に。 とりあえずこんな感じで該当のファイルをオープンしたタイミングで設定を有効にできるはず。

1
2
3
4
5
6
7
8
9
10
11
(require 'evil)
(evil-mode 0)

(defmacro add-evil-mode (hook-name)
  `(add-hook ',hook-name '(lambda () (evil-local-mode t))))

(add-evil-mode sh-mode-hook)
(add-evil-mode clojure-mode-hook)
(add-evil-mode ruby-mode-hook)
(add-evil-mode lisp-interaction-mode-hook)
(add-evil-mode emacs-lisp-mode-hook)

ついでにevil-local-modeを有効にしたり、C-gでEvilでの処理をキャンセルしてnormal-stateに戻るようなキーバインド設定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  (defun toggle-evil-local-mode () (interactive)
    (if evil-local-mode
      (evil-local-mode 0)
      (evil-local-mode 1)))
  
  (defun evil-escape-or-quit (&optional prompt)
    (interactive)
    (cond
      ((or (evil-normal-state-p) (evil-insert-state-p) (evil-visual-state-p)
           (evil-replace-state-p) (evil-visual-state-p)) [escape])
    (t (kbd "C-g"))))
  
  (define-key key-translation-map     (kbd "C-g")     'evil-escape-or-quit)
  (define-key evil-operator-state-map (kbd "C-g")     'evil-escape-or-quit)
  (define-key evil-normal-state-map   [escape]        'keyboard-quit)
  (global-set-key                     (kbd "C-c C-z") 'toggle-evil-local-mode)

とりあえず、この辺を設定しておいて少しずつEvilを使っていくようにしようと思う。

課題

evil-mode-lineがevil-local-modeの場合は効いてなさそうなのをなんとかしたい。。。
clever-f.vim相当の機能が欲しい

感想とか

会場について特にドワンゴだから、といったような特殊な感じはなかったんじゃないかと。。
うたってみたの実演があったけど、(闇のVimの)勉強会では普通のことのようだし。
前回同様ゆるくもくもくできたけど、前回朝から晩までだったのに比べればだいぶ短期集中だったかな。

余り色々の人とお話はできなかったけれど@pogin503さんにElispのことを教わったりした。Vimはあまり使ってないとのことだったのでVimについて知りたければ入門viより実践Vimを読むべきと押し付けたりした。

あとは、周りのVimmerのコイツ何してるの、という視線もないまま空気と化して一人もくもくとEmacsをいじっていた私を見かねて主催の@supermomongaさんがEvil回りの話を振ってくれたのだけど、期待に応えられず。

もってきてもらった課題はVimユーザとしてはEvilを使ってる状況でC-[でkeyboard-quit相当の処理をしたい場面があるのだけど思った通りに動かないといったもの。 例えば下記の設定はEscapeキーには効くけど、C-[には効かない。

(define-key minibuffer-inactive-mode-map [escape] 'keyboard-quit)

EscapeもC-[もESCとして認識されてるみたいなのだけど、どうもそれぞれ別個に機能としてのESCと紐付いてるみたいで、かつC-[のキーバインドを変更する方法は見付けられなかった。keycodeを検出するxevを動かすために@supermomongaさんのMacにXを捩じ込んだりもしたけど、keycode指定も上手くいかなかくて悔しい思いをした。

ちなみに後で試してみたところ強引に下記のようにC-[をC-gにtranslateしてしまえばkeyboard-quitを実行することは可能だった。

(keyboard-translate ?\e ?\a)

参考 GNU Emacs Lispリファレンスマニュアル: Character Type

ということで進捗としては何しにわざわざ勉強会に行ったのか、といった感じになってしまったけれどこういう機会がないとなかなかEvilに向き会えなかったので良い切っ掛けだったと思う。
今回のことでEmacs上でVimに近いキーバインドを使って作業できる状況を作れるようにはなってきたのだけどvimscriptで実装されてるあの機能が欲しい、となったりしそうなのが若干不安。そこまでEvilが手に馴染めばそれはそれで良い兆候なのだろうけど。

Local Linuxのshutdown

目標

Localで使ってるLinuxをremoteと間違えずに停止する

動機

local machineをLinuxで使ってて、停止処理もterminal上なので、sshでアクセスするremote nodeと停止処理が一緒になってしまう
実際に何度か間違えてremote nodeを停止して辛い思いをしたのでfool proofな停止方法を考えたい

結果

sshのセッションではshutdownしないコマンドを作る

過程

停止のコマンドは色々あるようだけれど、停止のプロセスや再起動の有無などがメインでremoteの場合とlocalの場合を分けるような使い方についての情報は見付けられなかった

Linuxのシャットダウンや再起動のコマンドは色々ある – kanonjiの日記

普通の人はこういうところで困ることがなさそうなのだけど、あまりリモートの停止処理が問題にならない理由は下記あたりかな。。

  1. local nodeをterminalから停止しない
  2. localとremoteでパスワードが違う

1.についてWindowsやLinux Desktopの場合でもWindow ManagerのGUIで停止する場合などはそもそもremoteと同じ処理で停止しないのでlocalと間違えて、というのはなさそう(複数のremote同士というのはあるかもしれないけど)

私はタイル型WMのXmonadを使っていて停止用のGUIインターフェイスはないのでterminalからコマンドでlocalを停止してるけど、これが少数派なのかもしれない。みんなもっとXMonad使おう

ちなみにXmonadの場合下記のように自分で設定ファイルを書き変えてキーバインドに割り当ててる、というのが散見された。
Xmonad doesn’t have permissions to reboot when started via init[SOLVED (Page 1) / Applications & Desktop Environments / Arch Linux Forums

停止方法について質問してるような例もあったけれど、GDM入れるというのが提案されていて、多分一度XMonad抜けるというのが前提
[xmonad] Logout, Shutdown, Restart.

2.についてセキュリティの観点で当然の心得だとは思うけれど、無精な私はテスト用のVMなどはsudoがパスワードの再入力なしで実行できるようにしてしまっていて今のところ改めるつもりがない

ということであまり既成のツールとかは期待できなさそうなのでちょっと書いてみることに
インターフェイスを変えるのが有効そうなのでlocalでコマンドを変更する、というのが良さそうかなと。ついでに普段サーバーとしてアクセスしてるノードにも直接キーボード繋いでアクセスすることもあるのでsshで接続してる時にはshutdownしないというスクリプトにして、各ノードに配布することで目の前のnodeを停止する場合のみに使える、というコマンドにしてみた。需要なさそう。。。

ちなみに、注意点としては親にsshがあるかを探していてtelnetやmoshでの接続の場合は普通にshutdownされてしまうこと。 あと初めの一文字をshutdownのオプションにしているので名前を変えるときにはhからはじまるようにしないと停止しなかったりする。rにするとリブートする

私はhalt local/reboot localという意味からhlocal/rlocalという名前でコマンドにしていてrlocalはhlocalへのシンボリックリンクにしたかったのでこういう作りになってる

とりあえず私はこれで誤停止しなくなったのだけど、また別のシチュエーションでの停止の問題があったら他の方法も考えてみたい

Octopress 設定

動機

とりあえず作ったgithub pagesに最低限の設定を施したい

目標

  • blogのタイトルを変える
  • エントリ内のlinkを新しいtabで開く

結果

達成、というのもおこがましい気がするけど、なんとかなった。

過程

blogのtitleは_config.ymlの変更。下記を参考に。
GithubとOctopressでモダンな技術系ブログを作ってみる – Glide Note – グライドノート

linkについては下記を参考に外部ファイルに限らず_blankを設定することに。
Octopressの初期設定時に気にしておきたい9箇所 – tantant

:source/include/config/head.html
1
2
3
4
5
<script language="JavaScript">
$(document).ready( function () {
   $("a[href^='http']").attr('target', '_blank');
})
</script>

とりあえず見栄えはともかくoutputに必要最低限が得られたので、記録しながら作業を進めていくことにしたい。

Octopress導入

動機

blogを書くのが面倒になって久しくoutputしてなかったのだけど、下記を見て試してちょっと試してみたくなったので。

目標

octopressを使ってのGithub Pageの作成

結果

今見ているこのページ。

過程

Githubでblogということで探していると、どうも静的にローカルで作成してuploadする形式になりoctopressというツールが便利そうだったのでひとまずこれを採用していじってみることにしようと方針が決まる。

リポジトリの持ち方などは下記を参考に。
Octopressのインストールから運用管理まで – T.I.D.

ただ、どうもpreview時に下記のようなエラーになってしまうので調べたところ下記と似たような状況だったのでGemfileに gem 'therubyracer' を追加して対処。
Ruby:Rails4 で Could not find a JavaScript runtime エラー | サイト運営の私的メモ

1
2
3
% rake preview  
Starting to watch source with Jekyll and Compass. Starting Rack on port 4000  
/home/kino/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/execjs-2.2.0/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

上記までで一応目標は達成。
markdownを忘れてしまったまま書いているので勉強しなおさないといけないのだけど、せっかく手元で色々設定できるのでwebベースのブログを使ってたころに挫折したEmacsとの連携もどうにかしたいところ。

たださがしているとorg-modeと連携できるようで便利そうなのがあり、いきなりmarkdown学習意欲が削がれることに。
Octopress の記事を org-mode で – Quickhack Diary

それなりにoutputが簡単にできそうな環境を作れそうなので今後いくつかは書き方とか、設定とかに関して投稿できれば良いな。