Những lệnh Vim nào có thể được sử dụng để trích dẫn / bỏ qua các từ?


204

Làm cách nào tôi có thể nhanh chóng trích dẫn / bỏ qua các từ và thay đổi trích dẫn (ví dụ từ từ 'đến ") trong Vim? Tôi biết về plugin Surround.vim , nhưng tôi chỉ muốn sử dụng Vim.


Một giải pháp thực sự phụ thuộc vào bối cảnh. Bạn có muốn làm điều đó chỉ trên một dòng, hoặc trong toàn bộ tệp hoặc chỉ cho một chuỗi trích dẫn không?
Lucas Oman

Đối với một từ duy nhất hoặc tất cả các từ trong một dòng. Ví dụ: khi chuyển đổi các từ đã dán sang chuỗi ký tự.
Eugene Yarmash

Câu trả lời:


251

Surround.vim sẽ là câu trả lời dễ nhất của bạn. Nếu bạn thực sự không muốn sử dụng nó, đây là một số ví dụ cho những gì bạn có thể làm. Không nhất thiết là hiệu quả nhất, nhưng đó là lý do tại sao Surround.vim được viết.

  • Trích dẫn một từ, sử dụng dấu ngoặc đơn
    ciw'Ctrl+r"'
    • ciw - Xóa từ con trỏ đang bật và kết thúc ở chế độ chèn.
    • ' - thêm trích dẫn đầu tiên.
    • Ctrl+r"- Chèn nội dung của thanh "ghi, còn gọi là yank / xóa cuối cùng.
    • ' - thêm trích dẫn kết thúc.

  • Bỏ yêu cầu một từ được đặt trong dấu ngoặc đơn
    di'hPl2x
    • di' - Xóa từ kèm theo dấu ngoặc đơn.
    • hP - Di chuyển con trỏ sang trái một vị trí (trên đầu trích dẫn mở) và đặt văn bản vừa xóa trước khi trích dẫn.
    • l - Di chuyển con trỏ sang phải một nơi (trên đầu trích dẫn mở).
    • 2x - Xóa hai dấu ngoặc kép.

  • Thay đổi dấu ngoặc đơn thành dấu ngoặc kép
    va':s/\%V'\%V/"/g
    • va' - Trực quan chọn từ được trích dẫn và dấu ngoặc kép.
    • :s/ - Bắt đầu thay thế.
    • \%V'\%V - Chỉ phù hợp với dấu ngoặc đơn trong khu vực được chọn trực quan.
    • /"/g - Thay thế tất cả bằng dấu ngoặc kép.

1
Những việc này tốt cho tôi. Chỉ cần googled rằng dán trong chế độ chèn cũng có thể với Ctrl + op.
Eugene Yarmash

1
Được sử dụng kết hợp với Chế độ ghi (q), hoạt động như một bùa mê cho các công việc nhanh chóng.
giám mục

Tại sao ciwvà không chỉ cw? Tôi thấy khó hiểu thứ nhất và thứ hai hoạt động tốt.
Big McLUNDHuge

17
@Koveras ciwhoạt động bất kể con trỏ của bạn ở đâu trong từ. cwchỉ hoạt động nếu con trỏ của bạn ở đầu từ. Xem :help iw.
jamessan

10
Chiếm câu trả lời hàng đầu để đưa ra một mẹo nhỏ hay: nếu bạn có một vài từ để thay thế trích dẫn kèm theo trong trích dẫn kép, bạn có thể nhận thấy rằng giải pháp đầu tiên của @jamessan không hoạt động với .lệnh. Để làm cho nó hoạt động, sử dụng ciw' Ctrl+r Ctrl+p". Sau đó .sẽ hành xử như bạn muốn cho từ sau: thay vì nhớ nội dung của thanh ghi, nó sẽ nhớ bạn muốn bất cứ thứ gì trong sổ đăng ký ngay bây giờ (loại khó giải thích, nhưng nếu bạn thử cả hai, nó sẽ trở nên rõ ràng :-))
autra

182

Trích dẫn một từ, sử dụng dấu ngoặc đơn

ciw'Ctrl+r"'

Nó dễ dàng hơn đối với tôi để làm theo cách này

ciw '' Esc P

8
Thật không may, điều đó dường như không cho phép. (nói lại).
Wil Moore III

2
Tôi thích điều này vì tôi có thể sử dụng nó trên các thiết bị đầu cuối / thay thế bằng chế độ vim vì Ctrl + r thường được sử dụng cho tìm kiếm lịch sử ngược.
krock

3
@wilmoore Ghi lại ở trên dưới dạng macro, sau đó phát lại.
Christopher

30

Đây là một số ánh xạ có thể giúp:

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P

Nếu bạn chưa thay đổi biến ánh xạ, thì hãy kích hoạt ánh xạ với \q" \q'hoặc \qd. Họ thêm trích dẫn kép quanh từ dưới con trỏ, trích dẫn đơn quanh từ dưới con trỏ, xóa bất kỳ trích dẫn nào xung quanh từ dưới con trỏ tương ứng.


Ý tưởng tuyệt vời Tôi đã kết thúc việc thêm map <Leader>' gewi'<Esc>A'<Esc>vào .vimrctập tin của mình để chèn các bình luận trích dẫn từ vị trí hiện tại đến cuối dòng; đã giúp tôi trong khi chuyển đổi một số tập lệnh MSDOS sang bash.
ILMostro_7

@Geoff, nó hoạt động tốt cho dấu ngoặc đơn. nhưng đối với dấu ngoặc kép, nó inster `` "" "` trước từ
RameshVel

@RameshVel Có thể bạn đã có một số macro của riêng bạn đã ảnh hưởng đến phía bên phải của ánh xạ. Tôi đã cập nhật lệnh ánh xạ lên nnoremap để các ánh xạ khác không được mở rộng. Tôi cũng đã cải thiện ánh xạ. Những cái trước có vấn đề khi con trỏ ở từ đầu tiên trên một dòng.
Geoff Reedy

Điều này cũng có thể dễ dàng điều chỉnh cho chế độ trực quan để bao quanh một lựa chọn với dấu ngoặc kép, ví dụ :vnoremap <leader>q c""<esc>P.
Dominik

27

Ngoài các lệnh khác, lệnh này sẽ bao gồm tất cả các từ trong một dòng trong dấu ngoặc kép (theo nhận xét của bạn)

:s/\(\S\+\)/"\1"/

hoặc nếu bạn muốn giảm số lượng dấu gạch chéo ngược, bạn có thể đặt công cụ \vsửa đổi (rất ma thuật) ở đầu mẫu

:s/\v(\S+)/"\1"/

Văn bản sao chép của tôi cũng có dấu phẩy, vì vậy tôi mới đổi sang đây:s/\v([a-Z]+)/"\1"/g
tsukimi

22

Những cách vĩ mô!

  1. nhấn qqđể ghi vào thanh ghi q (chúng tôi sử dụng "q" làm phím tắt để ghi nhớ "dấu ngoặc kép").

  2. nhấn shift+ bdi chuyển con trỏ đến trước từ hiện tại

  3. iloại báo chí '(một dấu ngoặc đơn)

  4. nhấn escrồi nhấn eđể di chuyển đến cuối từ

  5. nhấn asau đó nhấn 'một lần nữa để bao quanh từ với dấu ngoặc kép.

  6. nhấn escđể vào chế độ bình thường.

  7. cuối cùng nhấn qđể ghi vào qsổ đăng ký.

Cách sử dụng

  1. Di chuyển con trỏ đến một từ mong muốn.
  2. Nhấn @qđể bao quanh một từ có dấu ngoặc kép.
  3. Nhấn @@nếu bạn muốn lặp lại nó thành một từ khác.

Bạn có thể thay đổi step 4với bất cứ điều gì bạn thích {một dòng, một từ cho đến khi tìm thấy một số ký tự, v.v.).

Ghi vĩ mô liên tục

  1. mở .vimrc
  2. đi đến cuối tập tin
  3. thay đổi chế độ chèn. gõ cái này để làm cho nó bền bỉ:
hãy để @ q = ' ctrl+ r ctrl+ rq'
  1. lưu và thoát

  2. mở tập tin của bạn, đi đến một số từ

  3. Bây giờ bấm @q

nếu bạn làm đúng, những điều kỳ diệu sẽ xuất hiện trong lời nói của bạn.

Bạn có thể thực hiện các bước này cho các macro khác mà bạn yêu thích.


3
Phải nói tôi thích giải pháp này. Không có Surround.vim cần thiết và dễ dàng gọi và tạo các macro. Cũng có thể dễ dàng sử dụng cho bất cứ điều gì khác mà bạn cần (ví dụ như tôi trích dẫn từ hiện tại cho đến cuối dòng, hoàn hảo cho câu trả lời). Để hiển thị macro, hãy thực hiện: "qp. Để lưu nó, hãy truy cập .vimrc và do: let @q = 'macro nội dung' (chỉ để hoàn chỉnh)
th3penguinwhisperer

Tôi thích nó rất nhiều. Bạn cũng có thể lồng các macro này. Vì vậy, bạn có thể ghi vào sổ đăng ký j @q wvà sau đó bạn có thể gói các ntừ tiếp theo bằng dấu ngoặc kép bằng n@j.
tên người dùng ẩn

1
Tôi đã thêm một số bước để làm cho macro bền bỉ.
Brain90

1
Pedantic, nhưng, word và WORD khác nhau ở Vim. Shift + b = B, vì vậy, bước 2 lý tưởng nên được thay đổi thành "... phía trước WORD hiện tại". Tuy nhiên, nếu bạn có nghĩa là bắt đầu từ, bạn không cần sử dụng Shift.
Ambareesh

Cảm ơn vì điểm đó. Tôi sử dụng shift + b có chủ ý để đối phó với WORD. Macro nên chạy trong word hoặc WORD [0]. Trên thực tế bước 3 cũng nên thay đổi sang shift + e. [0] stackoverflow.com/a/14390568
4321959

18

Để gói trong dấu ngoặc đơn (ví dụ) ciw'<C-r>"'<esc>hoạt động, nhưng lặp lại sẽ không hoạt động. Thử:

ciw'<C-r><C-o>"'<esc>

Điều này đặt nội dung của thanh ghi mặc định "theo nghĩa đen". Bây giờ bạn có thể nhấn .vào bất kỳ từ nào để bọc nó trong dấu ngoặc kép. Để tìm hiểu thêm xem :h[elp] i_ctrl-rvà biết thêm về các đối tượng văn bản tại:h text-objects

Nguồn: http://vimcasts.org/episodes/pasting-from-insert-mode/


2
Mẹo tuyệt vời! Nếu bất cứ ai muốn lập một bản đồ ra khỏi điều này, ký hiệu thích hợp là ciw'<C-R><C-O>"'<Esc>.
chiếu

<Cr> "chính xác làm gì?
CodeCrack

@CodeCrack Đó là CTRL-R. CTRL-R chèn nội dung của thanh ghi vào con trỏ và ở chế độ chèn.
Erwin Rooijakkers

Điều này có thể lặp lại như bạn đã đề cập, nhưng khi được lưu trữ trong một macro, lặp lại macro với .sẽ viết lại nội dung của cuộc gọi thực tế cuối cùng.
Sbu

7

Đối với người dùng VSCodeVim, bạn có thể làm

vwS"

  • Bạn có thể thay thế "bằng bất cứ thứ gì bạn muốn bọc.
  • Bạn có thể thay thế wbằng bất kỳ toán tử lựa chọn nào khác

2
Điều này cũng hoạt động tốt với tôi trên MacVIM nhưng tôi đã phải sử dụng từ viwS'này để kết thúc từ trong dấu ngoặc đơn. Cho đến nay dễ nhất.
Matt Grannary

Điều này chỉ hoạt động nếu bạn đang ở đầu từ. Nếu bạn muốn làm điều đó từ bất cứ nơi nào trong từ, bạn có thể làm:viwS"
geoyws

6

Tôi không biết bất kỳ lệnh vim dựng sẵn nào cho việc này, nhưng sử dụng r"f'r"để thay đổi từ 'thành "và r'f"r'thay đổi từ" thành "hoạt động nếu bạn đứng trên đầu tiên' hoặc". Lệnh r'thay thế bất kỳ ký tự nào nằm dưới con trỏ của bạn bằng ', và f"di chuyển bạn về phía trước ".


1
Giải pháp "thủ công" trực quan nhất với tôi. Thay vì lệnh thay thế thứ hai ( 'r"r), bạn chỉ có thể nhập .Và nếu bạn muốn thay đổi thêm dấu ngoặc kép ;,đưa bạn đến lệnh tiếp theo hoặc trước đó khi chúng lặp lại f/F/t/Ttìm kiếm cuối cùng theo cùng hướng hoặc ngược lại.
Endre Cả

5

Thêm dấu ngoặc kép

Tôi bắt đầu sử dụng chức năng nhanh và bẩn này trong .vimrc:

vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>

function! QuickWrap(wrapper)
  let l:w = a:wrapper
  let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
  normal `>
  execute "normal " . inside_or_around . escape(w, '\')
  normal `<
  execute "normal i" . escape(w, '\')
  normal `<
endfunction

Vì vậy, bây giờ, tôi chọn trực quan bất cứ điều gì tôi muốn (thường là thông qua viw- chọn trực quan bên trong từ ) trong dấu ngoặc kép và nhấn Qcho dấu ngoặc kép hoặc nhấn qcho dấu ngoặc đơn.

Xóa dấu ngoặc kép

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

Tôi sử dụng vim-textobj-trích dẫn để vim coi các trích dẫn như một đối tượng văn bản. Điều này có nghĩa là tôi có thể làm vaq(chọn trực quan xung quanh dấu ngoặc kép . Điều này tìm thấy dấu ngoặc kép gần nhất và trực quan chọn chúng. (Đây là tùy chọn, bạn chỉ có thể làm một cái gì đó như f"vww). Sau đó, tôi nhấn sđể loại bỏ dấu ngoặc kép từ lựa chọn.

Thay đổi báo giá

HÔN. Tôi loại bỏ dấu ngoặc kép sau đó thêm dấu ngoặc kép . Ví dụ: để thay thế dấu ngoặc đơn bằng dấu ngoặc kép, tôi sẽ thực hiện các bước: 1. xóa dấu ngoặc đơn : vaqs, 2. thêm dấu ngoặc kép mới : vwQ.



4

Nếu bạn sử dụng plugin vim https://github.com/tpope/vim-surround (hoặc sử dụng plugin VSCode Vim, đi kèm với vim-Surround được cài đặt sẵn), nó rất thuận tiện!

thêm vào

ysiw' // surround in word `'`

rơi vãi

ds' // drop surround `'`

thay đổi

cs'" // change surround from `'` to `"`

Nó thậm chí hoạt động cho các thẻ html!

cst<em> // change surround from current tag to `<em>`

kiểm tra readme trên github để biết ví dụ tốt hơn


2

Dưới đây là một số ánh xạ đơn giản có thể được sử dụng để trích dẫn và bỏ qua một từ:

" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>

1
Sẽ thật tuyệt vời cho mọi người nếu bạn có thể giải thích câu trả lời của mình: cách thêm ánh xạ, cách gọi chúng, v.v ... Cảm ơn.
Carles Alcolea

1
Tôi muốn nói rằng để trích dẫn, trích dẫn gấp đôi và bỏ qua bạn nên làmqw qd wq
nilon

vì một số lý do, trích dẫn kép trả lại trích dẫn thêm ở cuối như "từ" ".
janicebaratheon

@ShuaiWang có lẽ bạn đã cài đặt tự động hoặc một số tiện ích mở rộng tương tự? Loại bỏ lỗi đó đã sửa cho tôi.
Nephilim

2

VIM cho vscode làm điều đó thật tuyệt vời. Nó dựa trên một vim-Surround nếu bạn không sử dụng vscode.

Vài ví dụ:

"kiểm tra" với con trỏ bên trong dấu ngoặc kép cs "'để kết thúc với' kiểm tra '

"kiểm tra" với con trỏ bên trong dấu ngoặc kép kiểu DS "để kết thúc bằng kiểm tra

"kiểm tra" với con trỏ bên trong dấu ngoặc kép cs "t và nhập 123> để kết thúc với kiểm tra <123>

kiểm tra với con trỏ trên loại kiểm tra từ ysaw) để kết thúc với (kiểm tra)


1

Tôi đang sử dụng nnoremap trong .vimrc của tôi

Để trích dẫn một từ:

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

Để xóa dấu ngoặc kép (cũng hoạt động trên dấu ngoặc kép):

nnoremap qs :silent! normal mpeld bhd `ph<CR>

Quy tắc cần nhớ: 'sq' = trích dẫn đơn.


0

Còn cái này thì sao?

 :%s/\'/"/g

2
Lệnh này hoạt động trên toàn bộ tập tin. Tôi chỉ cần thay đổi từ đơn.
Eugene Yarmash

4
Nếu không có %, nó sẽ chỉ hoạt động trên dòng hiện tại trừ khi bạn đã chọn toàn bộ tệp
Emily

0

Tôi đã viết một kịch bản làm điều này:

function! WrapSelect (front)
    "puts characters around the selected text.
    let l:front = a:front
    if (a:front == '[')
        let l:back = ']'
    elseif (a:front == '(')
        let l:back = ')'
    elseif (a:front == '{')
        let l:back = '}'
    elseif (a:front == '<')
        let l:back = '>'
    elseif (a:front =~ " ")
        let l:split = split(a:front)
        let l:back = l:split[1]
        let l:front = l:split[0]
    else
        let l:back = a:front
    endif
    "execute: concat all these strings. '.' means "concat without spaces"
    "norm means "run in normal mode and also be able to use \<C-x> characters"
    "gv means "get the previous visual selection back up"
    "c means "cut visual selection and go to insert mode"
    "\<C-R> means "insert the contents of a register. in this case, the
    "default register"
    execute 'norm! gvc' . l:front. "\<C-R>\""  . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>

Để sử dụng, chỉ cần làm nổi bật một cái gì đó, nhấn control l, và sau đó nhập một ký tự. Nếu đó là một trong những ký tự mà hàm biết, nó sẽ cung cấp ký tự kết thúc chính xác. Nếu không, nó sẽ sử dụng cùng một ký tự để chèn vào cả hai bên.

Surround.vim có thể làm nhiều hơn thế này, nhưng điều này là đủ cho nhu cầu của tôi.


-1

Ví dụ bản đồ chế độ trực quan để thêm các trích dẫn đơn xung quanh một khối văn bản đã chọn:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.