vim : 하위 매크로에서 오류 후 매크로를 계속 하시겠습니까?


15

vim을 사용하여 일부 소스 코드를 아름답게하는 과정에 있습니다. {1}

개별 단계를 수행하는 몇 가지 vim 매크로를 만들었습니다. 후행 공백 제거, 뒤에 빈 줄 {제거, 빈 줄 앞에 제거 {, 그런 종류의 것들.

이제 모든 개별 매크로를 순서대로 실행하는 매크로를 만들고 싶습니다. 그러나 첫 번째 재귀 매크로가 종료되면 (더 이상 일치하는-> 일치 오류를 찾을 수 없으므로) "래퍼"매크로도 종료됩니다.

하위 매크로가 오류를 생성 한 후 vim 매크로를 계속 사용하는 방법이 있습니까?

{1} 나는 알고 자동 reformatters에 대해. 현재 문제에 사용할 수도 있습니다. 나는 단지 예제를 위해 소스 재 포맷을 언급했다. 이 소스 미화 또는 그에 대한 답변을 게시 하지 마십시오 . 문제는 코드 재 형식화 자체 가 아니라 vim 매크로에 관한 것입니다.

예:

  • 매크로 1-후행 공백 제거- qw/\s\+$d$@wq
  • 매크로 2-전에 빈 줄을 삭제}- qe/\n\n *}dd@eq
  • 래퍼 매크로-리타 빙, 매크로 1, 매크로 2- qr:retab@w@eq

래퍼를 실행할 때 @r--다시 탭하고 더 이상 공백이 발견 될 때까지 매크로 1을 실행 한 다음 종료합니다 ( 매크로 2 실행 하지 않고 ).

설명:

내가 찾고있는 것은 하위 매크로를 호출하여 하위 매크로가 종료 될 때 호출 매크로가 계속되는 방법입니다.

답변:


12

:try하위 매크로 오류를 "흡수"하는 데 사용 하는 것이 좋습니다 .

다음은 어리석은 예입니다.

:let @a='f|dt|@a'
:let @q=':try|exe "norm! @a"|endtry^Mj0@q'
@q

래퍼 매크로는 다음과 같습니다.

let @r=':retab^M:try|exe "norm! @w"|endtry|try|exe "norm! @e"|endtry^M'

garyjohn하지에 대한 해결 방법을 제공하는 동안 가진 submacro에 오류, 이것은 실제로 않는 유일한 해답 처리 와 같은 오류가. 그래도 사과해야합니다. 나는 당신이 (현재 만료 된) 현상금을 얻기 위해 정시에 답변을 확인하지 않았습니다 ... :-(
DevSolar

26

실패한 명령이 패턴을 찾지 못하는 대체 인 경우

:%s/foo/bar/

foo버퍼에 존재하지 않는, 당신은 추가 할 수 있습니다 e그 오류를 무시하는 플래그를, 예를 들면,

:%s/foo/bar/e

보다

:help :s_flags

Vim에 일부 : ex 명령의 오류를 무시하도록 지시 할 수 있습니다 :silent!. 보다

:help :silent


질문에 예를 추가 한 후 편집

매크로 1과 매크로 2는 모두 재귀 적이며 재귀를 종료하기위한 명시적인 메커니즘이 없습니다. 내 생각에 무제한 재귀에 대한 Vim의 내부 테스트 중 하나가 트리거되어 오류가 발생합니다. 매크로 1이 이러한 오류를 생성하는 경우 해당 오류는 바로 다음에 래퍼 매크로 실행을 종료합니다 @w.

내 제안은 매크로를 : ex 명령으로 다시 작성하고 실행되는 행의 범위를 제한하여 매크로가 실행되는 횟수를 제한하는 것입니다. 예를 들면 다음과 같습니다.

qw:%s/\s\+$//^Mq
qe:%s/\n\n *}/\r}/^Mq

여기서 ^MEnter 또는 Return 키를 입력해야합니다. 래퍼 매크로에서 이들을 함께 테스트하지는 않았지만 내가 저지른 실수를 해결할 수 있다고 생각합니다.


내 경우에는 대체가 아니라 간단한 찾기 (즉, /foo)입니다. 하지만 :silent!실제로 래퍼 매크로를 중단하지 재귀 submacro의 속임수를 썼는지, 지금 submacro는 전혀 종료되지 않습니다 ... 그리고 나는 어떻게 든 다시 종료하게하는 것은 다시 너무 래퍼 매크로를 종료 할 것이라고 생각한다. 내가 붙어있는 것 같습니다. :-\
DevSolar

사용중인 매크로 나 동일한 문제를 나타내는 간단한 예를 보지 않고 무엇이 잘못되었는지 말하기는 어렵습니다.
garyjohn

예를 추가했습니다.
DevSolar

2

나를 위해 일한 것은 @Peter Rincker와 @garyjohn 답변의 조합이었습니다. 별도로 나는 계속 이상한 문제를 겪었다.

nnoremap <leader>rt :silent! %s/\s\+$//e<CR>
let @r='\rt'
let @t=':try|silent! exe "norm! @r"|endtry|w^M'

나는 생각 silent!<leader>rt,와 사이에 파이프 문자 endtry와는 w열쇠했다 - 단순히 후 줄 바꿈 가진 endtry실패했습니다. try들 난 그냥 그들을 입력 줄 때 작동하지만 매크로로 실행하면 검색 텍스트에 대한 오류가 제기되고 계속 것입니다 찾을 수 없습니다.


1

많은 파일에서 반복적 인 작업을 수행해야 할 때 일상적으로 매크로를 즉석에서 만듭니다. 필자의 경우 NERDtree ( http://www.vim.org/scripts/script.php?script_id=1658 )가 VIM에 설치되어 vsplit창 을 만들고 왼쪽에는 모든 파일 목록이 있습니다. 현재 디렉토리 예를 들어, MY_TEST파일 에서 문자열의 첫 번째 인스턴스를 찾은 다음 CUSTOM_PREFIX-해당 행에서 레이블이 붙은 접두사를 삭제 하고 파일을 저장 한 후 다음으로 이동해야합니다.

이 매크로가 현재 디렉토리에있는 약 2000 개의 파일에서 작동하는 방법은 다음과 같습니다. 이를 위해 bash 스크립트를 작성할 수는 있지만 VIM에서는 더 빠릅니다. +나타낸다 키를 누르는 SIMUL

# Start recording a macro sequence to register 'A'

q,a

# Search silently for the string "MY_TEST"; DO NOT report an error
# if the string could not be found.
:silent! /MY_TEST


# Replace, on just the current line, the string "CUSTOM_PREFIX-", with
# nothing (ie: delete it), and suppress any warning messages if the
# string could not be found on the current line.
:s/CUSTOM_PREFIX-//e


# Now issue some UI commands. CTRL-W then and arrow key lets you hope
# between tabs/splits/windows within vim.

CTRL+ W,

# Scroll down to the next file in the list in NERDtree



# Open the next file

ENTER

# End the macro

q

# Run the macro a thousand times in VIM

1000 @,a

도움이 되었기를 바랍니다!

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