줄의 끝으로 계속 이동


9

키 바인딩의 기본 설정은 C-a/C-e한 가지에 불과합니다. 줄의 시작 / 끝으로 이동하십시오.

  1. 줄 끝이 아닌 경우 줄 C-e끝으로 가고 그렇지 않으면 다음 줄 끝으로갑니다
  2. 줄의 시작이 아닌 경우 줄의 시작으로 C-a이동하고 그렇지 않으면 다음 줄의 시작으로 이동합니다.

요점은 C-a/e손가락을 움직이지 않고 모든 라인의 시작 / 끝으로 가도록 계속 타격 할 수 있다는 것 C-n/p입니다.

접두사 ( C-u)를 사용하면 반대 방향으로 줄의 시작 / 끝으로 이동합니다.


@kaushalmodi 아래의 답변에 대한 의견에서 귀하의 질문을 잘못 해석했을 수 있습니다. 당신이 하시겠습니까 C-a가서 "위로"와 C-e"아래로"이동? 즉, "다음 줄"의 의미는 항목 1과 2에서 동일합니까?
콘스탄틴

@Constantine 이 질문을 게시 할 때 실제로 " C-a위로 및 C-e아래로"문제에 대해 생각했지만 누군가 defun같은 솔루션을 제공하면 C-a"위" 를 좋아하면 어떻게해야할지 알 것입니다 ..
CodyChan

확인; 나는 여전히 고칠 가치가 있다고 생각합니다. 답변을 업데이트하겠습니다. 한 줄만 변경하면됩니다.
Constantine

답변:


11

이 동작을 가능하게하는 패키지는 모르지만 여기에는 한 가지 방법이 있습니다.

보도 C-h k C-a것을 발견 할 수있는가 C-a에 바인딩 move-beginning-of-line; 이것은 우리가 수정해야하거나- "이동 시작"부분을 구현하기 위해 사용하는 기능입니다. 마찬가지로을 C-h k찾을 수 forward-line있으며 위 / 아래로 이동하는 데 사용됩니다.

함수를 키에 바인딩하려면이를 명령 으로 만들어야 하므로 interactive특수 양식 을 사용해야합니다 ( 대화식 사용 참조 ). 테이크 위해 C-u접두사 인수를 우리는 필요한 "P"코드 문자를.

이것을 bolp(줄의 시작 부분에 eolp체크 )와 ( 줄 의 끝에 체크 )와 결합하면 다음과 같이 쓸 수 있습니다.

(defun my-move-beginning-of-line (arg)
  (interactive "P")
  (when (bolp) (previous-line (if arg -1 1)))
  (move-beginning-of-line nil))

(defun my-move-end-of-line (arg)
  (interactive "P")
  (when (eolp) (forward-line (if arg -1 1)))
  (move-end-of-line nil))

이제 리 바인드 C-a하고 다음 C-e을 호출 할 수 있습니다 .

(global-set-key [remap move-beginning-of-line] #'my-move-beginning-of-line)
(global-set-key [remap move-end-of-line] #'my-move-end-of-line)

또한, 하나는 수 조언을 추가move-beginning-of-line하고 move-end-of-line.


이것은 정말 좋은 설명이며 우아한 해결책입니다. my-move-beginning-of-line기능에 오타가 있습니다. (previous-line (if arg -1 1))또는 (forward-line (if arg 1 -1))(1과 -1이 전환되어야 함)?
Kaushal Modi

@kaushalmodi : 질문 1과 2 모두 "다음 줄"이라고 말하는데, "다운"이라고 해석했습니다. 질문의 저자에게 물어 보자! :-)
Constantine

아, 나는 OP의 질문에 내 자신의 가정을 추가했다. 당신이 바로, 그는로 이동합니다 지정 않습니다되어 다음 중 하나를 사용하는 경우 라인 C-a이나 C-e.
Kaushal Modi

@ kaushalmodi : 당신이 옳았다는 것이 밝혀졌습니다! 나는 C-a"위" 가되도록 답변을 업데이트했다 .
Constantine

8

라이브러리 misc-cmds.el는 오랫동안이 기능을 가지고 있습니다.

관련 명령 및 제안 된 키 바인딩 (이 바인딩은에서 이루어짐 setup-keys.el)입니다.

(cond ((fboundp 'move-beginning-of-line)
       (substitute-key-definition 'move-beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'move-end-of-line 'end-of-line+ global-map))
      (t
       (substitute-key-definition 'beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'end-of-line 'end-of-line+ global-map)))
(when (boundp 'visual-line-mode-map)
  (define-key visual-line-mode-map [remap move-beginning-of-line] nil)
  (define-key visual-line-mode-map [remap move-end-of-line]       nil)
  (define-key visual-line-mode-map [home] 'beginning-of-line+)
  (define-key visual-line-mode-map [end]  'end-of-line+)
  (define-key visual-line-mode-map "\C-a" 'beginning-of-visual-line+)
  (define-key visual-line-mode-map "\C-e" 'end-of-visual-line+)))

C-h f end-of-line+예를 들면 다음과 같습니다 .

end-of-line+ is an interactive compiled Lisp function in
`misc-cmds.el'.

It is bound to C-e, end.

(end-of-line+ &optional N)

Move cursor to end of current line or end of next line if repeated.
This is similar to `end-of-line', but:
  If called interactively with no prefix arg:
     If the previous command was also `end-of-line+', then move to the
     end of the next line.  Else, move to the end of the current line.
  Otherwise, move to the end of the Nth next line (Nth previous line
     if N<0).  Command `end-of-line', by contrast, moves to the end of
     the (N-1)th next line.

매우 우아합니다.
sanityinc

1

다음 두 기능은 원하는 작업을 수행합니다.

(defun move-beginning-of-line-or-previous (&optional pre)
  "Move to the start of the line. If we are already at the start
of the line, move to the start of the previous line or, if called 
with a prefix argument, the next line."
  (interactive "P")
  (let* ((pos (point)))
    (move-beginning-of-line nil)
    (if (= (point) pos)
        (if pre
            (next-line)
          (previous-line)))))

(defun move-end-of-line-or-next (&optional pre)
  "Move to the end of the line. If we are already at the end of
the line, move to the end of the next line or, if called with a 
prefix argument, the previous line."
  (interactive "P")
  (let* ((pos (point)))
    (move-end-of-line nil)
    (if (= (point) pos)
        (if pre
            (previous-line)
          (next-line)))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.