vi/Vim: 액션 조합으로 삭제/변경(d/c)할 때 이상한 점

vi/Vim: 액션 조합으로 삭제/변경(d/c)할 때 이상한 점

vi(m)의 일부 동작을 살펴보겠습니다. 샘플라인을 이용했어요

AA BBB

이러한 조사의 주제로서 각 실험에 대해 줄 시작 부분에 커서를 두고 일반 모드에서 시작했습니다. 실험은 일반 모드에서도 종료되며 rX최종 커서 위치를 나타내는 닫기 작업을 추가했습니다 .

tB, fB, w, 4가지 액션을 살펴보세요 3l. 첫 번째는 커서를 이전 공간으로 이동 BBB하고 다른 것들은 첫 번째 공간으로 이동합니다 B. 그건,

tBrX        # AAXBBB
fBrX        # AA XBB
wrX         # AA XBB
3lrX        # AA XBB

이제 문서가 삭제 컨텍스트에서 이러한 이동을 수행하는 방법을 살펴보겠습니다.

  • 윔:

    d{motion}       Delete text that {motion} moves over
    
  • FreeBSD vi(1) 매뉴얼 페이지:

    d motion
        Delete the region of text described by ... motion
    

그래서 이는 삭제와 움직임의 구성에 대한 단순하고 명확한 개념을 표현합니다. 이 시점에서는 삭제 범위가 포함인지 배타인지를 제외한 거의 모든 것이 명확해 보입니다. 이동 후 위치를 삭제할지, 유지할지 여부입니다.

그렇다면독점적인, 위 작업의 접두사를 사용하면 d다음을 모두 제거해야 합니다 X.

dtBrX       # XBBB
dfBrX       # XBB
dwrX        # XBB
d3lrX       # XBB

그렇다면포함됨, 위에 표시된 위치 X도 삭제되므로 최종 위치는 후속 위치입니다. 즉, 또 다른 문자가 삼켜지므로 다음과 같은 결과를 얻습니다.

dtBrX       # XBB
dfBrX       # XB
dwrX        # XB
d3lrX       # XB

이제 어떻게 생겼는지 봅시다실생활:

dtBrX       # XBB
dfBrX       # XB
dwrX        # XBB
d3lrX       # XBB

즉, 구성은 다음과 같습니다.포함됨그러나 처음 두 작업의 경우독점적인후자의 경우! 이것을 설명할 수 있는 원리가 있나요?


또한 cVim 문서에는 로 설명되어 있습니다 Delete {motion} text and start insert. 사양에 따르면 다음 이후에 일반 모드로 돌아가면 다음 cc{motion}<ESC>l같은 효과가 있을 것으로 예상됩니다.d{motion}vim의 `ESC`가 커서를 원래 위치로 다시 이동시키는 이유는 무엇입니까?, <ESC>커서를 왼쪽으로 이동시키는 효과가 있으므로 l일반/삽입 모드를 앞뒤로 통해 위치를 유지하려면 보상이 필요합니다). 거의 다 끝났습니다.

ctB<ESC>lrX # XBB
cfB<ESC>lrX # XB
cw<ESC>lrX  # XBBB
c3l<ESC>lrX # XBB

... c다음과 결합하면 다른 효과만 나타납니다 w. 이 작업은 이전 공백 BBB, 즉 이동된 대상 앞의 문자도 보존합니다! 이 행동의 논리는 무엇입니까?

답변1

d그 자체로는 포괄적이지도 배타적이지도 않습니다. 이것운동예. 각 모션에 대한 도움말은 포괄적인지 배타적인지를 나타냅니다.

                                                       f
f{char}                 To [count]'th occurrence of {char} to the right.  The
                        cursor is placed on {char} |inclusive|.

                                                        t
t{char}                 Till before [count]'th occurrence of {char} to the
                        right.  The cursor is placed on the character left of
                        {char} |inclusive|.
<S-Right>       or                                      <S-Right> w
w                       [count] words forward.  |exclusive| motion.

l               or                                      l
<Right>         or                                      <Right> <Space>
<Space>                 [count] characters to the right.  |exclusive| motion.

자세한 내용은 다음을 참조하세요.:h inclusive.

즉, 구성에는 처음 두 악장은 포함되지만 마지막 두 악장은 제외됩니다! 이것을 설명할 수 있는 원리가 있나요?

f와 는 t포괄적 w이고 배타적 이라고 볼 수 있습니다 l.


w 와 함께 사용하면 c다른 효과가 있습니다. 이 작업은 이전 공백도 보존합니다 BBB.

이는 문서에도 언급된 특별한 경우입니다. 조금 더 아래를 보세요:h word:

Special case: "cw" and "cW" are treated like "ce" and "cE" if the cursor is
on a non-blank.  This is because "cw" is interpreted as change-word, and a
word does not include the following white space.

관련 정보