Оба Python 2 и 3 в Emacs

Если у вас есть строка, которую вы хотите экранировать, вы можете использовать String.prototype.charCodeAt()

. Если у вас есть код с экранами, вы можете просто оценить их, чтобы получить оригинал строка. Если это строка с буквальными экранами, вы можете использовать String.fromCharCode()

  • Если у вас есть '\x32\x20\x60\x78\x6e\x7a\x9c\x89' и хотите "2 `xnz", тогда
    '\x32\x20\x60\x78\x6e\x7a\x9c\x89' == "2 `xnz"
    
  • Если у вас есть '\\x32\\x20\\x60\\x78\\x6e\\x7a\\x9c\\x89', который является литеральной строкой со значением \x32\x20\x60\x78\x6e\x7a\x9c\x89, вы можете проанализировать ее, передав десятичное значение каждой пары шестнадцатеричных цифр на String.prototype.fromCharCode()
    '\\x32\\x20\\x60\\x78\\x6e\\x7a\\x9c\\x89'.replace(/\\x([0-9a-f]{2})/g, function(_, pair) {
      return String.fromCharCode(parseInt(pair, 16));
    })
    
    . Альтернативно, eval является если вы можете быть уверены в безопасности ввода и производительности, не важно 1 .
    eval('"\\x32\\x20\\x60\\x78\\x6e\\x7a\\x9c\\x89"')
    
    Обратите внимание на ", вложенный в ', окружающий входную строку. Если вы знаете, что это программа, и это из надежного источника, вы можете eval строку напрямую, что не даст вам ASCII, но будет выполнять сама программа.
    eval('\\x32\\x20\\x60\\x78\\x6e\\x7a\\x9c\\x89')
    
    Обратите внимание, что введенный вами вход не является программой, и вызов eval не работает.
  • Если у вас есть "2 `xnz" и хотите '\x32\x20\x60\x78\x6e\x7a\x9c\x89', тогда
    "2 `xnz".split('').map(function(e) {
      return '\\x' + e.charCodeAt(0).toString(16);
    }).join('')
    

17
задан 1 February 2009 в 21:32
поделиться

3 ответа

При использовании python-mode.el, можно попытаться измениться py-which-shell. Чтобы сделать это на основе на файл, можно поместить

# -*- py-which-shell: "python3"; -*-

в первой строке файла - или во второй строке, если первая строка запускается с #!. Другой выбор состоит в том, чтобы поместить

# Local Variables:
# py-which-shell: "python3" 
# End: 

в конце Вашего файла. Возможно, необходимо дать полный путь python3 вместо просто "python3".

10
ответ дан 30 November 2019 в 13:46
поделиться

Ответ - да. Если можно отличить Python 2 от Python 3, то это - Простой Вопрос Программирования, чтобы заставить emacs делать то, что Вы хотите.

(define run-python (&optional buffer)
    (with-current-buffer (or buffer (current-buffer))
        (if (is-python3-p)
              (run-python3)
            (run-python2))))

(define-key python-mode-map (kbd "C-c C-c") #'run-python)

Все это оставляют сделать, реализовать is-python3-p и run-python3 (и т.д.).

4
ответ дан 30 November 2019 в 13:46
поделиться

Мой комментарий к этому ответу .

Я написал /t/min.py, который будет нормально работать в python3, но не в python2 (понимание словаря работает в python3)

Содержимое /t/min.py

#!/usr/bin/python3
# -*- py-python-command: "/usr/bin/python3"; -*-
a = {i:i**2 for i in range(10)}
print(a)

Обратите внимание, что shebang указывает на python3 и локальная переменная файла py-python-command.

Я также написал /t/min-py.el, который гарантирует, что python-mode.el (версия 5.1.0) используется вместо python.el.

Содержимое /t/min-py.el

(add-to-list 'load-path "~/m/em/lisp/")
(autoload 'python-mode "python-mode" "Python Mode." t)
;; (setq py-python-command "python3")

Обратите внимание, что последняя строка закомментирована.

Я запускаю emacs с помощью следующей команды:

emacs -Q -l /t/min-py.el /t/min.py &

Теперь emacs запускается с моим альтернативным dotemacs / t / min-py .el, и он открывает /t/min.py.

Когда я нажимаю Cc Cc для отправки буфера на python, он говорит, что часть «for» неверна, и это указывает на то, что python2 используется вместо python3. Когда я нажимаю Cc! чтобы запустить интерпретатор python, он говорит, что python 2.5 запущен.

Я могу даже изменить вторую строку /t/min.py на это:

# -*- py-python-command: "chunkybacon"; -*-

и повторить этот эксперимент еще раз, а emacs все еще использует python2.

Если последняя строка / t / min-py.el не закомментирован, то Cc Cc и Cc! оба используют python3.

3
ответ дан 30 November 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: