공백이 아닌 문자에 도달 할 때까지 세로로 이동하려면 어떻게합니까?


27

(정확하게) 들여 쓰기 된 코드가있는 매우 긴 파일에서는 들여 쓰기를 제한하는 커서 위 또는 아래의 텍스트 줄로 직접 이동하는 것이 도움이 될 수 있습니다.

(이 작업을 수행하는 한 가지 방법은 현재 들여 쓰기 수준을 접는 방식으로 들여 쓰기 폴드 방법을 사용하는 것입니다. 들여 쓰기 수준을 제한하는 줄을 커서에서 멀어 j지거나 k멀어지게 만듭니다). 관심있는 들여 쓰기 작업을 할 수있었습니다.)

다음 예를 밑줄로 표시된 커서,이다 _(정의 사이의 두 번째 문자 열에서 class Bazzclass Qux)하지만 내 단락이나 행의 수 있다고 가정 module들 또는 미지 변수 :

module Foo
  # lots of code...
end

module Bar
  class Baz
    # ...
  end

  class Bazz
    # lots of code...
  end
 _
  class Qux
    # ...
  end

  class Quux
    # lots of code...
  end
end

... 어떻게 빨리로 이동 수 omodule Bar커서 위, 또는 nend맨 마지막 줄에 커서 아래? 수직 열에는 공백이 포함되지만 class정의 사이의 두 번째 열에는 문자가 없습니다 .


2
관련 : Vim Tips에서 "같은 들여 쓰기로 다음 / 이전 줄로 이동"Wiki vim.wikia.com/wiki/Move_to_next/…
alxndr

g와 방향키를 누르면 탭을 피하고 선을 가로 질러 이동할 수 있습니다.
SibiCoder

1
@alxndr 링크의 솔루션은 공백이 제대로 유지되지 않고 (예 : 공백 만있는 임의의 줄이있는 경우) 공백을 무시하려는 경우를 제외하고는 잘 작동합니다. 아래의 superjer의 해결책은 그 경우에 관심이 있다면 더 좋습니다.
nukeguy

답변:


9

이 기능은 어떻습니까?

function FloatUp()
    while line(".") > 1
                \ && (strlen(getline(".")) < col(".")
                \ || getline(".")[col(".") - 1] =~ '\s')
        norm k
    endwhile
endfunction

당신은 nnoremap gU :call FloatUp()<CR>( gU"go up"을 위해) 그리고 나서로 호출 할 수있다 gU.

여기에 설명이 있습니다 :

  • 코드는 반복 (와, 커서를 이동하는 norm k만큼 같은) while조건을 보유하고 있습니다.
  • while이 첫 번째 행 (아닌 경우 상태 유지 line(".") > 1중) 및
    • 이 줄은 너무 짧습니다 (아마 비어 있음). 또는
    • getline(".")현재 열 ( [col(".") - 1]) 에서 현재 행 ( )의 문자 는 공백입니다 ( =~ '\s'즉, 공백 패턴과 일치).

1
이것은 완벽하고 신속하게 작동하는 것처럼 보이며 쉽게 FloatDown함수로 수정됩니다 . 내 .vimrc에 감사합니다! github.com/alxndr/dotfiles/commit/0e25a302
alxndr

1
이 솔루션이 비주얼 모드에서 작동하지 않는다는 것을 발견했습니다 (비주얼 모드에 따라 약간 다른 동작, 동일한 위치에 머 무르거나 한 줄만 움직입니다). 무슨 일이 일어나고 있는지에 대한 조언이 있습니까?
alxndr

13

Vim의 정규 표현식에는 특정 가상 열 번호와 같이 검색 할 수있는 엄청난 양의 항목이 있기 때문에 검색을 사용하는 것이 좋습니다.

nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>

nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>

cd내려가거나 올라갈 때 사용하십시오 cu. 나는 여기에서 "열"과 "열"을 생각하고 있습니다. 나는 이것이 기본적으로 no-ops라고 거의 100 % 확신합니다. 또는 자신의 매핑을 선택하십시오.

탭 또는 공백 또는 둘 다를 사용하는지 여부에 관계없이 작동합니다.


1
해당 명령을 구문 분석하는 데 문제가 있습니다. 조금 확장 해 주시겠습니까?
davidlowryduda

1
/ 또는? \ % xv는 가상 열 번호 'x'(으)로 검색하도록 제한합니다.이 경우 'x'는 virtcol 명령을 실행하고 삽입하는 '<CR> = virtcol ( ".") <CR>'입니다. 커서가 표현식에있는 가상 열 번호이며 \ S는 공백이 아닌 문자를 의미합니다.
차드

