emacs - 静かなる名辞 https://www.haya-programming.com/archive/category/emacs pythonとプログラミングのこと Thu, 07 May 2020 20:42:34 +0900 http://blogs.law.harvard.edu/tech/rss Hatena::Blog emacsでpythonを書くための設定 2019年版 https://www.haya-programming.com/entry/2019/05/15/235945 <div class="section"> <h3>概要</h3> <p> emacsライトユーザーの私が、新規環境にemacs25を導入してpythonを書くにあたってやった設定を書いておきます。目的はpythonを書くことだけです。</p><p> 前提として、以下の記事のように環境を作っています(読まなくてもなんとかなります)。</p><p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.haya-programming.com%2Fentry%2F2019%2F05%2F05%2F003311" title="Ubuntu 18.04 LTSにvenvでミニマムなPython3.7仮想環境を構築 - 静かなる名辞" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><a href="https://www.haya-programming.com/entry/2019/05/05/003311">Ubuntu 18.04 LTS&#x306B;venv&#x3067;&#x30DF;&#x30CB;&#x30DE;&#x30E0;&#x306A;Python3.7&#x4EEE;&#x60F3;&#x74B0;&#x5883;&#x3092;&#x69CB;&#x7BC9; - &#x9759;&#x304B;&#x306A;&#x308B;&#x540D;&#x8F9E;</a></p><p> あれこれやってもそこまで快適にならないので、flymakeとjediの設定をやっただけです。</p> </div> <div class="section"> <h3>インデントの設定</h3> <p> 以前のinit.elからそのまま引き継ぎましたが、要らんかも。</p> <pre class="code" data-lang="" data-unlink>(add-hook &#39;python-mode-hook (lambda () (setq python-indent-offset 4)))</pre> </div> <div class="section"> <h3>pyflakes・flymakeを入れる</h3> <p> これは入れないとはかどらないので入れました。</p><p> まずpython側で、仮想環境をactivateした状態でpyflakesを入れます。</p> <pre class="code" data-lang="" data-unlink>$ pip install pyflakes</pre><p> flymakeはemacsにデフォルトで入っていますが、設定が要ります。</p> <pre class="code lang-lisp" data-lang="lisp" data-unlink><span class="synComment">; これも昔どこかからコピペして使っている秘伝のタレ・・・</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> flymake-allowed-file-name-masks <span class="synSpecial">'())</span> <span class="synSpecial">(</span>add-hook <span class="synSpecial">'</span><span class="synIdentifier">find-file-hook</span> <span class="synSpecial">'</span><span class="synIdentifier">flymake-find-file-hook</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">when</span> <span class="synSpecial">(</span><span class="synStatement">load</span> <span class="synConstant">&quot;flymake&quot;</span> <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">defun</span> flymake-pyflakes-init <span class="synSpecial">()</span> <span class="synSpecial">(</span><span class="synStatement">let*</span> <span class="synSpecial">((</span>temp-file <span class="synSpecial">(</span>flymake-init-create-temp-buffer-copy <span class="synSpecial">'</span><span class="synIdentifier">flymake-create-temp-inplace</span><span class="synSpecial">))</span> <span class="synSpecial">(</span>local-file <span class="synSpecial">(</span>file-relative-name temp-file <span class="synSpecial">(</span>file-name-directory buffer-file-name<span class="synSpecial">))))</span> <span class="synSpecial">(</span><span class="synStatement">list</span> <span class="synConstant">&quot;ほげほげ/bin/pyflakesの絶対パスを書く&quot;</span> <span class="synSpecial">(</span><span class="synStatement">list</span> local-file<span class="synSpecial">))))</span> <span class="synSpecial">(</span>add-to-list <span class="synSpecial">'</span><span class="synIdentifier">flymake-allowed-file-name-masks</span> <span class="synSpecial">'(</span><span class="synConstant">&quot;\\.py\\'&quot;</span> flymake-pyflakes-init<span class="synSpecial">)))</span> <span class="synComment">; show message on mini-buffer</span> <span class="synSpecial">(</span><span class="synStatement">defun</span> flymake-show-help <span class="synSpecial">()</span> <span class="synSpecial">(</span><span class="synStatement">when</span> <span class="synSpecial">(</span>get-char-property <span class="synSpecial">(</span>point<span class="synSpecial">)</span> <span class="synSpecial">'</span><span class="synIdentifier">flymake-overlay</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">let</span> <span class="synSpecial">((</span>help <span class="synSpecial">(</span>get-char-property <span class="synSpecial">(</span>point<span class="synSpecial">)</span> <span class="synSpecial">'</span><span class="synIdentifier">help-echo</span><span class="synSpecial">)))</span> <span class="synSpecial">(</span><span class="synStatement">if</span> help <span class="synSpecial">(</span>message <span class="synConstant">&quot;%s&quot;</span> help<span class="synSpecial">)))))</span> <span class="synSpecial">(</span>add-hook <span class="synSpecial">'</span><span class="synIdentifier">post-command-hook</span> <span class="synSpecial">'</span><span class="synIdentifier">flymake-show-help</span><span class="synSpecial">)</span> <span class="synComment">; デフォルトだと赤波線になって見づらかったんで直した</span> <span class="synComment">; 参考:https://suer.hatenablog.com/entry/20090307/1236403449</span> <span class="synSpecial">(</span>custom-set-faces <span class="synSpecial">'(</span>flymake-errline <span class="synSpecial">((((</span><span class="synStatement">class</span> color<span class="synSpecial">))</span> <span class="synSpecial">(</span>:foreground <span class="synConstant">&quot;red&quot;</span> :bold <span class="synStatement">t</span> :underline <span class="synStatement">t</span><span class="synSpecial">))))</span> <span class="synSpecial">'(</span>flymake-warnline <span class="synSpecial">((((</span><span class="synStatement">class</span> color<span class="synSpecial">))</span> <span class="synSpecial">(</span>:foreground <span class="synConstant">&quot;red&quot;</span> :bold <span class="synStatement">t</span> :underline <span class="synStatement">t</span><span class="synSpecial">)))))</span><span class="synComment">; :background &quot;white&quot;)))))</span> </pre><p> これだけで使えるはずです。.pyを開けば効くようになります。</p> </div> <div class="section"> <h3>jediを入れる</h3> <p> コード補完のない環境で書いていた期間も割と長く、なければないでやれることは実感として知っていたので入れるかどうか迷いましたが、せっかくなので入れることにしました。</p><p> 一応公式のマニュアルの通りにやればだいたいうまく行くはずですが、一回失敗してel-getから導入しなおしたら治ったみたいなこともあったので、割とハマりやすいと思います。要注意です(つーか正直emacsが面倒くさい。pythonに比べれば)。</p><p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Ftkf.github.io%2Femacs-jedi%2Flatest%2F" title="Jedi.el - Python auto-completion for Emacs — Emacs Jedi 0.2.0alpha2 documentation" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><a href="http://tkf.github.io/emacs-jedi/latest/">Jedi.el - Python auto-completion for Emacs &mdash; Emacs Jedi 0.2.0alpha2 documentation</a></p><br /> <p> とりあえず、el-getが動くようにしておきましょう。</p> <pre class="code" data-lang="" data-unlink>M-x el-get-install RET jedi RET</pre><p> これを打ったら(しばらく時間はかかるけど)そのうちぜんぶ導入終わったというメッセージがミニバッファに出てきますので、その後にinit.elを編集します。</p> <pre class="code" data-lang="" data-unlink>(require &#39;jedi) (add-hook &#39;python-mode-hook &#39;jedi:setup) (setq jedi:complete-on-dot t)</pre><p> で、残念なことにjediはこれだけでは使えず、サーバなるものをpython側に入れないといけません。</p><p> とりあえず、</p> <pre class="code" data-lang="" data-unlink>$ pip install jedi</pre><p> するんですが(当然仮想環境で)、そもそもvenvで仮想環境を組んでいるのでどうしたものか(どう連携させるか)と考え込んでしまいました。virtualenvのやり方は調べると出てくるんですが、venvの場合はググってもよくわかりません。ドキュメントを読んでもさっぱり。</p><p> 思案した結果、「まあいいや、ダメ元でやろう」とpython仮想環境にvirtualenvを導入し(依存があるらしい。他にepcとかも要求されますが、jediと一緒に入ったような気もする)、仮想環境をactivateしたターミナルからemacsを立ち上げて、</p> <pre class="code" data-lang="" data-unlink>M-x jedi:install-server RET </pre><p> してみました。そしたらぜんぶ良い感じにやってくれました。警戒して以下のような2行も書いてみたりしたのですが、けっきょくなくてもそこそこちゃんと動いたので消すかどうか迷い中。</p> <pre class="code lang-lisp" data-lang="lisp" data-unlink><span class="synSpecial">(</span><span class="synStatement">setq</span> jedi:server-command <span class="synSpecial">(</span><span class="synStatement">list</span> <span class="synConstant">&quot;仮想環境をactivateした状態のwhich pythonの結果&quot;</span> <span class="synConstant">&quot;ほげほげ/lib/python3.7/site-packages/jediepcserver.pyみたいなの&quot;</span><span class="synSpecial">))</span> </pre><p> ただし、この2行がないと「仮想環境をactivateしたターミルから立ち上げないとちゃんと動かない」状態になります。それはそれで良いような気もするし、不便といえば不便。まあ、仕組みがよくわからないので触っていません。</p> </div> <div class="section"> <h3>まとめ</h3> <p> 終わってみれば大したことやってないのですが、正直けっこう苦労しました。</p><p> ライトユーザーにはけっこう難しいですが、とにかく環境は揃ったのでがんばります。</p> </div> Wed, 15 May 2019 23:59:45 +0900 hatenablog://entry/17680117127132308093 emacs python 雑記 emacsでpythonを書いているとき「arithmetic error」 https://www.haya-programming.com/entry/2018/04/07/043036 <p> tabキーでインデントしようとすると表題の通りのエラーが出て、インデントできない状況になった。</p><p> ググって出てきたのはここ。</p><p><a href="https://stackoverflow.com/questions/27032218/indentation-not-working-properly-in-emacs-for-python">Indentation not working properly in emacs for python - Stack Overflow</a><br /> </p> <blockquote> <p>Check the value of python-indent-offset. If it is 0, change it M-x set-variable RET python-indent-offset RET 4 RET.</p> </blockquote> <p> この対処法で確かに直った。emacsがインデントの設定を推測しようとして、勝手に変になったということらしい。よくわからない。けど、解決すれば良いや。</p><p> 同じことを繰り返されると面倒なので、init.elにも以下の記述を追加しておく。どうせ空白スペース4つ以外のインデントなんか使わないし。</p> <blockquote> <p>(add-hook 'python-mode-hook<br /> (lambda () (setq python-indent-offset 4)))</p> </blockquote> <p> 根治できたかどうかはわからないが、とにかく解決はした。</p> Sat, 07 Apr 2018 04:30:36 +0900 hatenablog://entry/17391345971632917372 python emacs エラー対処法 【python】flymakeのエラー https://www.haya-programming.com/entry/2018/03/24/204715 <p> 次のようなエラーを吐かれた。</p> <pre class="code" data-lang="" data-unlink>Flymake: Configuration error has occurred while running(***/flymakes ***.py).Flymake will be switched OFF</pre> <div class="section"> <h3>原因</h3> <p> 色々あるらしいけど、今回は文字コード指定をタイポした瞬間エラーが出た。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># coding: UTF-9</span> </pre><p> たぶん、これを書いた瞬間にflymakeが走って「そんな文字コードないよ!解釈できない!」→落ちる、という流れだったんだと思う。</p> </div> <div class="section"> <h3>対策</h3> <p> これも色んなサイトに書いてあることだが、次の設定をemacsの設定ファイルに付け足す。</p> <pre class="code" data-lang="" data-unlink>(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted) (setq flymake-check-was-interrupted t)) (ad-activate &#39;flymake-post-syntax-check)</pre><p> 参考にしたページ:<br /> <a href="http://memo.sugyan.com/entry/20100705/1278306885">flymake&#x306E;syntax-check&#x304C;&#x7570;&#x5E38;&#x7D42;&#x4E86;&#x3057;&#x3066;&#x3082;&#x7121;&#x8996;&#x3059;&#x308B;&#x3088;&#x3046;&#x306B;&#x3059;&#x308B; - &#x3059;&#x304E;&#x3083;&#x30FC;&#x3093;&#x30E1;&#x30E2;</a></p><p> とりあえずflymakeは落ちなくなったが、UTF-9とか書いちゃってもエラー表示してくれる訳ではないので、微妙っちゃ微妙。でもそれに対応させる気概もないのでこれで行く。</p> </div> Sat, 24 Mar 2018 20:47:15 +0900 hatenablog://entry/17391345971628983864 python emacs エラー対処法