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.
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.
Jawaban:
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.
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.
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.
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.ciw
dan tidak adil cw
? Saya menemukan yang pertama membingungkan dan yang kedua berfungsi dengan baik.
ciw
bekerja di mana pun kursor Anda berada. cw
hanya berfungsi jika kursor Anda berada di awal kata. Lihat :help iw
.
.
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 :-))
Mengutip sebuah kata, menggunakan kutipan tunggal
ciw'Ctrl+r"'
Lebih mudah bagi saya untuk melakukannya dengan cara ini
ciw '' Esc P
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.
map <Leader>' gewi'<Esc>A'<Esc>
ke .vimrc
file saya untuk memasukkan komentar kutipan tunggal dari posisi saat ini ke akhir baris; yang membantu saya saat mengonversi beberapa skrip MSDOS menjadi bash.
:vnoremap <leader>q c""<esc>P
.
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 \v
pengubah (sangat ajaib) di awal pola
:s/\v(\S+)/"\1"/
:s/\v([a-Z]+)/"\1"/g
Cara makro!
tekan qdan quntuk merekam ke dalam register q (kami menggunakan "q" sebagai jalan pintas untuk mengingat "kutipan").
tekan shift+ bgerakkan kursor ke depan kata saat ini
itipe pers '(satu kutipan)
tekan esclalu tekan euntuk pindah ke akhir kata
tekan alalu tekan 'lagi untuk mengelilingi kata dengan tanda kutip.
tekan escuntuk masuk ke mode normal.
akhirnya tekan quntuk merekamnya menjadi q
register.
Cara Penggunaan
Anda dapat mengubah step 4
dengan apa pun yang Anda suka {a line, word hingga menemukan beberapa karakter, dll}.
Buat rekaman makro tetap ada
let @ q = ' ctrl+ r ctrl+ rq'
Simpan dan keluar
buka file Anda, buka beberapa kata
@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.
@q w
dan kemudian Anda bisa membungkus n
kata-kata berikutnya dengan tanda kutip menggunakan n@j
.
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-r
dan lebih lanjut tentang objek teks di:h text-objects
Sumber: http://vimcasts.org/episodes/pasting-from-insert-mode/
ciw'<C-R><C-O>"'<Esc>
.
.
akan menulis ulang konten panggilan aktual terakhir.
Untuk pengguna VSCodeVim dapat Anda lakukan
vwS"
"
dengan apa pun yang ingin Anda bungkus.w
dengan operator seleksi lainnyaviwS'
yang membungkus kata dalam tanda kutip tunggal. Sejauh ini yang termudah.
viwS"
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 ".
'r
dan "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/T
pencarian terakhir di arah yang sama atau berlawanan, masing-masing.
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 s
untuk 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
.
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
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>
qw
qd
wq
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)
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.
bagaimana dengan ini?
:%s/\'/"/g
%
itu, itu akan berfungsi hanya pada baris saat ini kecuali Anda sudah memilih seluruh file
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.