질문
Magit에서 사용되는 것과 비슷한 팝업 메뉴 , 팝업 메뉴의 형태로 사용자 인터페이스를 만들고 싶습니다 .
풍모
팝업의 정의
이 질문의 맥락에서 팝업 은 사용자가 이러한 항목 중 하나만 선택할 수 있도록 메뉴 항목 모음이 포함 된 임시 창을 거의 의미하지 않습니다.
화면상의 위치
팝업은 화면의 어느 부분 에나 표시 될 수 있지만, 명확해야하고 현재 활성화 된 창 옆에 표시되는 것이 바람직합니다.
팝업 버퍼의 내용
항목은 예쁜 테이블 형태로 표시되어야합니다. 꽤 시각적 호소력 질문 수단의 상황이며, 이러한 효과는 쉽게 직선 열로 메뉴 항목을 넣어 달성 할 수있다 참조
complete--insert-string
, 예를 들어. 이 단락은 추가 설명을 위해 제공되며, 자신의 방식으로 할 수 있으므로 대답이 잘못되지 않습니다.
메뉴 항목 선택
선택은 단일 키 누르기 또는 선택적으로 마우스를 사용하여 수행 될 것으로 예상됩니다 (중요하지는 않지만 마우스를 지원하지 않는 제안을 포함하는 답변은 합법적입니다). 마우스를 지원하는 솔루션을 제안하는 경우 사용자는 직관적 인 방법으로, 즉 원하는 선택을 마우스 왼쪽 버튼으로 클릭하여 메뉴 항목을 선택할 수 있어야합니다.
NB 마우스는 다양한 방법으로 사용될 수 있으며 선택을 나타내는 다른 방법도 환영합니다.
팝업 제거
사용자가 위에서 설명한 방식으로 메뉴 항목을 선택하면 버퍼와 해당 창을보기에서 제거하고 종료해야합니다. 팝업 메뉴를 호출하기 전에 활성화 된 창에 다시 포커스가 있어야합니다 (즉, 활성화됩니다).
반환 값과 인수
바람직하게는, 이러한 동작의 결과는 Lisp 객체가 반환되게해야한다. Lisp 오브젝트는 다음 중 하나 일 수 있습니다.
nil
— 이것은 사용자가 C-g또는 †를 눌러 팝업 메뉴를 중단했음을 나타냅니다 .string
— string (기호를 사용할 수 있음)은string-equal
실제 항목의 모음으로 팝업 메뉴에 제공된 문자열 중 하나에 있어야 합니다.
나머지 프로그램에 사용자의 선택 또는 부재 여부를 알리는 대체 방법이 허용됩니다. 그러나 다른 방법으로 수행 할 수 있는지 확실하지 않은 경우 모든 응답자에게 즉흥적으로 요청 하고이 측면에 대한 추가 설명을 요구하지 않습니다.
이것은 모두 반환 값입니다. 입력 매개 변수의 경우 가능한 선택 항목 (메뉴 항목)을 나타내는 문자열 모음을 적어도 포함해야합니다.
허용되는 답변
예상 답변은 다음과 같은 형식 일 수 있습니다.
교육받은 독자가 위에서 설명한 것과 같은 기능을 작성할 수있는 충분한 코드 스 니펫; 전체 작업 기능을 작성해야 할 필요는 없습니다. 그러나 불확실성을 피하려면 (코드의 상당 부분을 생략 할 수 있습니까?) 스 니펫의 누락 된 부분은 텍스트의 답변 구성 요소로 설명해야합니다.
유사한 기능을 구현하는 기존 라이브러리에 대한 링크입니다. 불확실성을 피하기 위해 필자 의 경우 와 유사 하다는 것은 라이브러리가 위에서 설명한 2 개 또는 3 개의 기능을 가진 팝업 을 생성하는 데 사용될 수 있음을 의미 한다는 점에 유의해야합니다 . 제안 된 도서관이 이전에 언급 된 조건을 충족 할 수없는 지점과 다른 경우, 그러한 각 사례는 독립적으로 판단되며 OP가 유용하다고 판단되면 항상 찬성됩니다.
내장 기능 Emacs 기능 또는 타사 기능에 대한 설명은«기능»섹션에 설명 된 기능을 구현하는 데 사용할 수 있습니다 (위 참조). 피하기 불확실성, 당신의 대답은 구현하려는 미래의 독자를 위해 유용 할 수 있습니다 명확하게하는 방법하시기 바랍니다 상태 팝업 , Magit에 사용되는 것과 유사한 팝업 메뉴를 .
† 팝업 메뉴를 중단하는 다른 방법은 다음과 같습니다 (이에 국한되지는 않음).
팝업 메뉴 창의 외부를 클릭;
선택하지 않고 팝업이 포함 된 버퍼를 종료합니다.
magit-popup
. 새 패키지는transient
이며 현재 버전의에서 사용됩니다magit
. 설명서는 magit.vc/manual/transient 를 참조하십시오 .