세로로 쓰는 법?


22

내 문서에 다음과 같은 텍스트를 만들고 싶다고합시다.

%
%            Not Important
%    O ------------------------->
%    |
%  S |
%  o |
%  m |
%  e |
%    |
%  M |
%  s |
%  g |
%    |
%    V

각 줄에 각 문자를 수동으로 삽입하지 않고도 "Some Msg"를 위와 같이 쉽게 세로로 작성하는 방법이 있습니까?


5
당신은 평소와 같이 텍스트를 작성 하고 개행 :s/./% \0\r/을 추가 할 수 있습니다 %... 그러나 훌륭한 해결책은 아니지만 ...
Martin Tournoij

좋은 해결책입니다. 지금 사용하겠습니다 감사합니다.
Allan Hasegawa 님이

답변:


16

정말 좋은 해결책은 아마도 더 많은 작업이 필요할 것이지만 "나쁘지 않은"것은 달성하기가 어렵지 않습니다.

생각

각 캐릭터 다음에 한 줄 아래로 이동하기 만하면되므로 InsertCharPre자동 명령 을 통해 그렇게하겠습니다 !

암호

디렉토리의 .vimrc일부 파일에 넣거나 더 나은 파일 로 넣으십시오 plugin/.

" enters insert mode to write vertically
function! VertStart()
    augroup Vert
        autocmd!
        " handles each entered character and moves cursor down
        autocmd InsertCharPre * call feedkeys("\<left>\<down>", 'n')
        autocmd InsertLeave * call VertEnd()
    augroup END

    inoremap <BS> <Up><Del>
    startinsert
endfunction

" cleans up on leaving insert mode
function! VertEnd()
    iunmap <BS>
    augroup Vert
        autocmd!
    augroup END
endfunction

" command to start writing vertically
command! Vert call VertStart()

용법

:Vert세로로 쓰기 시작하려면 명령을 입력하십시오 . 삽입 모드를 나가면이 "모드"가 자동으로 비활성화됩니다. 물론이 명령을 자주 사용해야하는 경우 바로 가기에 매핑 할 수 있습니다.

알려진 문제

  1. 삽입 모드를 통해 나가면 세로 쓰기가 비활성화되지 않습니다 Ctrl-C(이것은 발생하지 않는 이벤트 Ctrl-C와 관련하여 약간 이상한 방식으로 구현 된 결과 InsertLeave이므로 키를 사용하면주의해야합니다).

1
알려진 문제 # 1에 대한 반박 :로 삽입 모드를 종료해서는 안됩니다 <C-C>.
tommcdo

@tommcdo, 나는하지 않지만 거기에 있다면 누군가가 그것을 사용합니다. 약어 확장을 피하는 것이 실제로 유용합니다 InsertLeave.이 키에 대해 왜 트리거되지 않는지 궁금 합니다.
xaizek

1
<C-C>삽입 모드를 종료하는 좋은 방법으로 거부 추세를 조장한다고 가정 합니다. 당신이 언급 한 방식은 때로는 좋은 방법임을 암시 할 수 있습니다. "주의 사항 : 컴퓨터의 플러그를 뽑아서 Microsoft Word를 닫으면 문서가 저장되지 않습니다."라고 말하는 것과 같습니다.
tommcdo

@tommcdo 이런 식으로 들릴 것이라고 생각하지 않았습니다. <C-C>문제의 원인에 대한 메모를 추가했습니다 . 약어 확장을 억제하는 삽입 모드를 유지하는 다른 방법을 알지 못합니다.없는 <C-C>경우 적어도 같은 매핑의 일부로 유용합니다 inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
xaizek

나는 약어를 고려하지 않았습니다. 그것은 좋은 지적입니다. 도움말에서 <C-C>약어를 확장하지 않고 삽입 모드를 종료 하는 것으로 설명하는 곳을 찾았으며 InsertLeave이벤트를 트리거하지 않는 방법에 대한 언급이 없습니다 . 내장 된 방법이 있는지 궁금합니다.하지만 지금은 매핑이 좋습니다.
tommcdo

