Perintah Vim apa yang dapat digunakan untuk mengutip / berhenti mengutip kata-kata?

204

Bagaimana saya bisa dengan cepat mengutip / berhenti mengutip kata-kata dan mengubah kutipan (misalnya dari 'menjadi ") di Vim? Saya tahu tentang plugin surround.vim , tetapi saya hanya ingin menggunakan Vim.

Eugene Yarmash
sumber
Suatu solusi sangat tergantung pada konteks. Apakah Anda ingin melakukannya hanya pada satu baris, atau di seluruh file, atau hanya untuk satu string yang dikutip?
Lucas Oman
Untuk satu kata atau semua kata dalam satu baris. Misalnya ketika mengubah kata-kata yang ditempel ke string literal.
Eugene Yarmash

Jawaban:

253

surround.vim akan menjadi jawaban termudah Anda. Jika Anda benar-benar tidak ingin menggunakannya, berikut adalah beberapa contoh untuk apa yang dapat Anda lakukan. Belum tentu yang paling efisien, tapi itu sebabnya surround.vim ditulis.

  • Mengutip sebuah kata, menggunakan kutipan tunggal
    ciw'Ctrl+r"'
    • ciw - Hapus kata kursor aktif, dan berakhir dalam mode sisipkan.
    • ' - tambahkan kutipan pertama.
    • Ctrl+r"- Masukkan isi "register, alias tarik terakhir / hapus.
    • ' - tambahkan kutipan penutup.

  • Tanda kutip kata yang dilampirkan dalam tanda kutip tunggal
    di'hPl2x
    • di' - Hapus kata yang dilampirkan oleh tanda kutip tunggal.
    • hP - Gerakkan kursor ke kiri satu tempat (di atas kutipan pembuka) dan letakkan teks yang baru saja dihapus sebelum kutipan.
    • l - Gerakkan kursor ke kanan satu tempat (di atas kutipan pembuka).
    • 2x - Hapus dua kutipan.

  • Ubah tanda kutip tunggal menjadi tanda kutip ganda
    va':s/\%V'\%V/"/g
    • va' - Pilih kata yang dikutip dan kutipan secara visual.
    • :s/ - Mulai pengganti.
    • \%V'\%V - Hanya mencocokkan satu kutipan yang ada dalam wilayah yang dipilih secara visual.
    • /"/g - Ganti mereka semua dengan tanda kutip ganda.
jamessan
sumber
1
Ini bekerja dengan baik untuk saya. Hanya Google yang menyisipkan dalam mode insert juga dimungkinkan dengan Ctrl + op.
Eugene Yarmash
1
Digunakan dalam kombinasi dengan Mode Rekam (q), bekerja seperti pesona untuk pekerjaan cepat.
Uskup
Kenapa ciwdan tidak adil cw? Saya menemukan yang pertama membingungkan dan yang kedua berfungsi dengan baik.
Big McLargeHuge
18
@Koveras ciwbekerja di mana pun kursor Anda berada. cwhanya berfungsi jika kursor Anda berada di awal kata. Lihat :help iw.
jamessan
10
Membajak jawaban teratas untuk memberikan trik kecil yang menyenangkan: jika Anda memiliki beberapa kata untuk menggantikan melampirkan kutipan tunggal dalam kutipan ganda, Anda mungkin memperhatikan bahwa solusi pertama dari @jamessan tidak bekerja dengan .perintah. Untuk membuatnya bekerja, gunakan ciw' Ctrl+r Ctrl+p". Maka .akan berperilaku seperti yang Anda inginkan untuk kata berikut: alih-alih mengingat konten register, ia akan ingat Anda ingin apa pun yang ada di register sekarang (agak sulit untuk dijelaskan, tetapi jika Anda mencoba keduanya, itu akan menjadi jelas :-))
autra
182

Mengutip sebuah kata, menggunakan kutipan tunggal

ciw'Ctrl+r"'

Lebih mudah bagi saya untuk melakukannya dengan cara ini

ciw '' Esc P
installero
sumber
8
Sayangnya, itu sepertinya tidak memungkinkan. (ulang).
Wil Moore III
2
Saya lebih suka ini karena saya bisa menggunakannya pada terminal / repls dengan mode vim karena Ctrl + r biasanya sudah digunakan untuk pencarian sejarah terbalik.
Krock
3
@wilmoore Rekam di atas sebagai makro, lalu putar ulang.
Christopher
30

Berikut beberapa pemetaan yang dapat membantu:

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

Jika Anda belum mengubah variabel pemimpin map, maka aktifkan pemetaan dengan \q" \q'atau \qd. Mereka menambahkan kutipan ganda di sekitar kata di bawah kursor, kutipan tunggal di sekitar kata di bawah kursor, menghapus setiap kutipan di sekitar kata di bawah kursor masing-masing.

Geoff Reedy
sumber
Ide yang luar biasa! Saya akhirnya menambahkan map <Leader>' gewi'<Esc>A'<Esc>ke .vimrcfile saya untuk memasukkan komentar kutipan tunggal dari posisi saat ini ke akhir baris; yang membantu saya saat mengonversi beberapa skrip MSDOS menjadi bash.
ILMostro_7
@ Geoff, itu berfungsi dengan baik untuk tanda kutip tunggal. tetapi untuk tanda kutip ganda itu menanamkan `" "" "` infront dari kata
RameshVel
@RameshVel Mungkin Anda memiliki beberapa makro Anda sendiri yang memengaruhi sisi kanan pemetaan. Saya memperbarui perintah pemetaan ke nnoremap sehingga pemetaan lainnya tidak diperluas. Saya juga memperbaiki pemetaan. Yang sebelumnya memiliki masalah ketika kursor berada pada kata pertama pada suatu baris.
Geoff Reedy
Ini juga dapat dengan mudah disesuaikan untuk mode visual untuk mengelilingi pilihan dengan tanda kutip, misalnya :vnoremap <leader>q c""<esc>P.
Dominik
27

Selain perintah lain, ini akan menyertakan semua kata dalam satu baris dalam tanda kutip ganda (sesuai komentar Anda)

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

atau jika Anda ingin mengurangi jumlah garis miring terbalik, Anda dapat menempatkan \vpengubah (sangat ajaib) di awal pola

:s/\v(\S+)/"\1"/
Matteo Riva
sumber
Teks yang saya salin juga memiliki koma, jadi saya hanya mengubahnya:s/\v([a-Z]+)/"\1"/g
tsukimi
22

Cara makro!

  1. tekan qdan quntuk merekam ke dalam register q (kami menggunakan "q" sebagai jalan pintas untuk mengingat "kutipan").

  2. tekan shift+ bgerakkan kursor ke depan kata saat ini

  3. itipe pers '(satu kutipan)

  4. tekan esclalu tekan euntuk pindah ke akhir kata

  5. tekan alalu tekan 'lagi untuk mengelilingi kata dengan tanda kutip.

  6. tekan escuntuk masuk ke mode normal.

  7. akhirnya tekan quntuk merekamnya menjadi qregister.

Cara Penggunaan

  1. Pindahkan kursor ke kata yang diinginkan.
  2. Tekan @quntuk mengelilingi kata dengan tanda kutip.
  3. Tekan @@jika Anda ingin mengulanginya ke kata lain.

Anda dapat mengubah step 4dengan apa pun yang Anda suka {a line, word hingga menemukan beberapa karakter, dll}.

Buat rekaman makro tetap ada

  1. buka .vimrc
  2. pergi ke akhir file
  3. ubah ke mode insert. ketik ini untuk membuatnya tetap:
let @ q = ' ctrl+ r ctrl+ rq'
  1. Simpan dan keluar

  2. buka file Anda, buka beberapa kata

  3. sekarang tekan @q

jika Anda melakukannya dengan benar, hal-hal ajaib akan muncul dalam kata-kata Anda

Anda dapat melakukan langkah-langkah ini untuk makro lain yang Anda sukai.

Brain90
sumber
3
Harus mengatakan saya suka solusi ini. Tidak ada permintaan surround.vim yang diperlukan dan mudah serta pembuatan makro. Juga mudah digunakan untuk apa pun yang Anda butuhkan (bagi saya misalnya mengutip kata saat ini hingga akhir baris, sempurna untuk memungkinkan). Untuk memperlihatkan makro lakukan: "qp. Untuk menyimpannya buka .vimrc dan lakukan: let @q = 'konten makro' (hanya untuk kelengkapan)
th3penguinwhisperer
Saya sangat suka ini. Anda dapat membuat sarang makro ini juga. Jadi Anda bisa merekam di register j @q wdan kemudian Anda bisa membungkus nkata-kata berikutnya dengan tanda kutip menggunakan n@j.
hidden-username
1
Saya menambahkan beberapa langkah untuk membuat makro persisten.
Brain90
1
Pedantic, tapi, kata dan WORD berbeda di Vim. Shift + b = B, jadi langkah 2 idealnya harus diubah menjadi "... depan KATA saat ini". Namun, jika Anda bermaksud awal kata, Anda tidak perlu menggunakan Shift.
Ambareesh
Terima kasih untuk itu. Saya menggunakan shift + b dengan sengaja untuk berurusan dengan WORD. Makro harus dijalankan dalam kata atau KATA [0]. Sebenarnya langkah 3 juga harus berubah menjadi shift + e. [0] stackoverflow.com/a/14390568/341959
Brain90
18

Membungkus dengan tanda kutip tunggal (misalnya) ciw'<C-r>"'<esc>berfungsi, tetapi mengulang tidak akan berhasil. Mencoba:

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

Ini menempatkan isi register default "secara harfiah". Sekarang Anda dapat menekan .kata apa saja untuk membungkusnya dengan tanda kutip. Untuk mempelajari lebih lanjut, lihat :h[elp] i_ctrl-rdan lebih lanjut tentang objek teks di:h text-objects

Sumber: http://vimcasts.org/episodes/pasting-from-insert-mode/

James Scriven
sumber
2
Tip luar biasa! Jika ada yang ingin membuat pemetaan dari ini, notasi yang tepat adalah ciw'<C-R><C-O>"'<Esc>.
glts
Apa sebenarnya yang dilakukan <Cr>?
CodeCrack
@CodeCrack Ini adalah CTRL-R. CTRL-R menyisipkan isi register pada kursor dan tetap dalam mode insert.
Erwin Rooijakkers
Ini berulang seperti yang Anda sebutkan, tetapi ketika disimpan dalam makro, mengulangi makro dengan .akan menulis ulang konten panggilan aktual terakhir.
Sbu
7

Untuk pengguna VSCodeVim dapat Anda lakukan

vwS"

  • Anda dapat menggantinya "dengan apa pun yang ingin Anda bungkus.
  • Anda dapat mengganti wdengan operator seleksi lainnya
Janac Meena
sumber
2
Ini juga bekerja dengan baik untuk saya di MacVIM tetapi saya harus menggunakan viwS'yang membungkus kata dalam tanda kutip tunggal. Sejauh ini yang termudah.
Matt Grannary
ini hanya berfungsi jika Anda berada di awal kata. Jika Anda ingin melakukannya dari mana saja dalam kata, Anda dapat melakukan:viwS"
geoyws
6

Saya tidak tahu perintah builtin vim untuk ini, tetapi menggunakan r"f'r"untuk mengubah dari 'ke "dan r'f"r'untuk mengubah dari" menjadi' berfungsi jika Anda berdiri di atas yang pertama 'atau ". Perintah ini r'menggantikan karakter apa pun yang ada di bawah kursor Anda dengan', dan f"menggerakkan Anda maju ke depan ".

Håvard S
sumber
1
Solusi "manual" paling intuitif bagi saya. Alih-alih perintah penggantian kedua ( 'rdan "r), Anda bisa mengetik .Dan jika Anda ingin mengubah lebih banyak kutipan, ;dan ,membawa Anda ke yang berikutnya atau sebelumnya karena mereka mengulangi f/F/t/Tpencarian terakhir di arah yang sama atau berlawanan, masing-masing.
Endre Keduanya
6

Menambahkan Kutipan

Saya mulai menggunakan fungsi cepat dan kotor ini di .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

Jadi sekarang, saya memilih secara visual apa pun yang saya inginkan (biasanya melalui viw- secara visual memilih kata dalam ) dalam tanda kutip dan tekan Quntuk tanda kutip ganda, atau tekan quntuk tanda kutip tunggal.

Menghapus Kutipan

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

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

Saya menggunakan vim-textobj-quotes sehingga vim memperlakukan tanda kutip sebagai objek teks. Ini berarti saya bisa melakukan vaq(pilih secara visual di sekitar tanda kutip . Ini menemukan tanda kutip terdekat dan secara visual memilih mereka. (Ini opsional, Anda bisa melakukan sesuatu seperti f"vww). Lalu saya tekan suntuk menghapus tanda kutip dari seleksi.

Mengubah Kutipan

CIUMAN. Saya menghapus tanda kutip kemudian menambahkan tanda kutip . Misalnya, untuk menggantikan tanda kutip tunggal dengan tanda kutip ganda, saya akan melakukan langkah-langkah: 1. menghapus tanda kutip tunggal: vaqs, 2. menambahkan kutipan baru: vwQ.


James Lawson
sumber
4

Jika Anda menggunakan plugin vim https://github.com/tpope/vim-surround (atau menggunakan plugin VSCode Vim, yang dilengkapi dengan vim-surround pre-instal), ini cukup meyakinkan!

Menambahkan

ysiw' // surround in word `'`

penurunan

ds' // drop surround `'`

perubahan

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

Ia bahkan berfungsi untuk tag html!

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

lihat readme di github untuk contoh yang lebih baik

Ulad Kasach
sumber
2

Berikut adalah beberapa pemetaan sederhana yang dapat digunakan untuk mengutip dan mengutip kata:

" '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>
Falcucci
sumber
1
Ini akan bagus untuk semua orang jika Anda bisa menguraikan jawaban Anda: bagaimana menambahkan pemetaan, bagaimana memanggil mereka dll. Terima kasih.
Carles Alcolea
1
Saya akan mengatakan itu untuk mengutip, kutip ganda dan tanda kutip yang harus Anda lakukanqw qd wq
nilon
untuk beberapa alasan, penawaran ganda mengembalikan penawaran tambahan di akhir seperti "kata" ".
janicebaratheon
@ ShuaiWang mungkin Anda memiliki autopairs atau ekstensi serupa yang diinstal? Menghapus bug itu untuk saya.
Nephilim
2

VIM untuk vscode melakukannya dengan sangat buruk. Berbasiskan satu vim-surround jika Anda tidak menggunakan vscode.

Beberapa contoh:

"test" dengan kursor di dalam tanda kutip ketik cs "'untuk berakhir dengan' test '

"test" dengan kursor di dalam tipe kutipan ds "untuk berakhir dengan test

"test" dengan kursor di dalam tanda kutip ketik cs "t dan masukkan 123> untuk berakhir dengan tes <123>

tes dengan kursor pada tes kata jenis ysaw) untuk berakhir dengan (test)

Im
sumber
1

Saya menggunakan nnoremap di .vimrc saya

Untuk mengutip satu kata:

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

Untuk menghapus tanda kutip (bekerja pada tanda kutip ganda juga):

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

Aturan untuk diingat: 'sq' = kutipan tunggal.

Niko Riitala
sumber
0

bagaimana dengan ini?

 :%s/\'/"/g
ghostdog74
sumber
2
Perintah ini beroperasi pada seluruh file. Saya hanya perlu mengubah satu kata.
Eugene Yarmash
4
Tanpa %itu, itu akan berfungsi hanya pada baris saat ini kecuali Anda sudah memilih seluruh file
Emily
0

Saya menulis sebuah skrip yang melakukan ini:

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>

Untuk menggunakannya, cukup sorot sesuatu, tekan control l, lalu ketikkan satu karakter. Jika itu salah satu karakter yang diketahui fungsi, itu akan memberikan karakter terminating yang benar. Jika tidak, itu akan menggunakan karakter yang sama untuk menyisipkan di kedua sisi.

Surround.vim dapat melakukan lebih dari ini, tetapi ini sudah cukup untuk kebutuhan saya.

profilprofil
sumber
-1

Contoh peta mode visual untuk menambahkan tanda kutip tunggal di sekitar blok teks yang dipilih:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
mrded
sumber