Làm thế nào văn bản có thể được di chuyển từ một đăng ký đến một số lượng đăng ký tùy ý?


10

Có cách nào để "đường ống" văn bản từ một thanh ghi sang một thanh ghi khác hoặc một bộ các thanh ghi không? Ví dụ, di chuyển "qđến các thanh ghi "1thông qua "5.

Tôi thường muốn tạo các phiên bản hơi khác nhau của cùng một macro, vì vậy thật hữu ích khi có thể sao chép macro 'mẫu' vào một số thanh ghi và sau đó sửa đổi từng vị trí của chúng.

Để đưa ra một ví dụ thực tế, đây là vấn đề đặt ra câu hỏi này cho tôi.

Tôi cần biến dòng sau từ ngôn ngữ mô tả phần cứng thành nhiều khối lặp lại,

RAM64(in=in, load=load0, address=address[0..5], out=out1);

đến

RAM64(in=in, load=load1, address=address[0..5], out=out2);
RAM64(in=in, load=load2, address=address[0..5], out=out3);
RAM64(in=in, load=load3, address=address[0..5], out=out4);
RAM64(in=in, load=load4, address=address[0..5], out=out5);

Tôi có một macro thực hiện điều này, bằng cách sử dụng hàm tăng, yypW^At)^Amà tôi đã lưu trong sổ đăng ký "a.

Đôi khi, tôi cần mô hình tăng dần để hơi khác nhau, chẳng hạn như

RAM512(in=in, load=load1, address=address[0..8], out=out2);
RAM512(in=in, load=load2, address=address[0..8], out=out4);
RAM512(in=in, load=load3, address=address[0..8], out=out6);
RAM512(in=in, load=load4, address=address[0..8], out=out8);

nơi macro trong đăng ký "bsẽ được yypW^At)^A^A.

Tôi muốn đăng ký để làm điều này, nhưng với mỗi mức tăng từ 1-5. Thanh ghi "acó thể (bằng cách nào đó) được sao chép vào thanh ghi b đến e. Sau đó, tôi sẽ dán từng thanh ghi vào bộ đệm, thực hiện sửa đổi cần thiết (thêm nhiều thuật ngữ, thay đổi ký tự theo tchuyển động, v.v.) và kéo biểu thức đã sửa đổi trở lại vào thanh ghi. Lý tưởng nhất là bước cuối cùng này thậm chí có thể được bao gồm trong (các) lệnh để sao chép các thanh ghi

Điều này giúp tôi không lặp lại tất cả các ký tự trong macro KHÔNG yêu cầu thay đổi. Ví dụ của tôi có thể là tầm thường, nhưng tôi có thể thấy trước những lúc có thể rất hữu ích để làm những gì tôi đang yêu cầu.


5
Bên cạnh đó, tôi không khuyên bạn nên sử dụng các thanh ghi được đánh số. Các thanh ghi "an toàn" duy nhất là các thanh ghi chữ cái. Tất cả các thanh ghi khác được Vim tự động thiết lập.
jamessan

Câu trả lời:


7

Macro chỉ là văn bản.

Mở một bộ đệm trống mới và đặt macro của bạn ở đó. Bạn có thể nhân đôi các dòng, thay đổi một thứ ở đây và một thứ khác ở nơi khác sau đó kéo một dòng và sử dụng nó ngay lập tức @".

Không cần làm ô nhiễm các thanh ghi của bạn, đặc biệt là các thanh ghi số phục vụ một mục đích hoàn toàn khác.

-- biên tập --

Câu hỏi của bạn dễ hiểu hơn khi bạn thêm một số lời giải thích.

Hóa ra, bạn chỉ cần thay đổi bản ghi ban đầu để đạt được mục tiêu của mình mà không cần chơi với các thanh ghi như thể chúng là các biến:

:let i = 1                     " define variable i
qa                             " start recording in register a
yy                             " yank the line
p                              " paste it
W                              " move to next WORD
<C-v><C-a>                     " increment number
t)                             " jump to the other number to increment
:norm <C-r>=i<CR><C-v><C-a>    " increment the number by i
q                              " stop recording

Để tạo 5 bản sao của dòng hiện tại với số cuối cùng tăng thêm 2:

:let i = 2|norm 5@a

hoặc 12 bản, với số cuối cùng tăng thêm 23:

:let i = 23|norm 12@a

Đồng ý về các thanh ghi số, nhưng nếu bạn muốn sử dụng lệnh này trong một lệnh và bạn cần các thanh ghi bắt đầu giống nhau nhưng trở nên khác nhau thì sao?
wchargein

