VimとEmacsのカーソル移動

 

1 vimemacsのカーソル移動

 

1.1 前書き

基本的にyoshitiaが覚えている分で書いてるので 記事が間違ってるとわかったら各自で正しい操作方法を探しましょう。 くどいようですがvimのヘルプ使いましょう。 紹介順は入門vi(vimではない)に則っています。

1.2 操作の表記

C-fはCtrl+fの表記です。 emacsvimの記事では C-fのような表記が多いので慣れましょう。 M-fならAlt+fです。(macならMeta+f) C-M-fならCtrl+Alt+fになります。

1.3 上下左右移動

 

1.3.1 vim ノーマルモード h(左)、j(下)、k(上)、l(右)

キーボードのホームポジション、右手だけで行います。 vimはカーソル移動・テキスト編集を 極力ノーマルモードで行い、 テキスト入力時にインサートモードに切り替える、 という使い方が基本なので インサートモード時にカーソル移動したくなったら サクッとノーマルモードに戻ってからやるのが普通です。

1.3.2 emacs C-f(右)、C-b(左)、C-n(下)、C-p(右)

vimでもそうですが割とデフォルトのキーバインドは 操作を意味する単語の頭文字の英字キーだったりします。 (100%ではない) この操作の場合は以下の様になります。 C-f forward(入力方向に対して前へ) C-b backward(入力方向に対して後ろへ) C-n next(次の行へ) C-p previous(前の行へ) 操作を意味する英単語を覚えておくと 「C-fは右移動」と丸暗記よりは身につくのが早いと思います。

1.4 行末・行頭移動

一応vimemacsでなくてもhomeキーやendキーで出来たりします。 (windowsのメモ帳でもこれは使えます)

1.4.1 vim ノーマルモード 0(行頭)、$(行末)

0はその行の一番最初の文字を意味しています(0、1と数えてるっぽい) $は正規表現で行末を意味する$を使っています。

おまけ。^だとその行の一番最初にある 空白(半角スペースやタブ)以外の文字に移動します。 (全角スペースは文字として認識されます) ^は正規表現で行頭を表します。 vimの操作で正規表現2つ覚えられます。 やったね!ラッキーだね!

1.4.2 emacs C-a(行頭)、C-e(行末)

C-aなのは多分a=先頭のイメージなんでしょうねー。 C-eはend。

1.4.3 emacs M-a、M-e

動きとしてはC-a、C-eと似ていますが 空白(半角スペースやタブ)以外の 一番最初の文字か最後の文字に移動します。 連続して押すと前の行の一番最初の文字・次の行の一番最後の文字に 移動します。 emacsは英字キーが同じでCtrlかAlt(Meta)かの違いで 似てるような動きで微妙に違う操作が出来たりします。

1.5 単語単位の移動

単語単位の移動はタブや空白で区切られた単語やカンマ、ピリオドです。 vimemacsは元が日本語を想定したエディタではないので日本語の文章では いまいち上手く動かないです。 ただ、上下左右の移動よりは早くカーソルを移動できます。

1.5.1 vim w、W(右方向) b、B(左方向)

大文字はピリオドとカンマを飛ばして移動します。

1.5.2 emacs M-f(右方向)、M-b(左方向)

特にコメントなし。

1.6 まとめ

色々紹介してなんですが、上下左右移動以外は結構使わないです。 私が割と使うのは検索とかファイルの先頭・末尾に移動、行指定移動。 evil-modeの場合は他の操作に割り当てられていたりするので各自確認お願いします。

Arch LinuxでEmacsclientを利用する時の環境変数設定の話。

( ´_ゝ`)ノシ

この記事はEmacs Advent Calendar 2015 12日目の記事です。

qiita.com

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を使った日本語入力ができない事態に遭遇します。

    (emacsskkプラグイン使ってる人は問題ない)

 原因は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アイコン付けてもらいました。

これがその名札です。

懇親会の時に飲み物がかかったみたいで少し(´・ω・`)。

f:id:yoshitia:20151206145535j:plain

 

去年は会場着が遅くなり@kaoriyaさんの発表を生で聞けなかったのが残念でした。

和服姿の美人の発表ですよ皆さん。

今年こそは!→開始時間10:30と早くなる

       + VimConf登録前に当日午前中に病院に行く予約を入れていた

      →11時過ぎに会場着。

・・・来年こそは。

 

