Если у вас есть строка, которую вы хотите экранировать, вы можете использовать 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('')
При использовании python-mode.el, можно попытаться измениться py-which-shell
. Чтобы сделать это на основе на файл, можно поместить
# -*- py-which-shell: "python3"; -*-
в первой строке файла - или во второй строке, если первая строка запускается с #!
. Другой выбор состоит в том, чтобы поместить
# Local Variables:
# py-which-shell: "python3"
# End:
в конце Вашего файла. Возможно, необходимо дать полный путь python3 вместо просто "python3".
Ответ - да. Если можно отличить 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
(и т.д.).
Мой комментарий к этому ответу .
Я написал /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.