Arch LinuxでEmacsclientを利用する時の環境変数設定の話。
( ´_ゝ`)ノシ
この記事はEmacs Advent Calendar 2015 12日目の記事です。
11日目はkoshさんの記事でした。
Emacs - 連想リストの参照を少しでも楽にしたい - Qiita
本記事はEmacsclientのお話です。
1. Emacsclientって?
プラグインや設定が多くてemacsが重くなった時の対処法の一つ。
常駐ソフトの様に裏であらかじめ起動させておく。
既に起動させている状態なので「起動が重い!」と言わなくて済む。
うっかりemacsclientのウィンドウを終了させても、バックグラウンドで
起動してるままなので安心。
本記事はpacmanでインストールしたGNU emacs 24.5.1を使っています。
2. Arch linuxで使う時は
systemdってのを使う。
https://wiki.archlinux.org/index.php/Emacs#As_a_daemon
~/.config/systemd/user/emacs.service
にemacsをバックグラウンドで起動する設定を書いて
$ systemctl --user enable emacs
でsystemdで利用可能な状態にして
$ systemctl --user start emacs
でバックグラウンドで起動させる。
$ emacsclient -nc
で使う。
~/.bashrcに
alias ekill='emacsclient -e "(kill-emacs)"'
と書いておくとemacsclientを再起動させたい時に
ekillと打つだけで済むので楽です。
3. 本題
2. の通りに設定してそのまま使うと
IMEを使った日本語入力ができない事態に遭遇します。
原因はsystemdから起動する時のソフトは
.bashrcの設定を読み込まないことらしい。
emacsでM-x eshellして.bashrcで設定している変数を
$echo $XMODIFIRES
の様にechoで確認して文字が出力されなかったら多分これです。
4. どーすんのよ
~/.config/systemd/user/emacs.service
に環境変数の設定を書きます。
[Service]の下の行あたりに
Environment="LANG=ja_JP.UTF-8" "HOGE=huga"
と書いて保存したら
$emacsclient --e "(kill-emacs)"
でemacsclient再起動して
M-x eshellして
$echo $LANG
$echo $HOGE
で確認しましょう。
ja_JP.UTF-8とかhugaと出てきたら設定OKです。
後は.bashrcで設定してたもので必要な環境変数を設定しましょう。
5. systemdの環境変数設定の仕方ってだるくないか?
この記事を見て、systemdで起動する時、
.bashrc読み込んでくれたらいいのにと思うかもしれません。
思うかもしれませんがちょっと待ってください。
この記事を読んでいる方で長い期間利用しているPCや
他人のPCを使っていて、昔にインストールしたまま放置していたソフトや
知らない設定で今やろうとしていたことを邪魔された経験の
無い方はいらっしゃいますか?無い人の方が珍しいのではないでしょうか?
systemdのやり方であればソフト毎に環境変数を設定できるので
他のソフトの環境変数とぶつからない素敵なやり方だと思います'`ィ (゚д゚)/
6. まとめと言う名の言い訳
この記事どちらかというとArch Linux Advent Calendarじゃないかって?
Emacsの話だから⊂(^ω^)⊃ セフセフ!!
Emacs Advent Calendar 2015 13日目 はkai2nenobuさんの記事になります。
VimConf2015に行ってきました。
1.前置き
( ´_ゝ`)ノシ
yoshitiaです。
去年に続きVimConf2015に参加してきました。
今年は参加者登録が始まってすぐに登録したので
名札にtwitterアイコン付けてもらいました。
これがその名札です。
懇親会の時に飲み物がかかったみたいで少し(´・ω・`)。
去年は会場着が遅くなり@kaoriyaさんの発表を生で聞けなかったのが残念でした。
和服姿の美人の発表ですよ皆さん。
今年こそは!→開始時間10:30と早くなる
+ VimConf登録前に当日午前中に病院に行く予約を入れていた
→11時過ぎに会場着。
・・・来年こそは。
2.発表
発表のスライドはVimConf2015公式サイトのAgendaにリンクがあります。
会場へ向かう電車でtwitterから#vimconf2015タグで実況を見てたら
@kaoriyaさんの発表でスライドが表示できないトラブルが発生
→スライド無しで発表敢行→問題なく発表やりきる
の熱いイベントが発生していた模様。
・@kaoriyaさんの発表
google codeの閉鎖が決まってから
移行先としてgithubとbitbucketが手を挙げたそうで。
(サービス側から手を挙げるってすごいわ)
vim-jpの方々が良くログインするhttp://lingr.com/で
(lingrの読みは「リングル」だと思ってましたが「リンガー」と呼ぶ人が多いっぽい)
アカウントを譲ってもらう交渉をしてるって話を見た覚えがありましたが
この辺りの話だったのかー。(あまり気にしてなかった)
この発表のオチとして、質問タイムでと来て
@kaoriyaさんに「neovimについてどういう立場ですか?」と来て
「答えにくいですね・・・僕だったらああは作らなかったと思います。
atomとかvs codeとかベースで、vimをまるまる再現する方が
いいんじゃないかと思う。
vimの特徴であったいろんなOSへの対応など、多様性を捨ててしまっている。
お金をあれだけ集めて2年で何をやったんだ」
すごくハッキリとした意見。
ただし、次の発表は@ShougoMatsuさんのNeovim関連の発表。
@ShougoMatsuさん(´・ω・)カワイソス
・@ShougoMatsuさんの発表
Neovim用自動補完プラグイン(Visual StudioのIntelliSenseみたいな機能)
deopleteの話。
Vimは自力で非同期処理を実現できないのでプラグイン開発者がVimproc.vimのような
ruby等別のプログラミング言語を利用したプラグインを作成して
対応している現状です。
非同期処理を使わないと補完処理がすごく残念な動作をします。
例えば、"printf"を補完する時に
"pri"と入力した辺りでキーボード入力が出来なくなって
少し後にprintf等の補完候補一覧が表示される。
単語を入力するごとにキーボード入力を受け付けない時間が出来るので
すごくストレスがたまります。
非同期処理を使うとユーザのテキスト入力を邪魔せずに補完できるので
便利なのです。
@ShougoMatsuさんは補完プラグインを作る際、Vimが自前で非同期処理に
対応していない点で苦労されたかでVimが非同期処理対応になるのを
期待していたようですが中々対応する話にならなかったようです。
そんな所でVimを作り直そうとできたNeovimが自前で非同期処理対応すると
聞いてNeovim用自動補完プラグイン作成を決めたそうです。
・・・Shougoさんの発表ってより自分の知ってる情報並べただけになったorz
まあいいか。
記事が長くなりすぎたので別記事に続きを書きます。
Arch Linuxにgnome-doインストールした
( ´_ゝ`)ノシ
yoshitiaです。
Vimconf2015まで後一週間切り、年末も近づいてきました。
最近はVimやEmacsはずっとArch Linuxで使っています。
前フリは特に関係ありませんがArch Linuxにgnome-doを導入しました。
macだとQuickSilver、WindowsだとLaunchyに相当する
コマンドライン型のランチャーソフトです。
(Launchyでググるとソフトの紹介記事があると思います。)
本記事はgnome-doをArch Linuxにインストールした際のメモです。
(対象: gnome-do 0.95.3-2 2015/11/15現在)
pacman -Sでgnomeとgnome-doをインストール。
gio-sharp、intltoolもpacman -Sでインストール
ここまででgnome-do自体は動くようになりますが、
プラグインが無いのでメニューバーのアプリケーション一覧くらいしか
検索してくれません。
プラグインは下記リンク先にあるリンクのどれかから
nome-do-plugins-0.8.5-2-any.pkg.tar.xz
flickrnet-3.10.0-2-any.pkg.tar.xz
の2つをダウンロードします(多少バージョンの数字違うかもです。)
32bitOS用と64bitOS用のリンクが混ざっているので注意してください。
http://www.filewatcher.com/_/?q=flickrnet.pkg&p=9
http://www.filewatcher.com/_/?q=gnome-do-plugins_0.8.5.pkg
ダウンロードできたらflickrnetから始まるファイルを指定して
pacman -Uします。次にgnome-do-pluginsをpacman -Uすると
gnome-doのプラグイン設定画面に各種プラグインが表示されます。
プラグインの紹介はよそのweb記事見たら色々あると思います。
以上が記事本文になります。
今年も何かのAdvent Calenderに記事出せるといいなぁ。
少し早いですが本記事を読んでいただいた方に良い年末が訪れますように。
Happy Linux Life!
emacs lisp プラグインの作り方(超初心者編)
1.1 一番小さいプラグイン
1.1.1 emacsでプラグインを作ろうとする時の流れ。
あくまで最低限です。足りない部分を補足してる
( ゚∀゚)チョウドイイ!!記事があればリンク貼る。(多分)
- 欲しい機能をelispで書く
- 関数名決める
- M-x 関数名で使えるようにする
- 欲しい機能をelispで書く
まず、elispでカーソル行の文字列を取得するだの
取得した文字列をチェックするだの
チェック条件式の結果がtrueの場合の動作決めるだの
ミニバッファにメッセージ出力するだのを
emacs lispで書く。簡単な例として「Hello World」をミニバッファに出力する時はこう書く。
(message "Hello World")
- 関数名決める
普段emacsを使っている時、M-xで関数呼び出したり、
init.elでキーバインドに関数設定して呼び出す時は
関数名で指定してますよね?
オレオレコマンドでも名前が必要です。(defun hello-world () (message "Hello World"))
- M-x 関数名で使えるようにする。
これはinteractiveスペシャルフォームを関数内に書いておくと
できるらしい。(defun hello-world () (interactive) (message "Hello World"))
1.1.2 仕上げ
今まで書いた分だけだとscratchバッファに書いてからM-x eval-last-sexpするか
init.elに書いたりしないと動きません。
なのでprovideを追加します。
(defun hello-world ()
(interactive)
(message "Hello World"))
(provide 'hello-world)
以上をhello-world.elファイルを作成して書き込みます。
provideの引数はファイル名(今回はhello-world)と同じにしておかないと
エラー出ます。
hello-world.elファイルを置く場所はload-pathの通っている場所です。
scratchバッファで
load-path
と書いてC-jかM-x eval-print-last-sexpすると
emacsがelファイルの存在を確認するフォルダの一覧が表示されます。
load-pathの一覧を見やすくする方法
一覧の中のフォルダのどれかの直下にhello-world.elを置いて
init.elに(require 'hello-world)と書けば起動後M-x hello-worldが使えます。
どうもrequireでload-path一覧のフォルダ内からhello-world.elが無いか探して
見つかったら(provide 'hello-world)と書かれているか確認、
あったらhello-world.el内のコードを読み込んでおく、となるようです。
1.1.3 ここから先
以上で小さいプラグイン、hello-world.el完成。
このプラグインとgithubで出ているすごいプラグインの差は
(provide 'プラグイン名)の上に書いてあるコードが
スゴイかすごくないかぐらいです。(超暴論)
実際公開されているemacsプラグインはメインとなるelファイル内に
下記の様な事項を書くのが慣習らしいです。(emacsは慣習が色々ある)
- プラグイン名
- 作成年
- 作者名
- ライセンスの種類(MITライセンスとかGPLライセンスとか)
- プラグインの機能説明
- init.elに書く必要がある設定
- 使い方(M-xで入力する関数名とかデフォルトで設定しているキーバインドとか)
- 他にもまだまだあるみたいですが調べるの面倒なので省略
つまりこの記事で書いた分では本当の意味でプラグイン完成ではないってことです。
今回の内容だけ書いた例
公開されていて他人に使ってもらえるプラグインは色々書いてあります。
https://github.com/imakado/emacs-smartchr/blob/master/smartchr.el
38行目位までこのプラグインに関しての各種情報が書いてあります。
他のポイントとしては極力英語で書くことです。
(ファイルに日本語が入ってるとそれが原因でエラー出たりする。
プラグインの機能以外でエラーが出ないようにした方がいい。
日本語使う場合は別にreadme-ja.txtなどを作ってそこに書く。)
細かい事は公開して他人に広く使ってほしい時に考えるってことで
まずはinit.elにプラグインにしたいコード書いていい感じに出来たら
elファイルに移して、で作っていけば良いと思います。
日々の生活にVimをEmacsをEvilを。 Happy Evil life!
10/19追記:いい記事があったのでリンク貼ります。
※良くわからない場合は下記リンクからlingrチャットの登録方法確認して
登録後emacs部屋で質問できます。
init.el読書会
私より詳しい人が答えてくれるはず( ´_ゝ`)人 (他力本願)
(土曜の夜あたりがログインしている人多いので返事が早い)
「emacs lispのコードは括弧が多くて辛いのですがどうしたらいいでしょうか?」
みたいな質問でもOKです。
もくもくEmacs#1に参加しました。
( ´_ゝ`)ノシ
2015年も残り3カ月と半月程度。嘘だ鈍(゚Д゚≡゚Д゚)ドコドコ?m9( ゚Д゚) ドーン!(aa辞書暴走)
yoshitiaです。
もくもくEmacsに参加してきました。
会場はpixivさんです。おー、ホントに壁にイラストがある!漫画と技術書が一緒に棚に並んでる。たまにweb記事で見る通りだー。
会の趣旨はEmacsユーザが集まってEmacsでなんかやる会。
12時半開場のところを13時15分着orz
自己紹介終わったかはわからないけど始まってる。
本日の席順。
yoshitiaは中身が増えすぎて整理できてないinit.el(500行オーバー)をinit-loader.elで
設定ファイル分割。
500行程度で整理できてないと言い出すスライムですみません(´・ω・`)
時間あったらpython用の環境設定でもする予定。
序盤、入力メソッドとかキー設定周りの話が出る。
TabキーをAltキーに変えてる人はじめて見た・・・
windows XP時代カナキーと:キーをEnterキーにしてたのであまり人の事は言えないけど。変換キーはShiftにしてた。
途中 獨自腐麗夢輪惡上等 (@tadsan) | Twitter さんからネタが。
(注意:ものすごくネタなので真面目に読むコードではない。)
evil使ってる人は私含め4人くらい。
他にはcarとcdrは素晴らしいだのcdarのaは増やすとわけわからんとか(cdaaaaaaarみたいなの)などlispな話しつつもくもく。
終盤 igjit (@igjit) | Twitter さんが進捗発表。IMEの一つ、mozcを色んなOSで利用するEmacsプラグインに手を加えてたそうです。
全角記号の入力、「」にkakkoなど何文字も入力が必要なのが不便、の改善を行ってqなど普段日本語入力で使わないアルファベットを頭に取り q( とかで各種全角括弧を出せたりする便利そうな改善。
(半角英数入力そのままに日本語へ変換できるのはかっこいい)
だが、yoshitaはおやゆびシフトかなにゅうりょくなのでかつようできない!
次に tomoya ton (@tomoyaton) | Twitter さんの進捗発表。
el-getプラグインの設定とかAtomエディタの設定。会の趣旨上何も問題は無い。
それと 獨自腐麗夢輪惡上等 (@tadsan) | Twitter さんが紹介した
coldnew/org-ioslide · GitHubはorg-mode形式のテキストをスライドにできる
すごいプラグインでした。
最後に主催者
大橋のぞみ(西木野真姫) (@supermomonga) | Twitter さんによる閉会の挨拶で終了。
雰囲気が良かったので次回も参加したいです。
yoshitiaの進捗はinit-loaderで多少init.elを分割できました。
参加者の皆さま、お疲れ様でした。
※何をするかは個々人の自由な会ので極端な話、
「Emacs知らないけど、試してみたいのでインストール」でもイケます。
もし、学校や職場でEmacsについて中々質問できる機会が無い方、
Emacsはじめたいたいけどインターネットの記事だけではわからなかった、
次の予定があれば下記のリンク先でイベントのお知らせが出るはず。
(10月やるかも、とのことです。)
LinuxのIME制御: fcitxとVimとEmacs with evil-mode
( ´_ゝ`)ノシ
yoshitiaです。
Qiitaの2014アドベントカレンダーエントリ追加できなくなっちゃったけどこの記事はEvil Advent Calender 2014の11日目の記事のつもりです。
どれだけいるかわからない
Linux使っててimeにfcitx使ってて Vim使ってて Emacsでevil-mode使ってる方向けに 一つの記事でVimとevil-modeそれぞれの esc押してノーマルモード(ステート)になる時、 imeオフにする設定を紹介します。
これができると日本語入力した後 ノーマルモードでテキスト編集しようと思ったら ひらがなコマンドはないよって VimやEmacsに怒られなくて済みます。
1 どんな設定が必要なの?
2 Vim編
http://blog.goo.ne.jp/ikunya/e/68dfba9591660b04f98c1bec66aaf9c3 で紹介されていたページのvimscriptから 「esc押してノーマルモード(ステート)になる時、 imeオフにする設定」だけを抜粋してます。
どなたか知らないけど謎の中国人さんありがとう。 感謝しつつ~/.vimrcに以下の設定を書きます。
"##### auto fcitx ########### function! Fcitx2en() let s:input_status = system("fcitx-remote") if s:input_status == 2 let l:a = system("fcitx-remote -c") endif endfunction set ttimeoutlen=150 "退出插入模式 autocmd InsertLeave * call Fcitx2en() "##### auto fcitx end ######
紹介されてるページのvimscriptを全部丸写しすると もれなくインサートモードに入ると同時にimeオンになる設定もついてきます。
3 Evil編
evil-modeの場合です。 Vim編で使われていたfcitx-remoteをここでも使います。
$ fcitx-remote
で現在のime状態を数値で教えてくれます
$ fcitx-remote -c
だとimeがオフされます。 この2つを利用した設定を~/.emacs.d/init.elに書きます。 http://d.hatena.ne.jp/syohex/20121230/1356850677 syohexさんの記事でshell-command-to-stringの存在知りました。 便利。
(add-hook 'evil-normal-state-entry-hook (lambda () (if (string= "2\n" (shell-command-to-string "fcitx-remote")) (shell-command "fcitx-remote -c"))))
Evil使いのelispデバッグ風景
( ´_ゝ`)ノシ
yoshitiaです。
この記事はEvil Advent Calendar 2014の7日目の記事になります。
先日、web-modeで出てくる
File mode specification error: (void-variable web-mode-html-offset)
の対処ですが、
emacs: web-mode のインデント設定が効かない - yoshitia’s diary
よりまともなやり方が見つかったので記事にします。
対処法
私の場合、highlight-indentation-modeが原因でした。
highlight-indentation-modeはメジャーモードがweb-modeの時に
変数web-mode-html-offsetを参照する仕様になってるっぽいので
highlight-indentation.elを直接開いて
web-mode-html-offset
(web-modeの古いバージョンで使われていた変数)
を検索、
web-mode-markup-indent-offset
(web-modeの新しいバージョンで使われていた関数)
に書き換えれば解決します。
対処法を探したやり方
ここからが本題。
結果としてweb-mode自体が原因でなかったので
どれが原因かを探す方法が必要だと思うので書いておきます。
emacsネイティブ?の方には常識かもですが
M-x backtrace
(普通よりエラーを詳しく表示してくれる関数)
を入力してからhtmlなどを開いて
メジャーモードをweb-modeに切り替えます。
すると同じ
(void-variable web-mode-html-offset)
メッセージが出てきますが手前の部分に
エラーが発生してるモードが表示されます。
私の例の様にhighlight-indentation-modeでなくても
問題のモードのファイルを開いて
web-mode-html-offset
を検索して見つけた部分を書き直せば
多分解決するんじゃないかと。
この記事のEvil要素は?
( ´_ゝ`)
インデント設定効いてないと
Evilでの操作、
i<TAB><down><ESC>
の後のドットコマンドが役に立たないのです。
(Vim ドットコマンドで調べると便利)
M-x backtraceの存在を知ってもらえれば、
と言う意図で。
プラグインの名前が付いてるのですごくわかりやすいです。