Почему "эксклюзивная линия" в Emacs используется только для интерактивного использования?
Какая проблема может возникнуть, если функция goto-line
используется в неинтерактивной программе elisp? Его docstring дает предупреждение, говорящее, что:
Эта функция обычно используется неправильно в программе Lisp. Вместо этого вы скорее всего захотите:
(goto-char (point-min)) (forward-line (1- N))
Кроме того, когда я пытаюсь выполнить byte-compile-file
мой файл инициализации, включая goto-line
, я снова получаю неприятное предупреждение:
.emacs:170:19:Warning: `goto-line' used from Lisp code
That command is designed for interactive use only
Использует ли goto-line
в неинтерактивной программе действительно так опасно? Соответственно, почему рекомендуется предлагаемое решение forward-line
?
Ответы
Ответ 1
Во-первых, это предотвращает попадание программистов Elisp в вредные привычки - написание
неэффективный код, ориентированный на ряд строк. то есть вместо использования
(forward-line 1)
вычисление текущего номера строки, увеличение и использование
goto-line
.
Из this статья списка рассылки:
Вкратце, причина, по которой goto-line не должна быть часто используемая команда состоит в том, что, как правило, нет оснований для того, чтобы попасть в линию номер N, если у вас нет программы, которая рассказывала вам что-то интересно на этой линии.
Во-вторых, goto-line манипулирует пользовательской средой в дополнение к перемещению
точка (т.е. push-mark
). Для неинтерактивного использования это может быть не тем, что
вы хотите. С другой стороны, если учесть все это, вы верите
goto-line - это именно то, что вам нужно, а затем просто назовите его следующим образом:
(defun foo ()
(interactive)
(with-no-warnings
(goto-line N)))
И вы не получите никаких предупреждений компилятора.
Ответ 2
в дополнение к тому, что было сказано:
"goto-line", наконец, возвращается к "(форвардная линия (1- строка)", что фактически делает работу. Все остальные из 43 строк командного тела "goto-line" имеют дело с интерактивным использованием. пример с учетом возможно универсального аргумента.
При написании программы соответственно. при его запуске компьютер находится в другом состоянии, чем после интерактивного вызова. Таким образом, вы должны обратиться к этому состоянию, используя "прямую линию" прямо.