Linuxデスクトップ上でのプログラミング環境一例

2016年8月現在の自分のLinuxデスクトップ上でのプログラミング環境を書いてみた。

dotfilesは以下に置いてある。
https://github.com/maueki/dotfiles2

# はじめに

## 普段どんなプログラムを書いているのか

主にLinuxデスクトップで組み込みLinux上で動作するアプリケーションのプログラミングをおこなっている。メインで使用している言語はC++。ツールやちょっとしたプログラムはpython3(ボード上で動作する場合はpython2)で書いている。

# デスクトップ環境は[gnome3](https://www.gnome.org/gnome-3/)

特にこだわりがあるというわけではなく、Debianのデフォルトなので使用している。
ただしテーマは変更していて、[Arc Theme](https://github.com/horst3180/arc-theme)がお気に入り

以下はArc Themeの公式スクリーンショット

![公式スクリーンショット](https://camo.githubusercontent.com/b07bd2390cdd348e6404e46a97e3f35d2be5c25e/687474703a2f2f692e696d6775722e636f6d2f7444314f4251332e706e67)


# ターミナルは[terminator](http://gnometerminator.blogspot.jp/p/introduction.html)

ターミナルは、

* ウィンドウが透ける
* [曖昧文字幅](https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85)に一応対策がある

という理由でterminatorを使用している。なおプログラミングする場合は常に最大化している。

terminatorは画面が分割できるのがウリのようだが、その機能に関しては後述のtmuxにまかせているので使用していない。

透過に関しては単純にカッコイイという理由以外にGUIアプリを起動して裏に置いた状態でログを見たりできるという実用的な面もある。

~~曖昧文字幅に関しては、環境変数`VTE_CJK_WIDTH=1`を指定して起動することで（完全ではないが）主にEmacsで発生するレイアウト崩れを防止している。~~

~~以下のようなファイルを用意しておくと便利~~

```ini:$HOME/.local/share/applications/terminator-cjk.desktop
[Desktop Entry]
Encoding=UTF-8
Name=terminator-cjk
Exec=env VTE_CJK_WIDTH=1 terminator
Icon=terminal
Type=Application
Categories=Development;
```

追記(2017/03/22): どうやら`VTE_CJK_WIDTH`は廃止になったようだ。以下に回避策を記載した
http://qiita.com/maueki/items/d07760d5ee77ce72a9f4

## ターミナルのフォントは[Inconsolata](http://levien.com/type/myfonts/inconsolata.html)

ターミナルのフォントはInconsolataを使用している。特にこだわりはないが、プログラミングするにあたっては「0(ゼロ)/o(小文字オー)/O(大文字オー)」「1(数字)/l(小文字エル)」あたりは明確に区別できるフォントを使用したい。

debianならパッケージが用意されている

```bash
$ sudo aptitude install fonts-inconsolata
```

上記Inconsolataのサイトからinconsolata.otfを取得して`$HOME/.fonts/`以下に配置して`$ fc-cache -f`を実行してもOK

terminatorのフォント変更は *右クリック>設定>プロファイル>一般* から設定可能。

追記(2017/03/29): Inconsolata + Migu 1Mの[Ricty](http://www.rs.tus.ac.jp/yyusa/ricty.html)に変更しました

# シェルは[Zsh](http://zsh.sourceforge.net/)

強力な補完機能がウリのシェル。便利なプラグインが多いのも魅力だが自分はあまり使いこなせていない。

設定等は[ここ](http://news.mynavi.jp/column/zsh/)を参考にしていたが、なにぶん7年前の記事なのですでに時代遅れの部分もあるかもしれない。

デフォルトのシェル(ログインシェル)の変更は`chsh`コマンドから行うことができる

```bash
$ chsh -s /bin/zsh
```

## [zaw](https://github.com/zsh-users/zaw)

Zshのプラグインで、`cd`の履歴やコマンドヒストリをインクリメンタルサーチできて非常に便利。

## behind-window-notify

tmuxの非アクティブウィンドウでのコマンド終了を通知してくれる。地味に便利。

http://qiita.com/maueki/items/e463531f673a348c4d95


# [tmux](https://tmux.github.io/)

tmuxはターミナルの画面分割やタブ化をしてくれるアプリ。リンク先の画面イメージがわかりやすいと思う。

単にタブ化するだけでなくセッションを保持してくれるため、何かの拍子に誤ってterminatorを終了してしまっても、再起動したterminator上で

```
$ tmux a
```

と入力すれば全てが復元するというありがたい機能がある。

なお、tmuxのデフォルトのコマンド用キー(prefix)は`C-b`だが、Emacsのカーソル移動とかぶるため`C-j`に変更している。(シェルやEmacs上で`C-j`を入力したいときは`C-j C-j`と入力する)

```$HOME/.tmux.conf
bind-key C-j send-prefix
```

自宅のデスクトップマシンでプログラミングをしている際、座るのに疲れてきたらノートPCを持ってこたつや布団に移動、sshでデスクトップマシンへログインして

```bash
$ tmux a -d
```

とすれば、すぐプログラミング再開というダラダラプログラミングの強い味方でもある。(`-d`付ける理由は[ここ](http://qiita.com/maueki/items/dec71193560955f15e5f)参照)

# エディタは[Emacs](https://www.gnu.org/software/emacs/)

エディタはtmux上でEmacsを起動(`$ emacs -nw`)して使用している。

EmacsはLinux界ではvi/Vimと勢力を2分するといわれている歴史の長いエディタ。自分はかれこれ20年以上お世話になっているがいまだに進歩し続けており驚愕する。

かつてはメール読み書きもwebブラウジングもシェルもEmacs上で実行し「EmacsはOSである」とまで言われたが、流石に最近はそのような使い方をする人は少なくなったと思われる。

なお[Vim派とEmacs派の争い](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%88%A6%E4%BA%89)はしばしば「宗教戦争」などと呼ばれたりもするが、組み込みLinuxを扱う場合はviの操作も最低限できるとなにかと重宝するので覚えておくと良いだろう。

あと、tmux上で起動している理由は

* シェルと素早く切り替えができる
* tmuxのコピペ機能を使ってシェルとEmacs相互のコピペが簡単に行える
* tmuxのところで説明したダラダラプログラミング

といったところ。ただし、ターミナル上でのEmacs使用にはデメリットもある

* キー組み合わせに制限がある([参考](http://d.hatena.ne.jp/hirose31/20040219/1160403206) <- terminatorでは不可)
* 画像を扱うことができない([Sixel Graphics](http://qiita.com/arakiken/items/3e4bc9a6e43af0198e46)を使えばターミナル上たで画像を扱えるらしいがEmacsは対応しているのだろうか？)


以下にEmacsのオススメの機能、パッケージを記載する。

## el-get

Emacsにインストールするパッケージを管理してくれる。以下に簡単な解説を書いた。

[el-getでgit共有できるemacs環境構築](http://qiita.com/maueki/items/345003d94da98ed64fa5)

Emacsのパッケージ管理は

* package.el(標準)
* [Cask](http://cask.readthedocs.io/en/latest/)
* el-get

あたりが人気という認識。
解説にも書いたが、el-getを選んだのはgitでの設定共有が(自分の環境では)一番うまくいったため。

## [helm](https://emacs-helm.github.io/helm/)

Emacsパッケージの人気投票を行ったら上位に来るであろうことは間違いないと思われるパッケージ。

Emacsのバッファ(≒現在開いているファイル)や、最近開いたファイル、git管理されているファイル(helm-ls-git-lsが必要)などなど何でもインクリメンタルサーチで素早くアクセスできるようにしてしまう。


これがあると無いとで自分の生産効率は大きく変わるといっても過言ではない。

## [magit](https://magit.vc/)

Emacsからgitを扱うためのパッケージ。最初ちょっと戸惑うが、慣れてしまえばこちらも生産性向上間違い無し。

チュートリアルを書いた
[magitチュートリアル](http://qiita.com/maueki/items/70dbf62d8bd2ee348274)

## tramp-mode

ssh越しにファイルを編集したりできる機能。これのおかげでviの使用頻度がだいぶ下がった。
以下に簡単な紹介を書いた。
[tramp-modeが便利](http://qiita.com/maueki/items/dac0aa68e3499fb46f26)

# Emacs上のC++開発環境

以下が詳しい
[C++11時代のEmacs C++コーディング環境](http://qiita.com/alpha22jp/items/90f7f2ad4f8b1fa089f4)

# pythonは[Jupyter](http://jupyter.org/)で書くことも

pythonのコードはJupyter(旧名:IPython Notebook)で書くこともある。
Jupyterはwebブラウザ上でインタラクティブにプログラミングができるアプリケーションで、グラフなどもブラウザ上に表示してくれるため、データ処理などのコードを書く際には非常に重宝する。

webブラウザ上でプログラミングと聞くと「サーバ立てるの大変では？」と懸念するかもしれないが、基本的にワンコマンドでサーバが起動する（ついでにブラウザまで勝手に起動してくれる）ので特に難しく考える必要はない。

補完機能やヘルプドキュメントも完備しておりとてもwebブラウザ上とは思えない機能性を有しているためそれだけでも一見の価値あり。

# 番外編

## 椅子

プログラマはその性質上長時間椅子に座ることを余儀なくされるので、できるかぎり良いワークチェアに座るべきだと思う。
会社では[セイルチェア](http://www.hermanmiller.co.jp/products/seating/performance-work-chairs/sayl-chairs.html)、自宅では[ミラチェア](http://www.hermanmiller.co.jp/products/seating/performance-work-chairs/mirra-2-chairs.html)(リンク先はミラ2チェア)を使用している。

ところで一時期スタンディングデスクが話題に上ったが、効果の程はどうなのだろうか。

## キーボード

[HHKB Pro2](https://www.pfu.fujitsu.com/hhkeyboard/hhkbpro2/spec.html)を使用。最近Ergodoxが気になっている

## マウス

というかマウスは長時間使用していると手首が痛くなってしまうのでトラックボールを使用している→[Expert Mouse Optical Trackball](http://www.kensington.com/ja/jp/4493/64325/expert-mouse-optical-trackball)