2.発表

  発表のスライドはVimConf2015公式サイトのAgendaにリンクがあります。

vimconf.vim-jp.org

 

 会場へ向かう電車でtwitterから#vimconf2015タグで実況を見てたら

 @kaoriyaさんの発表でスライドが表示できないトラブルが発生

 →スライド無しで発表敢行→問題なく発表やりきる

 の熱いイベントが発生していた模様。

・@kaoriyaさんの発表

 内容としてはVimgithub移行の話。

 2015年3月にVim本体のソースコード保管先にしていた

 google codeの閉鎖が決まってから

 移行先としてgithubとbitbucketが手を挙げたそうで。

 (サービス側から手を挙げるってすごいわ)

 

 vim-jpの方々が良くログインするhttp://lingr.com/

 (lingrの読みは「リングル」だと思ってましたが「リンガー」と呼ぶ人が多いっぽい)

 スライドに書いてあるgithubでアカウント名vimの人に

 アカウントを譲ってもらう交渉をしてるって話を見た覚えがありましたが

 この辺りの話だったのかー。(あまり気にしてなかった)

 

 この発表のオチとして、質問タイムでと来て

 @kaoriyaさんに「neovimについてどういう立場ですか?と来て

 「答えにくいですね・・・僕だったらああは作らなかったと思います。

  atomとかvs codeとかベースで、vimをまるまる再現する方が

  いいんじゃないかと思う。

  vimの特徴であったいろんなOSへの対応など、多様性を捨ててしまっている。
  お金をあれだけ集めて2年で何をやったんだ」

 すごくハッキリとした意見。

 ただし、次の発表は@ShougoMatsuさんのNeovim関連の発表。

 @ShougoMatsuさん(´・ω・)カワイソス

 

・@ShougoMatsuさんの発表

 Neovim用自動補完プラグイン(Visual StudioIntelliSenseみたいな機能)

 deopleteの話。

 

 Vimは自力で非同期処理を実現できないのでプラグイン開発者がVimproc.vimのような

 ruby等別のプログラミング言語を利用したプラグインを作成して

 対応している現状です。

 非同期処理を使わないと補完処理がすごく残念な動作をします。

 例えば、"printf"を補完する時に

 "pri"と入力した辺りでキーボード入力が出来なくなって

 少し後にprintf等の補完候補一覧が表示される。

 単語を入力するごとにキーボード入力を受け付けない時間が出来るので

 すごくストレスがたまります。

 非同期処理を使うとユーザのテキスト入力を邪魔せずに補完できるので

 便利なのです。

 

 @ShougoMatsuさんは補完プラグインを作る際、Vimが自前で非同期処理に

 対応していない点で苦労されたかでVimが非同期処理対応になるのを

 期待していたようですが中々対応する話にならなかったようです。

 

 そんな所でVimを作り直そうとできたNeovimが自前で非同期処理対応すると

 聞いてNeovim用自動補完プラグイン作成を決めたそうです。

 

 ・・・Shougoさんの発表ってより自分の知ってる情報並べただけになったorz

 まあいいか。

 

 記事が長くなりすぎたので別記事に続きを書きます。

 

 

Arch Linuxにgnome-doインストールした

(  ´_ゝ`)ノシ

yoshitiaです。

Vimconf2015まで後一週間切り、年末も近づいてきました。

最近はVimEmacsはずっとArch Linuxで使っています。

 

前フリは特に関係ありませんがArch Linuxgnome-doを導入しました。

macだとQuickSilverWindowsだとLaunchyに相当する

コマンドライン型のランチャーソフトです。

(Launchyでググるとソフトの紹介記事があると思います。)

 

本記事はgnome-doをArch Linuxにインストールした際のメモです。

(対象:  gnome-do 0.95.3-2  2015/11/15現在)

 

pacman -Sでgnomegnome-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 プラグインの作り方(超初心者編)

( ´_ゝ`)ノシ
yoshitiaです。
googleで「vim プラグイン 作り方」で検索すると
Vimプラグインが出来るまで が出てきますが
emacs プラグイン 作り方 」でググっても出てくるいい感じの記事が無い。
「欲しい機能や不具合があれば自分でプラグイン書け。パッチあてろ」
の格言があるemacsプラグインの書き方が検索でヒットしないのは
良くないんじゃないかと思いこの記事書いた。

 

目次

 

