2016-03-11 2 views
0

Я хочу создать команду, в которой регион отправлен, если активен, а если нет, текущий оператор строки/вычисляется, а точка переходит к следующему оператору.emacs elisp send line if no region active python-mode

Я начал с This solution. Теперь я не могу заставить (python-shell-send-region) работать, хотя я не знаю, как передать начало и конец региона.

До сих пор у меня есть это:

(defun my-python-send-region (&optional beg end) 
    (interactive) 
    (if (use-region-p) 
     (python-shell-send-region) (let ((beg (cond (beg beg) 
        ((region-active-p) 
        (region-beginning)) 
        (t (line-beginning-position)))) 
     (end (cond (end end) 
        ((region-active-p) 
        (copy-marker (region-end))) 
        (t (line-end-position))))) 
    (python-shell-send-region beg end) 
    (python-nav-forward-statement)))) 

(add-hook 'python-mode-hook 
     (lambda() 
    (define-key python-mode-map "\C-cn" 'my-python-send-region))) 

UPDATE: С Andreas' и предложения Legoscia, я изменил структуру немного.

Теперь я получаю ошибку (Invalid функция: (SETQ бек (точка)) для:

(defun my-python-send-region (&optional beg end) 
    (interactive) 
    (if (use-region-p) 
    (python-shell-send-region (region-beginning) (region-end)) 
    ((setq beg (point)) 
    (python-nav-end-of-statement) 
    (setq end (point)) 
    (python-shell-send-region (beg) (end))) 
    (python-nav-forward-statement)))) 

Однако, это работает:

(defun my-python-send-region (&optional beg end) 
(interactive) 
(setq beg (point)) 
(python-nav-end-of-statement) 
(setq end (point)) 
(python-shell-send-region beg end)) 
+1

Отправка региона или строки подвержена ошибкам из-за чувствительности Pythons WRT. Скорее используйте команды, описывающие формы Python в блоке отправки точки, инструкции, независимо. –

ответ

2

Альтернативный подход, который мог бы работать, чтобы попытаться пакетом всей линии или-области от melpa. Этот пакет настраивает все так, что если вы вызываете команду, которая ожидает регион, но ни один регион не определен, он будет в основном устанавливать область, которая равна текущей строке. По сути, это вызывает команды, которые ожидают, что регион будет работать, если ни одна область не определена в текущей строке. У меня есть это в моем init.org файле

Allow region oriented commands to work on the current line if no region is defined.

#+BEGIN_SRC emacs-lisp 
    (use-package whole-line-or-region 
     :ensure t 
     :diminish whole-line-or-region-mode 
     :config 
     (whole-line-or-region-mode t) 
     (make-variable-buffer-local 'whole-line-or-region-mode)) 
+0

он не двигается на одну линию вперед, но я могу исправить это, записав быстрый макрос, когда я его много использую – TNT

1

В этой части:

(if (use-region-p) 
    (python-shell-send-region) 

Вам необходимо передать начало и конец области до python-shell-send-region. Он получает эти значения автоматически при вызове в интерактивном режиме. При вызове его из Лиспа кода, вам необходимо передать значения в явном виде:

(python-shell-send-region (region-beginning) (region-end)) 
1

Обновленный ответ: питон-оболочка-посыла не определение функции, всегда передают текущее утверждение/линия (it is not meant to do that), поэтому я заменил его функции от elpy

(defun python-shell-send-region-or-line nil 
    "Sends from python-mode buffer to a python shell, intelligently." 
    (interactive) 
    (cond ((region-active-p) 
    (setq deactivate-mark t) 
    (python-shell-send-region (region-beginning) (region-end)) 
) (t (python-shell-send-current-statement)))) 

(defun python-shell-send-current-statement() 
"Send current statement to Python shell. 
Taken from elpy-shell-send-current-statement" 
(interactive) 
(let ((beg (python-nav-beginning-of-statement)) 
    (end (python-nav-end-of-statement))) 
(python-shell-send-string (buffer-substring beg end))) 
(python-nav-forward-statement)) 

Я использую cond для, если в случае, если я хочу добавить случаи. Установка деактивации-метки - это отменить выбор региона, если он выбран. Если ни один регион не выбран, я также просматриваю инструкцию python.

+0

Когда я использую это без активной области, я получаю ошибку: «Неверное количество аргументов: (1. 1), 0 – TNT

+0

«неправильный номер arg ...» был из строки конца строки в предыдущем ответе, для которого нужен аргумент nil. В обновленном ответе все функции удалены. –

+0

Это очень приятно - единственный глюк теперь заключается в том, что он перескакивает вперед, даже если выбран регион, что может заставить вас пропустить часть вашего кода, если вы продолжаете постоянно. – TNT

Смежные вопросы