Vim으로 괄호로 묶기
vim에서 일부 텍스트를 괄호 (또는 중괄호)로 묶는 방법이 있습니까?
다른 말로하면, 어떻게 하시겠습니까?
초기 문자열 :
It is sunny outside.
마지막 문자열 :
It is (sunny) outside.
재미있는 메모로, 저는 :w
이 질문을 제출하려고 쳤습니다 .
행복한 vim-ing, SOCommunity!
Surround.vim 이 트릭을 수행해야합니다. '.'로 반복하려면 여기를 참조 하십시오 .
한마디로 다음을 사용했습니다.
bcw()<Esc>P
즉, 단어의 시작 부분으로 이동하여 단어를 잘라내어 삽입 모드로 이동하고 괄호를 입력 한 다음 삽입 모드를 종료하고 단어를 다시 붙여 넣습니다.
이것은 당신의 yank 레지스터를 덮어 쓸 것임을 명심하십시오.
물론 bcw를 필요한 이동 및 선택 유형으로 대체 할 수 있습니다.
5cc{<Enter>}<Esc>P
다음은 Surround.vim을 사용한 예 입니다. vim 일반 모드에서 원하는 단어 (이 경우 맑음) 위에 커서를 놓고 다음을 입력합니다.
ysiw
그런 다음 입력 )
그래서:
초기 문자열 :
It is sunny outside.
마지막 문자열 :
It is (sunny) outside.
추가 공백 : 여는 괄호 또는 대괄호를 사용하여 ysiw(
괄호로 묶고 괄호와 단어의 시작 + 끝 사이에 공백을 두십시오)
비주얼 모드에서 더 쉬움 을 눌러 비주얼 모드로 들어갑니다 v
. 이제를 입력 S(
하면 단어가 공백으로 둘러싸여 있습니다. 그러나 )
대신 에 닫기를 사용하면 S)
공백으로 둘러싸이지 않습니다.
이 모든 브래킷 쌍 환경에 적용 <> [] {} ()
, 단순히에 ()
. 의 행동은 S<
그렇게 만 태그 인클로저를 기대하는 등이다 S>
로 둘러싸 할 수 있습니다 <>
.
더:
컬리에 대해 동일한 작업을 수행하려면 ysiw
다음에 입력하십시오.}
여기에 몇 가지 예를 더 추가 할 수도 있습니다.
입력
cs('
에 [C] hange는 [S]으로부터 (행 urroundings 'cs'(
'주변에서 ()로 변경ds(.
(
[s] 주변을 모두 [d] elete
더 나아가:
그리고 우리가 링크를 클릭하는 것을 막기 위해 Tpope의 나머지 페이지를 인용 해 보는 것은 어떨까요?
// 따옴표 시작 :
예를 들어 설명하는 것이 가장 쉽습니다.
cs"'
안쪽을 누르십시오"안녕하세요!" 그것을 바꾸다
'Hello world!'
-
이제 눌러
cs'<q>
변경하십시오
<q>Hello world!</q>
-
원을 그리려면 누르
cst"
세요.
"Hello world!"
-
구분 기호를 완전히 제거하려면
ds".
Hello world!
-
이제 "Hello"에 커서를두고 키를 누릅니다
ysiw]
(iw는 텍스트 개체 임).
[Hello] world!
중괄호를 만들고 공백을 추가해 보겠습니다 (공백이없는 경우 {대신} 사용).
cs]{
{ Hello } world!
-
이제 전체 줄을
yssb
또는 로 괄호로 묶습니다yss)
.
({ Hello } world!)
-
원본 텍스트로 되돌리기 :
ds{ds)
Hello world!
-
안녕하세요 강조 :
ysiw<em>
<em>Hello</em> world!
-
마지막으로 비주얼 모드를 사용해 보겠습니다. 대문자
V
(선별 시각 모드의 경우) 다음에를 누릅니다S<p class="important">
.<p class="important"> <em>Hello</em> world! </p>
이 플러그인은 HTML 및 XML 편집에 매우 강력하며, 현재 Vim 영역에서 부족한 틈새 시장입니다. (많은 플러그인을 사용할 수있는 HTML / XML 삽입과 반대). 태그 쌍을 동시에 추가, 변경 및 제거하는 것은 매우 쉽습니다.
.
명령이 작동합니다 ds
, cs
그리고 yss
당신이 설치하는 경우 repeat.vim .
그런 종류의 간단한 매핑을 정의 할 수 있습니다. 이것은 그것을해야합니다. 일반 모드에서 z를 입력하여 단어를 괄호로 묶습니다.
:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
Why not use :s//
(search and replace) ?
Eg:
:s/sunny/(&)/
You probably have something else in mind, but I can't tell from your question what it is.
(&
is shorthand for the matched text)
I prefer not to use any plugins and want to keep everything restricted to my dotfiles for easy portability. The easiest way I can think of is to simply record it and replay it. If you plan to use it more often across sessions, you can map the key in your .vimrc as well but I didn't need to (and I'm really bad at figuring out which keystroke to map to).
Assuming you have a novice level understanding of vim, let's say I have a line (for simplicity) that I want to surround with square brackets. e.g.
hello world
Go into normal mode. q1
to start recording. Now do the following
ESC ^i[ ESC $a] ESC
This will leave the current line parenthesized. Now you can choose any line and press @1
to repeat it.
If for example you would want the current word to be paranthesised then simply record and playback the following recipe:
ESC bi[ ESC ea] ESC
You can ofcourse try to optimise for keystrokes but this serves for me for now.
You can use the following commands:
cw(<C-r><C-o>")<ESC>
The advantage is that you can use the dot command for repeat this action for different words. This works for custom encloses too, for example:
Before change:
word
then use the command:
cw\enquote{<C-r><C-o>"}<ESC>
Final result:
\enquote{word}
I know this is an old question, but such a complex solution like this has not been mentioned here yet and I am sure it could help someone. In my .vimrc file I have a line like this:
xnoremap <silent> ( <ESC>:let p = &paste<CR>:set paste<CR>:let a = line2byte(line('.')) + col('.')<CR>gvc()<ESC>:if getregtype() ==# 'V'<CR>call setreg('"', substitute(@", '\n$', '', ''), 'c')<CR>endif<CR>P:exe "goto ".a<CR>:exe "let &paste=".p<CR>
It is enough to select some text in visual mode and to press (
. This mapping works also for linewise and blockwise visual mode.
How does it work?
<ESC>
will quit the visual mode
:let p = &paste<CR>:set paste<CR>...:exe "let &paste=".p<CR>
will make sure that the macro will be executed in paste mode (because autoindent and similar improvements could include some extra spaces we do not want) while paste status after macro will stay the same as before macro was executed
:let a = line2byte(line('.')) + col('.')<CR>
will find the current byte offset (1-based)
gv
will reselect the previously selected text
c
will delete selection and brings us to insert mode to replace the selection
()<ESC>
will put in our desired parentheses and quit insert mode
:if getregtype()==#'V'<CR>call setreg('"',substitute(@",'\n$','',''),'c')<CR>endif<CR>
will remove trailing \n
from unnamed ("
) register and change its type to characterwise, but only if it was linewise before (to make it possible to paste from the registry within the parentheses)
P
will paste previously replaced text within the parentheses
:exe "goto ".a<CR>
will bring cursor back on the previous position (goto
uses 0-based offset, so we do not have to increment previously recorded position by one because of inserted left parenthesis)
For something like this it's probably better to play with ranges and groups than to employ external plugins:
:%s~\v(\w{5}) ~(\1) ~g
the above searches for a 5 letter word followed by a space, groups the match using (), and substitutes it with surrounding parentheses around the grouped match.
참고URL : https://stackoverflow.com/questions/8070892/enclosing-in-parentheses-with-vim
'Program Tip' 카테고리의 다른 글
Devise-이메일을 보내지 않고 확인 된 사용자 계정을 만드시겠습니까? (0) | 2020.12.10 |
---|---|
Android Webview에서 JavaScript가 작동하지 않습니까? (0) | 2020.12.10 |
MKMapView에서 사용자 위치 주변에 반경 1000m의 원을 그립니다. (0) | 2020.12.10 |
Magento 로그 데이터 지우기 (0) | 2020.12.09 |
스레드 세이프 싱글 톤 클래스 (0) | 2020.12.09 |