1.1 一番小さいプラグイン

1.1.1 emacsプラグインを作ろうとする時の流れ。

あくまで最低限です。足りない部分を補足してる
( ゚∀゚)チョウドイイ!!記事があればリンク貼る。(多分)

  • 欲しい機能をelispで書く
  • 関数名決める
  • M-x 関数名で使えるようにする
  1.   欲しい機能をelispで書く

    まず、elispでカーソル行の文字列を取得するだの
    取得した文字列をチェックするだの
    チェック条件式の結果がtrueの場合の動作決めるだの
    ミニバッファにメッセージ出力するだのを
    emacs lispで書く。

    簡単な例として「Hello World」をミニバッファに出力する時はこう書く。

    (message "Hello World")
    
  2.   関数名決める

    普段emacsを使っている時、M-xで関数呼び出したり、
    init.elでキーバインドに関数設定して呼び出す時は
    関数名で指定してますよね?
    オレオレコマンドでも名前が必要です。

    (defun hello-world ()
      (message "Hello World"))
    
  3.   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ファイルに移して、で作っていけば良いと思います。

日々の生活にVimEmacsをEvilを。 Happy Evil life!

 

10/19追記:いい記事があったのでリンク貼ります。

qiita.com

 

※良くわからない場合は下記リンクからlingrチャットの登録方法確認して
登録後emacs部屋で質問できます。
init.el読書会

私より詳しい人が答えてくれるはず( ´_ゝ`)人 (他力本願)
(土曜の夜あたりがログインしている人多いので返事が早い)
emacs lispのコードは括弧が多くて辛いのですがどうしたらいいでしょうか?」
みたいな質問でもOKです。

もくもくEmacs#1に参加しました。

( ´_ゝ`)ノシ

2015年も残り3カ月と半月程度。嘘だ鈍(゚Д゚≡゚Д゚)ドコドコ?m9( ゚Д゚) ドーン!(aa辞書暴走)

yoshitiaです。

 

もくもくEmacsに参加してきました。

mokumokuemacs.connpass.com

会場はpixivさんです。おー、ホントに壁にイラストがある!漫画と技術書が一緒に棚に並んでる。たまにweb記事で見る通りだー。

 

会の趣旨はEmacsユーザが集まってEmacsでなんかやる会。

12時半開場のところを13時15分着orz

 自己紹介終わったかはわからないけど始まってる。

本日の席順。

もくもくEmacsの座席表 - セキココ

 

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エディタの設定。会の趣旨上何も問題は無い。

Atomでのrubyコードのオートコレクトすごい。

 

それと 獨自腐麗夢輪惡上等 (@tadsan) | Twitter さんが紹介した 

coldnew/org-ioslide · GitHubはorg-mode形式のテキストをスライドにできる

すごいプラグインでした。

 

最後に主催者

大橋のぞみ(西木野真姫) (@supermomonga) | Twitter さんによる閉会の挨拶で終了。

雰囲気が良かったので次回も参加したいです。

 

yoshitiaの進捗はinit-loaderで多少init.elを分割できました。

参加者の皆さま、お疲れ様でした。

 

 

※何をするかは個々人の自由な会ので極端な話、

Emacs知らないけど、試してみたいのでインストール」でもイケます。

もし、学校や職場でEmacsについて中々質問できる機会が無い方、

Emacsはじめたいたいけどインターネットの記事だけではわからなかった、

そんな方でもEmacsもくもく会では参加OKです。

次の予定があれば下記のリンク先でイベントのお知らせが出るはず。

(10月やるかも、とのことです。)

mokumokuemacs.connpass.com

 

 

qiita.com

 

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オフにする設定を紹介します。

 

これができると日本語入力した後 ノーマルモードでテキスト編集しようと思ったら ひらがなコマンドはないよって VimEmacsに怒られなくて済みます。

1 どんな設定が必要なの?

1 今imeがオンかオフかをVimEmacsに教える設定 2 1で結果がオンだったらimeをオフにする設定 3 escキー押した時に2を使うようにする設定

ちょっとしたプログラミングですね。 VimEmacs単体でやるのではなく fcitxのコマンド、fcitx-remoteと VimEmacsからシェルコマンドを実行させる機能を利用します。

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"))))

これでLinuxVimEmacsのevil-modeでビィムビィムできます。

日々の生活にVimEmacsをEvilを。 Happy Evil life!