我是 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 语法。他们必须使用 lambda 函数,而不是使用 def 函数。虽然它们不是严格透明的引用,但它们是函数式编程,就像 elisp 脚本一样。并且数学问题很容易用函数式编程风格编写,如上勒让德符号。
IPython 可以将他们的笔记保存为 Matlab、Mathematica,您可以重复使用它们。但是笔记的内容整体上是纠结的。普通人在写了很多很烂的表情之后,才写出有价值的表情。而有价值的表达式在很多情况下依赖于一些前向表达式。将依赖的表达式放在一起很麻烦。所以这张纸条很纠结。
一年后,当你想重新使用有价值的表达时,你会忘记笔记的细节,很难重新使用有价值的表达。因为你必须把细节作为一个整体来记住。
但是每个 Python 单行代码本身都是完整的。即使在几年后,您也可以轻松地重复使用它们。您可以轻松地合并 Python 单行代码,因为它们是函数式编程。
与 IPython 中的 Python 表达式相比,您可能更容易处理 Python 单行语句。
我从修改您的 elisp 代码中学到了很多东西。我成为了一个elisp情人。而且我可能比 Vim 脚本更熟悉 elisp。非常感谢。
==================================================== ==============================
你应该看看 IPython :)。它带有一个 Emacs 模式,可以完成所有这些以及更多工作。:) ?我能理解你的意见。但我声称将 Emacs 用作 IPython 比将 IPython 用作 Emacs 更好。
我为数学稍微扩展了 Python。sfPP.py 是一个预处理器,它将单行代码更改为以下代码。您不需要编写“打印”,因为 sfPP.py 添加了打印指令。
' 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
(这个示例代码也说明了为什么我敢使用临时单行文件。聪明的克里斯会明白其中的原因。)
您可以在 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 in-depth by bits 写一篇文章:《Use Vim/Emacs as IPython》
你同意我将 Emacs 用作 IPython 吗?
最后一个问题。我想按下接受按钮。但我不知道它在哪里。“这个帖子对你有用吗?是/否按钮”可能不是那个。