1
차드를 설명해 주셔서 감사합니다. 삽입 모드 나 명령 줄 모드에서 <CR>을 추가하여 레지스터의 내용을 가져옵니다. =레지스터는 대신에 식을 계산 식 레지스터입니다. 조금 이상하게 보이지 않으면 매우 편리합니다.
superjer February

1
이 방법의 한 가지 단점은 검색 강조 표시를 설정 한 경우 커서의 세로 열에있는 모든 문자가 이제 "열 위로"또는 "열 아래로"강조 표시된다는 것입니다.
alxndr

3
기존 검색을 보호하려면 앞에 추가 :let searchbak=@/<CR>하고 추가 할 수 있습니다 :let @/=searchbak<CR>. 그러나이 시점에서 길고 접근하기 어려워지고 아마도 함수 일뿐입니다.
superjer February

7

JumpToVerticalOccurrence 플러그인 (기본적으로 ]|and에 매핑 됨)을 사용할 수 있습니다 [|. 처럼 ]V{char}작동 f하지만 수직으로 작동하는 다른 것은 거의 없습니다 . 물론 필요에 따라 다시 매핑 할 수 있습니다.


당신이 플러그인을 사용하지 않으려면, 당신은 사용하려고 할 수 있습니다 :searchvirtcol(.)예 :

:call search('\%' . virtcol('.') . 'v\S', 'bW')

어디에:

  • virtcol('.') 현재 열을 제공합니다.
  • \S 공백이 아님
  • bW 후진 검색 용

:help search자세한 내용을 확인하십시오 .

사용하기 쉽도록 다음과 같이 매핑 할 수 있습니다.

:map <C-k> :call search('\%' . virtcol('.') . 'v\S', 'bW')<CR>
:map <C-j> :call search('\%' . virtcol('.') . 'v\S', 'W')<CR>

코드는 괄호가 포함 된 경우 또는, 사용 %(예를 일치하는 사이에 점프 {, }, [, ], 등) 또는 전체 단락 (점프 사용 {, }함께 Shift필요한 경우).


링크 / 소스 :


보낸 사람 :h search(): w의미 wrap around the end of the fileW수단 don't wrap around the end of the file. 그런데 왜 두 번째에 그것들을 합쳤 :map습니까?
Jair López

@JairLopez Correct, w거기에 있으면 안됩니다. 그래서 제거했습니다. 감사합니다. 아마도 나는 모션 키의 의미로 혼란 스러웠습니다.
kenorb


2

그것은 수직 운동이 아니기 때문에 정확하게 요구 한 것이 아니지만 비슷하고 빠르며 충분히 좋은 것입니다 .2 단락 뒤로 이동합니다 {{. 이것은 바로 직전의 줄로 당신을 데려 갈 것 module Bar입니다.


2
커서와 최상위 module줄 사이에 알 수없는 줄과 단락이 있다고 상상해보십시오 . (특히,이 상황은 최근에 들여 쓰기는했지만 빈 줄은없고 모듈 정의의 외부 컨텍스트를 찾으려고 수
천줄

단락으로 점프하는 것이 내가 선호하는 이동 방법이지만 옵션은 아닙니다. 전체 파일은 하나의 "단락"이었습니다.
alxndr


1

나는 그것을 위해 내 자신의 플러그인 move_until_char_changes.vim 을 사용합니다.

gK와에 매핑합니다 gJ.

공백이 아닌 현재 열에서 동일한 문자로 여러 줄을 건너 뛰며 문자열이 반복되는 로그 파일이나 SQL 덤프에 유용합니다.

기본적으로 "검색"문자를 선택하기 전에 먼저 한 줄씩 이동합니다.

두 번 사용하지 않으면 비주얼 모드에서 작동하며 선 또는 블록 방식의 비주얼 모드가 아닙니다 ... (수정 환영!)


1

여기에 답변으로 표시되지 않기 때문에 편집superjer가 매우 유사한 것을 언급 한 것으로 나타났습니다 . 간단하게 / 또는? 수색.

예를 들어, 다음과 같이 두 번째 열에서 공백이 아닌 문자를 아래쪽으로 검색 할 수 있습니다.

/\%2v\S

고장은 다음과 같습니다.

/    "search downward (use ? for upward movement)
\%2v "for the following char in the 2nd virtual column
\S   "any non white space character

그런 다음 일반 연산자를 사용하여 검색을 반복 할 수 있습니다.

주제에 대한 자세한 내용은 :help \%c및을 참조하십시오 :help \%v.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.