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.
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.
Câu trả lời:
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.
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.
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.
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.ciw
và không chỉ cw
? Tôi thấy khó hiểu thứ nhất và thứ hai hoạt động tốt.
ciw
hoạt động bất kể con trỏ của bạn ở đâu trong từ. cw
chỉ hoạt động nếu con trỏ của bạn ở đầu từ. Xem :help iw
.
.
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 :-))
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
Đâ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.
map <Leader>' gewi'<Esc>A'<Esc>
vào .vimrc
tậ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.
:vnoremap <leader>q c""<esc>P
.
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ụ \v
sửa đổi (rất ma thuật) ở đầu mẫu
:s/\v(\S+)/"\1"/
:s/\v([a-Z]+)/"\1"/g
Những cách vĩ mô!
nhấn qvà qđể 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").
nhấn shift+ bdi chuyển con trỏ đến trước từ hiện tại
iloại báo chí '(một dấu ngoặc đơn)
nhấn escrồi nhấn eđể di chuyển đến cuối từ
nhấn asau đó nhấn 'một lần nữa để bao quanh từ với dấu ngoặc kép.
nhấn escđể vào chế độ bình thường.
cuối cùng nhấn qđể ghi vào q
sổ đăng ký.
Cách sử dụng
Bạn có thể thay đổi step 4
vớ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
hãy để @ q = ' ctrl+ r ctrl+ rq'
lưu và thoát
mở tập tin của bạn, đi đến một số từ
@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.
@q w
và sau đó bạn có thể gói các n
từ tiếp theo bằng dấu ngoặc kép bằng n@j
.
Để 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-r
và 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/
ciw'<C-R><C-O>"'<Esc>
.
.
sẽ viết lại nội dung của cuộc gọi thực tế cuối cùng.
Đối với người dùng VSCodeVim, bạn có thể làm
vwS"
"
bằng bất cứ thứ gì bạn muốn bọc.w
bằng bất kỳ toán tử lựa chọn nào khácviwS'
này để kết thúc từ trong dấu ngoặc đơn. Cho đến nay dễ nhất.
viwS"
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 ".
'r
và "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 ;
và ,
đưa bạn đến lệnh tiếp theo hoặc trước đó khi chúng lặp lại f/F/t/T
tìm kiếm cuối cùng theo cùng hướng hoặc ngược lại.
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
.
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
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>
qw
qd
wq
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)
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.
Còn cái này thì sao?
:%s/\'/"/g
%
, 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
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.