@WChargin, vui lòng giải thích.
romainl

Như trong, có lẽ tôi muốn làm điều gì đó với bản xoay của một chuỗi, vì vậy nếu abcdeđang ở trong @q, sau đó tôi muốn @x="bcdea", @y="abcde"@z="eabcd". Tôi có thể bắt đầu bằng cách cho phép @x, @y@ztất cả bằng @qvà sau đó sửa đổi chúng khi cần thiết. Rõ ràng, tôi chỉ làm điều này, nhưng có vẻ như có thể có một số trường hợp tương tự có thể hữu ích.
wchargein 3/2/2015

2
@Kit, tôi hơi lo ngại vì thiếu ví dụ thực tế trong câu hỏi của bạn, điều này ngay lập tức khiến nó có mùi như XY. Tôi gần như chắc chắn rằng bạn đang sử dụng sai các thanh ghi vì vậy tôi rất thích đọc một lời giải thích về những gì bạn đang cố gắng làm.
romainl

1
@Kit, đó là một trong nhiều vấn đề với vấn đề XY. Câu trả lời được đánh giá cao nhất là câu trả lời trực tiếp chất lượng cao cho câu hỏi của bạn nhưng cuối cùng lại vô dụng trong bối cảnh vấn đề thực sự của bạn trong khi câu trả lời ít được nêu lên của tôi là một giải pháp thực tế cho vấn đề tiềm ẩn của bạn. Cả hai câu trả lời đều đúng nhưng chúng trả lời các câu hỏi khác nhau khiến bạn khó quyết định. Nếu là tôi, tôi sẽ chấp nhận câu trả lời giải quyết vấn đề cốt lõi của mình nhưng đó chỉ là tôi.
romainl

6

Sử dụng getregsetreg

Để sao chép từ qvào sổ đăng ký 1- 5:

let src=getreg('q', 1)
for i in range(1, 5)
    call setreg(i, src)
endfor

Để sao chép vào một danh sách tổng quát hơn:

let src=getreg('q', 1)
for i in ['a', 'c', 'e']
    call setreg(i, src)
endfor

Sử dụng execute

Để sao chép từ qvào sổ đăng ký 1- 5:

for i in range(1, 5)
   execute 'let @' . i . '=@a'
endfor

Để sao chép vào một danh sách tổng quát hơn:

for i in ['a', 'c', 'e']
    execute 'let @' . i . '=@a'
endfor

Giải trình. Lệnh letcó thể được sử dụng như let @x=@y, bản sao đăng ký yđể đăng ký x. Về cơ bản, chúng ta chỉ xây dựng các lệnh này trong một vòng lặp (thay đổi giá trị xở dạng trên) và executeing chúng.


1
Không cần sử dụng :exeở đây. Các chức năng getreg()setreg()sẽ sạch hơn.
jamessan 3/2/2015

@jamessan Gợi ý hay, cảm ơn, tôi có đang sử dụng những thứ này một cách chính xác không?
wchargein

Tôi đã chỉnh sửa nó để thêm đối số thứ hai tùy chọn vào getreg () vì nó trả về nội dung của thanh ghi thay vì đánh giá có thể có của nó.
jamessan

1

Để trả lời trực tiếp câu hỏi, nếu bạn muốn sao chép nhanh chóng và dễ dàng nội dung của một đăng ký này sang một đăng ký khác, bạn có thể đặt nội dung sau vào .vimrc của mình. Sau đó bạn có thể thực hiện <leader>rcabđể sao chép nội dung đăng ký ađể đăng ký b. Như một ví dụ tôi đã chọn <leader>rcđể thay thế cho 'đăng ký bản sao'

function! s:CopyRegister()
    let sourceReg = nr2char(getchar())

    if sourceReg !~# '\v^[a-z0-9]'
        echo "Invalid register given: " . sourceReg
        return
    endif

    let destinationReg = nr2char(getchar())

    if destinationReg !~# '\v^[a-z0-9]'
        echo "Invalid register given: " . destinationReg
        return
    endif

    call setreg(destinationReg, getreg(sourceReg, 1))
    echo "Replaced register '". destinationReg ."' with contents of register '". sourceReg ."'"
endfunction

" rc = register copy
nnoremap <leader>rc :call <sid>CopyRegister()<cr>

1
Tôi muốn giới thiệu getreg(sourceReg, 1).
jamessan 3/2/2015

À đúng rồi Đã sửa.
Steve Vermeulen
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.