2012-08-04 5 views
20

goto-line 함수가 비대화 형 elisp 프로그램에서 사용되는 경우 어떤 문제가 발생할 수 있습니까? 그 문법은 다음과 같은 경고를 준다 :대화식으로 만 사용하는 Emacs의 "goto-line"은 왜입니까?

이 함수는 일반적으로 Lisp 프로그램에서 사용하는 것은 잘못된 것이다. 당신이 아마 대신 원하는 것은 뭔가 같은 :

(goto-char (point-min)) (forward-line (1- N)) 
또한

, 내가 byte-compile-filegoto-line을 포함하여 내 init 파일을하려고 할 때, 나는 다시 한 번 이런 불쾌한 경고를 얻을 :

.emacs:170:19:Warning: `goto-line' used from Lisp code 
That command is designed for interactive use only 

인가 비 대화 형 프로그램에서 goto-line을 사용하면 정말 위험합니다. 이와 관련하여 제안 된 forward-line 솔루션이 왜 더 좋은 솔루션입니까?

+0

goto-line이 대화식으로 작동하지 않는 방법을 모르는 경우 현재 버퍼의 행으로 이동합니다. –

+0

@JonLin [EmacsWiki : AUCTeX] (http://emacswiki.org/emacs/AUCTeX#toc20) :'th-evince-sync'에서'goto-line'을 비 대화식으로 사용하는 예제를 찾을 수 있습니다. – dkim

+0

event_jr이 (가) 제기 된 질문에 답변했지만, 여전히 * 왜 * 당신이 이것을하려고합니까? 정말로 원하는 것을 성취 할 수있는 더 좋은 방법이있을 수 있습니다. 또한 버퍼가 특정 줄로 좁혀진다면 아마 그것이 생각하는대로하지 않을 것입니다. – scottfrazer

답변

29

먼저 Elisp 프로그래머가 행 번호 중심 방식으로 비효율적 인 코드를 작성하여 나쁜 습관을 갖지 않도록합니다. 즉 (forward-line 1)을 사용하는 대신 현재 줄 번호를 계산하고 증분하여 goto-line을 사용합니다. this 메일 링리스트 기사에서

: 간단히 말해서

, 이유는 왜 고토 줄 자주 사용하는 명령이 정상적으로되지 않는 수 N을 줄을 싶어 할 이유가 없다는 것입니다 안 당신은 뭔가 그 라인에 흥미가 재미 있다고 말한 프로그램이 있습니다.

둘째, 고토 줄 점 (즉 push-mark)를 이동하는 것 외에도, 사용자의 환경을 조작한다. 비대화 형 사용을 위해서는 을 원할 것입니다.

(defun foo() 
    (interactive) 
    (with-no-warnings 
    (goto-line N))) 

을 그리고 당신이 어떤 컴파일러 경고를받지 않습니다 : 모든 간주 한 경우, 다른 한편으로는, 당신은 고토 온라인 당신은 그럼 그냥 같이 호출, 필요한 것을 정확히 생각합니다.

무슨 말을했는지에 추가
+1

+1 포인트 조작을 언급합니다. –

+0

"보통 줄 번호가 흥미롭다고 말한 프로그램이 없다면 줄 번호 N을 얻고 싶을 이유가 없습니다"- 프로그램 (또는 elisp 코드)이 실제로 그 줄에서 흥미로운 점을 계산했다면 어떨까요? ? 그런 다음 해당 줄에서 현재 줄을 빼고 대신 전달 줄을 사용하는 것이 좋습니다. (간단하지만 확실한 것이다.) – ShreevatsaR

6

: 효과 작업을 수행

"고토 라인은"마지막에 다시 발생 "(앞으로 라인 (1 라인)"의 43 개 라인의 다른 모든 ". 예를 들어 보편적 인 논증을 생각해보십시오.

컴퓨터를 실행할 때 프로그램을 작성하면 컴퓨터가 대화식 전화를 사용하지 않고 다른 상태가됩니다. 따라서이 문제를 해결해야합니다. 상태를 "forward-line"을 사용하여 똑바로 켭니다.

+1

Lisp 프로그램에서'goto-line'을 호출 할 때 대화 형 사용을 처리하는'(대화 형 arg-descriptor)'부분은 건너 뛴 것처럼 보입니다. [참조 매뉴얼] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Interactive.html#index-interactive-1253)에서 "명령은 다음과 같은 Lisp 프로그램에서 호출 할 수 있습니다. 다른 함수는 호출자가 인수를 제공하고 _arg-descriptor_는 아무 효과가 없습니다. " – dkim

+0

@dkim 또한 인수의 계산을 넘어서는 코드는 대화식 사용을 처리합니다. 푸시 마크, 스위치 간 버퍼 등이 여전히 있습니다. –