2

私はEmacsの大物です。今月の初めに Emacs を使い始めました。

小さな Vim スクリプトを Emacs に移植したいと考えています。これらのスクリプトを使用すると、Emacs でもこのように計算できます。

http://www.youtube.com/watch?v=yDR0dTPu6M4

下記のVimスクリプトを移植してみました。

function! s:ExecPySf_1liner()
    let l:strAt = getline(".")
    call writefile([strAt], "temp.pysf")

    let l:strAt = system("python -u -m sfPP -fl temp.pysf")
    if @0 == 0
        let @0 = l:strAt
    else
        let @0 = l:strAt
    endif

    let @" = @0
    if match(&clipboard, "unnamed") >= 0
        let @* = @0
    endif
    echo @0
endfunction         

しかし、私は疲れ果てました。次のコードを書き留めるのに丸3日を費やしました。

(defun ExecPySf_1liner ()
    (let (  (strAt
             (buffer-substring-no-properties (point-at-bol) (point-at-eol))
            )
         )
    ) 
)

Emacsに次のアクションを実行させたいです。

1 read one line under the cursor.
2 write down the one line string into temp.pysf file in current directory
3 execute "python -u -m sfPP -fl temp.pysf" in a shell.
4 display the returned calculated string in echo arear
5 and copy the string in the clipboard to enable a user to past the calculated result.

対応する elisp 関数またはコードを教えてください。

前もって感謝します

===============================

こんにちはクリス。以下のようにコードを修正しました。

(defun __getLineOmittingComment ()
    "Get position after ';;' string. If there is no ;; then return line-beginning-posiion"
    (interactive)
    (goto-char (line-beginning-position))
    (let (( posAt (search-forward ";;" (line-end-position) t) ))
     (if (equal posAt nil) (line-beginning-position) posAt)
    )
)

(defun ExecPySf_1liner()
    "Evaluates the current line in PythonSf, then copies the result to the clipboard."
    (interactive)
    (write-region (__getLineOmittingComment) (line-end-position) "temp.pysf" nil)

    (let ((strAt
           (shell-command-to-string "python -u -m sfPP -fl temp.pysf" )
         ))
        (message strAt)
        (kill-new strAt)))

ExecPySf_1liner() は以下のようにルジャンドル記号を計算します: http://en.wikipedia.org/wiki/Legendre_symbol

import sympy as ts; Lgndr=lambda a,b:(lambda c=a%b:0 if ts.gcd(c,b)!=1 else 1 if any((c-k^2)%b==0 for k in range(1,b//2+2)) else -1)(); [Lgndr(3,p) for p in ts.primerange(3,100)] 
===============================
[0, -1, -1, 1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, -1, 1, -1, 1]

IPython を見る必要があります。これらすべてを実行するEmacsモードが付属しています

あなたの意見は理解できます。しかし、Python ワンライナーは関数型プログラミングであり、ワンライナーで完成するという事実を見逃してしまうかもしれません。if then else 構文を使用しないためです。ラムダ関数を使用する必要があり、def 関数を使用しないでください。これらは厳密には参照透過的ではありませんが、elisp スクリプトと同様に関数型プログラミングです。そして数学の問題は、上のルジャンドル記号のような関数型プログラミングスタイルで書きやすいです。

IPython はメモを Matlab、Mathematica として保存でき、それらを再利用できます。しかし、メモの内容は全体的にもつれています。ふつうの人は、くだらない表現をたくさんしたあとに、価値ある表現を書きます。そして価値のある表現は、多くの場合、いくつかの前向きな表現に依存しています。そして依存表現をまとめるのが面倒。そのため、メモはもつれたままでした。

1年経って、貴重な表現を再利用しようと思っても、メモの内容を忘れてしまい、貴重な表現の再利用が難しくなります。全体として詳細を覚えなければならないからです。

しかし、各 Python ワンライナーはそれだけで完成します。数年後でも簡単に再利用できます。Python ワンライナーは関数型プログラミングであるため、簡単にマージできます。

Python のワンライナーは、IPython の Python 式よりも簡単に処理できる場合があります。


あなたの elisp コードを修正することから、多くのことを学びました。私はelispの恋人になります。そして、Vim スクリプトよりも elisp に慣れるかもしれません。どうもありがとう。

================================================== =============================

IPython を見る必要があります:)。これらすべてを実行する Emacs モードが付属しています。:) ? あなたの意見は理解できます。しかし、TO USE Emacs AS IPython は TO USE IPython AS Emacs よりも優れていると主張します。

数学用に Python を少し拡張しました。sfPP.py はプリプロセッサで、次のコードのようにワンライナーを変更します。sfPP.py が print 命令を追加するので、「print」と書く必要はありません。

' xy"' in 'abcd"xy"efg'
===============================
False

type __tempConverted.py
from __future__ import division
# -*- encoding: utf-8 -*-
from pysf.sfFnctns import *
setDctGlobals(globals())
from pysf.customize import *
if os.path.exists('./sfCrrntIni.py'):
    from sfCrrntIni import *
rightSideValueAt__= ' xy"' in 'abcd"xy"efg'
print "==============================="
print rightSideValueAt__
putPv(rightSideValueAt__, '_dt')

'"xy"' in 'abcd"xy"efg'
===============================
True

(このコード例は、私が一時的なワンライナー ファイルをあえて使用する理由も示しています。Smart Chris はその理由を理解しています。)

以下のように、Emacs で Python のソース コードを簡単に見ることができます。

source(np.source)
In file: C:\Python27\lib\site-packages\numpy\lib\utils.py

def source(object, output=sys.stdout):
        snipped
    import inspect
    try:
        print >> output,  "In file: %s\n" % inspect.getsourcefile(object)
        print >> output,  inspect.getsource(object)
    except:
        print >> output,  "Not available for this object."

===============================
None

あなたはIPythonを見るべきです私はIPythonのyoutubeビデオを見てきました:記事を書くためにビットごとに詳細なIPython:「IPythonとしてVim/Emacsを使用する」

Emacs を IPython として使用することに同意しますか?


最後の質問。承認ボタンを押したい。しかし、私はそれがどこにあるのかわからない。「この投稿は役に立ちましたか? はい/いいえボタン」はそうではないかもしれません。

4

2 に答える 2

3

これが私が作り上げたものです:

(defun get-current-line ()
  (buffer-substring-no-properties (line-beginning-position)
                                  (line-end-position)))

(defun run-python-command (str)
  (shell-command-to-string
   (concat "/usr/bin/env python -u -m sfPP -c "
           (shell-quote-argument (concat "print(" str ")")))))

(defun eval-line-in-python ()
  "Evaluates the current line in python, then copies the result to the clipboard."
  (interactive)
  (let ((str (run-python-command (get-current-line))))
    (message str)
    (kill-new str)))

で実行できますM-x eval-line-in-python

一時ファイルを使用せず、行を直接評価するように変更しました。それでも一時ファイルを書きたい場合は、簡単な変更です。

于 2013-02-09T04:26:29.220 に答える
0

これに出くわした他の人のために、@Chris Barrett を変更して、python によって改行が追加されないようにしましたprint。また、何らかの理由でモジュールをインポートすると-m moduleコマンドが出力を返さなくなったので、リテラルコマンド内でモジュールをインポートします。

(defun run-python-command (str)
  (shell-command-to-string
   (concat "/usr/bin/python -c "
           (shell-quote-argument (concat "from myutils import *; import sys; sys.stdout.write(" str ")")))))
于 2013-09-20T10:04:10.297 に答える