4

평소와 같이 입력 한 후 Vim에서 다음과 같이 대체를 사용하여 현재 가로 텍스트를 세로로 변환 할 수 있습니다 (현재 행에 적용됨).

:s/\(.\)/\1\r/g

또는 기억하기 쉬운 방법은 모든 명령에 대해 다음 명령 중 하나를 실행하는 것입니다.

:%!fold -w1
:%!grep -o .

현재 줄 이상을 적용하려면을 앞에두고 V필요한 경우 더 많은 줄의 영역을 확장 한 다음 위를 실행하십시오 (하지만 제외 %).

Windows의 PowerShell의 경우 fold 대체를 확인 하십시오 .

간단한 키 매핑을 정의하려면 (예 :) F2다음을 시도하십시오.

:nnoremap <F2> V:!fold -w1<CR>

그런 다음 무언가를 입력하고를 눌러 F2텍스트를 세로로 만듭니다.


다른 대안은 자동 단어 줄 바꿈을 설정하는 것입니다.

:set tw=1 " textwidth
:set formatoptions+=t

공백이 허용하는 한 자동으로 텍스트를 1 자에 가깝게 줄 바꿈합니다. 단점은 각 문자 뒤에 공백이 있어야한다는 것입니다. 따라서 누르는 것과 거의 동일합니다.Enter


1
대신에 기능적으로 동일한 것을 :s/\(.\)/\1\r/g사용할 수 있습니다 :s/./\0\r/g.
와일드 카드

1

나는 당신이 푸른 달에서 한 번 이상 그 일에 관심이 있다면 매크로가 특이한 일을하는 멋진 방법이라는 것을 알았습니다. 다음 테이블이 있다고 가정 해 봅시다.

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    V

그리고 이제 교체 할 가정 해 봅시다 Some Msg으로 Other Message. 먼저 추가 문자 (마지막 줄 앞에 :)에 대한 테이블을 확장합시다 yy5p.

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

내가 올 매크로는 이전 텍스트를 바꾸면서 텍스트를 가로에서 세로로 변환하는 것을 처리합니다. 첫 번째 위치에 텍스트를 입력하여 시작하십시오 (커서가 끝에 있음 Other Message).

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  SOther Message |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

다음 매크로를 기록하십시오.

  • qq: 매크로 기록 시작 q
  • ^: 줄의 시작으로 이동
  • 3l: 텍스트를 놓을 열로 이동
  • x: 오래된 캐릭터를 삭제
  • l: 이전 문자 대신 메시지에서 한 문자 만 남기고 오른쪽으로 이동합니다.
  • v: 시각 모드로 이동
  • f|:로 이동 |
  • 2h: 두 글자 뒤로 이동
  • d: 컷 선택
  • j: 아래로 이동
  • P: 커서 앞에 붙여 넣기
  • q: 매크로 기록 종료

이 시점에서 당신은 :

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  other Message | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

매크로를 여러 번 반복하십시오 (예 : 문자 수이지만 미리 알 필요는 없습니다. 과소 평가 한 다음 견적이 얼마나 가까운 지 확인한 후에 계속하십시오). 그럼 함께 가자 10@q. 당신은 얻는다 :

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%   ge |
%    |
%    |
%    V

좋아, 하나 더 ( @q) :

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%  g |
%   e |
%    |
%    V

커서가 이제 마지막에 e있습니다. 매크로는 마지막 글자와 잘 작동하지 않습니다 (만족스러운 결과를 위해 시도한 @q다음 u취소 할 수 있음). X백 스페이스의 경우 직접 조정하면 됩니다.


아주 좋아요 매크로는 vim에 들어가는 길입니다. 나의 빠른 시도는 본질적으로 당신과 동일했습니다; qq03lxldt|i ^[jPxq@q
와일드 카드

@Wildcard, 난 공감 할 수 있습니까?
Shahbaz

1
하아! 내 마음을 미끄러 뜨렸다. 나는 생각했다. :)
와일드 카드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.