Cách tốt nhất để thực hiện thao tác cuộn mượt mà trong Vim là gì?


78

Các lệnh cuộn chính trong Vim là:

  1. Ctrl- BCtrl- F, cũng như PageUpPageDowncuộn toàn bộ trang
  2. Ctrl- UCtrl- Dcuộn nửa trang theo mặc định
  3. Ctrl- YCtrl- Ecuộn một dòng

Tôi mất bối cảnh hình ảnh mỗi lần cho hai cái trước, vì vậy tôi đã hình thành thói quen xấu là đánh cái sau ( Ctrl- YCtrl- E) lặp đi lặp lại.

Vì hiện tại không có sự hỗ trợ của bên thứ nhất để cuộn mượt mà nên cách giải quyết / plugin ít bị phản đối nhất là gì?

Tôi sử dụng cả Vim và GVim tùy thuộc vào nhiệm vụ và rất vui khi tùy chỉnh chúng riêng biệt nếu không có bản hack thực sự tốt nào phù hợp với cả hai. Con lăn chuột hoạt động tốt trong GVim, nhưng tôi đang tìm kiếm các giải pháp dựa trên bàn phím.


[Ctrl + U] không hoạt động, [Ctrl + u] hoạt động, bạn đã sử dụng phiên bản nào của vi (m)?
AjayKumarBasuthkar

Câu trả lời:


38

Cập nhật : Tôi hiện đã đẩy mã này, được cấu trúc lại phần nào theo các hướng dẫn tại :help write-plugin, vào một repo Github .

Sử dụng bàn phím

Đây là những gì tôi có trong của mình .vimrc:

function SmoothScroll(up)
    if a:up
        let scrollaction="^Y"
    else
        let scrollaction="^E"
    endif
    exec "normal " . scrollaction
    redraw
    let counter=1
    while counter<&scroll
        let counter+=1
        sleep 10m
        redraw
        exec "normal " . scrollaction
    endwhile
endfunction

nnoremap <C-U> :call SmoothScroll(1)<Enter>
nnoremap <C-D> :call SmoothScroll(0)<Enter>
inoremap <C-U> <Esc>:call SmoothScroll(1)<Enter>i
inoremap <C-D> <Esc>:call SmoothScroll(0)<Enter>i

Đặc trưng:

  • Cuộn trên cơ sở của scrolltùy chọn Vim .
  • Tốc độ cuộn có thể tùy chỉnh (điều chỉnh đối số thời gian của sleeplệnh; tôi sử dụng mười mili giây). Lưu ý : cũng giống như làm chậm tốc độ khung hình trên video, nếu bạn làm chậm quá trình cuộn mượt mà sẽ bị giật, cuộn không mượt. Nhưng bất cứ điều gì tốt nhất cho bạn.
  • Hoạt động ở chế độ bình thường hoặc chèn.

Lưu ý : tất cả những gì bạn sao chép và dán, hãy nhớ rằng ^ký tự chỉ ra một ký tự điều khiển; copy-paste sẽ tạo ra kết quả không hợp lệ và chúng phải được nhập thủ công!

  • ^Y- CTRL- Vthì CTRL-Y
  • ^E- CTRL- Vthì CTRL-E

Tuy nhiên, cú pháp <C-U><Enter>kiểu được gõ theo nghĩa đen là các ký tự đó; lệnh bản đồ chuyển đổi chúng thành các ký tự điều khiển một cách thông minh.

Sử dụng chuột

Câu hỏi đề cập rằng cuộn bằng chuột hoạt động tốt trong GVim, nhưng mong muốn một giải pháp bàn phím. Điều này ngụ ý với tôi rằng người hỏi có thể quan tâm đến giải pháp chuột nếu nó hoạt động trong thiết bị đầu cuối thông thường Vim.

Đối với tôi, bật hỗ trợ chuột cho phép cuộn chuột qua con lăn mượt mà. Ngoài ra, đối với tôi, cuộn mượt là điều quan trọng nhất khi tôi đang nhìn xung quanh (tức là ở chế độ bình thường), chứ không phải khi tôi đang chỉnh sửa (ở chế độ chèn) và nếu tôi không chủ động chỉnh sửa, thì tôi cần phải ở trên bàn phím luôn bị loại bỏ, vì vậy điều này hoạt động tốt.

Tuy nhiên, trên cơ sở của câu hỏi này , có vẻ như một số người sẽ phải thực hiện một số thiết lập thủ công hơn ngoài việc chỉ đơn giản là bật chuột (tôi chỉ sử dụng set mouse=n):


Của tôi .vimrccó những dòng sau

 set mouse=a
 map <ScrollWheelUp> <C-Y>
 map <ScrollWheelDown> <C-E>


Điều này hoạt động tuyệt vời ... và không phụ thuộc vào tốc độ của máy như câu trả lời khác. Chúc mừng!
Steve Vermeulen

1
Cảnh báo: Tôi nhận thấy rằng bạn không nên nhấn <kbd> Ctrl </kbd> - <kbd> D </kbd>, v.v. cho đến khi cuộn trước đó kết thúc hoặc hành vi khác lạ. Tôi chưa gặp phải vấn đề này bao giờ nên không biết là do tôi không để ý hay là do cấu hình Vim trên máy hiện tại tôi đang sử dụng. Nếu ai biết làm thế nào để đối phó với đa luồng trong Vim (!!), xin vui lòng kêu vang trong.
Keith Pinson

Một cải tiến khả năng ở đây đã xảy ra với tôi sẽ áp dụng di chuyển mượt mà cùng với zz, z-, z <cr> lệnh
Steve Vermeulen

Đó là một ý kiến ​​hay. Bạn có thể sửa lại chúng theo cách tương tự, tôi cho là vậy.
Keith Pinson 12/113

3
Một nhận xét nhỏ về 'hãy nhớ rằng ký tự ^ chỉ ra một ký tự điều khiển': bạn có thể thay thế 'let scrollaction = "^ Y"' bằng 'let scrollaction = "\ <Cy>"' để bạn không phải sử dụng <Cv> <Cy> để tạo keybinding VÀ nó giúp sao chép có thể dán :)
gospes

11

Có một bản hack remap đơn giản trong vim's tips.txt:

Smooth scrolling                    *scroll-smooth*

If you like the scrolling to go a bit smoother, you can use these mappings:

    :map <C-U> <C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y>
    :map <C-D> <C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E>

1
Tại sao điều này lại thích hợp hơn khi sử dụng cài đặt tùy chọn 'cuộn' (ví dụ: đặt cuộn = 15)? Tùy chọn cuộn có vẻ thích hợp hơn vì bạn thậm chí có thể tạo một lệnh au để thay đổi nó tự động khi chiều cao cửa sổ thay đổi. (Tôi đoán bạn có thể làm một cái gì đó như thế với phương pháp lập bản đồ này cũng có, nhưng mọi thứ cuộn tùy chọn đơn giản hoá.)
Herbert Sitz

1
Thực ra, tự động đặt biến cuộn cũng là một trong những tùy chọn mà tôi đang cân nhắc. Như bạn đề cập, nó cần phải phù hợp với kích thước cửa sổ. Biến cuộn mặc định bằng 1/2 chiều cao cửa sổ, nhưng nó dường như không cho thấy cách thay đổi phân số đó; bạn chỉ có thể thay đổi nó về số lượng dòng. Bạn cũng có thể phải đặt một giá trị nhỏ hơn cho cuộn so với khi bạn cũng có một số kiểu cuộn trơn tru, vì mắt bạn sẽ không có bất kỳ trạng thái cuộn trung gian nào để cải thiện độ bền của thị lực.
Andrew Wagner,

1
Để làm rõ, cd và cu sẽ cuộn theo bất kỳ tùy chọn 'cuộn' nào được đặt thành. Mặc định là 1/2 chiều cao cửa sổ, nhưng bạn có thể đặt nó thành bất cứ thứ gì bạn muốn. Nếu bạn muốn tạo một giá trị mới phụ thuộc vào chiều cao cửa sổ thì hãy sử dụng hàm 'winheight ("%")', hàm này trả về số dòng trong cửa sổ. Vì vậy, ví dụ, lệnh ': set scroll = winheight ("%") / 3' sẽ làm cho cu và cd cuộn 1/3 chiều cao cửa sổ.
Herbert Sitz

1
@Drew Wagner Ánh xạ này nên được viết lại noremap <expr> <C-u> repeat("\<C-y>", 20)để dễ đọc.
ZyX

9
Hoặc chỉ cần:map <C-U> 20<C-Y>
anishsane


7

Một plugin gần đây

Tôi đã đăng một cái gì đó tương tự ở đây , nhưng về cơ bản có một plugin tuyệt vời mà chúng ta có thể sử dụng ngay bây giờ để cuộn, được gọi là terryma / vim-Smooth-scroll . Nó cung cấp một cuộn rất đẹp và mượt mà.


Việc cài đặt khá dễ dàng:

1Tôi sử dụng Vundle nên tôi chỉ cần thêm nó vào .vimrc.bundles :

Bundle terryma/vim-smooth-scroll

Trong phiên bản mới nhất của Vundle có sẵn hôm nay, ngày 29 tháng 4 năm 2016, bạn có thể đặt tệp này vào .vimrc của mình :

Plugin 'terryma/vim-smooth-scroll'

2Như đã nêu trong tài liệu, bạn có thể thiết lập 3 đối số: khoảng cách , thời lượngtốc độ .

Tôi đang sử dụng cái này trong tệp .vimrc của mình :

noremap <silent> <c-b> :call smooth_scroll#up(&scroll*2, 10, 4)<CR>
noremap <silent> <c-f> :call smooth_scroll#down(&scroll*2, 10, 4)<CR>

1
Đáng buồn thay, plugin này cũng di chuyển con trỏ thay vì những gì tôi muốn: chỉ cuộn màn hình như các lệnh <C-E><C-Y>.
silviubogan

4

Những gì tôi làm là tôi đặt lặp lại bàn phím thành rất nhanh, khoảng 120 ký tự / giây và độ trễ nhỏ. Sau đó, tôi ánh xạ đến 4j và đến 4k, tôi điều hướng mã nguồn lên và xuống bằng cách sử dụng j và k để di chuyển con trỏ lên xuống đẹp và nhanh chóng, khá mượt mà. Nhưng đây là phần tốt, và điều này hoạt động trên Linux, không phải Windows. Trong một số năm nay, đầu vào bàn phím của X11 hoạt động theo cách mà khi bạn nhấn và giữ j, nó rõ ràng bắt đầu đưa ra ký tự j. Nhưng khi bạn tiếp tục giữ phím j và sau đó nhấn phím ctrl, X11 bắt đầu đưa ra các ký tự cj mà bạn không cần phải nhấn lại phím j. Sau đó, khi bạn buông phím ctrl và vẫn tiếp tục nhấn j, X11 tiếp tục đặt lại phím j. Vì vậy, j làm cho con trỏ bắt đầu di chuyển đẹp và mượt mà xuống dưới, và bạn có thể nhấn ctrl theo định kỳ mà không cần buông j để tăng tốc,

Ngoài ra, tôi làm những gì Devin làm và tôi đặt bộ cuộn xuống 5.

Cuối cùng, tôi hoán đổi ctrl và cap lock. Vị trí mặc định của phím ctrl hoàn toàn không hoạt động (không có ý định vi phạm). Nó khiến bạn phải xoay tay trái. Tôi hầu như không bao giờ sử dụng caps lock, vì vậy tôi đã hoán đổi chúng. Sau đó, ngón tay hồng bên trái của tôi có thể chạm đến phím ctrl mà không cần bất kỳ động tác yoga nào.

Những điều này đã làm việc cho tôi trong nhiều năm. Tôi chỉ sử dụng vim, không bao giờ sử dụng gvim.


3
+1 vì than thở về vị trí của phím điều khiển. IMO phím lệnh macbook không tốt hơn nhiều.
Triptych

3

Đây không phải là thao tác cuộn mượt mà nhưng đó là cách tôi xử lý để không làm mất ngữ cảnh khi chuyển trang.

đặt như vậy = 7

'scrolloff' 'so' number (default 0) global
{not in Vi}
Số dòng màn hình tối thiểu để giữ ở trên và dưới con trỏ. Điều này sẽ hiển thị một số ngữ cảnh xung quanh nơi bạn đang làm việc. Nếu bạn đặt nó thành một giá trị rất lớn (999), dòng con trỏ sẽ luôn ở giữa cửa sổ (ngoại trừ ở đầu hoặc cuối tệp hoặc khi các dòng dài bao bọc). Để cuộn theo chiều ngang, hãy xem 'sidecrolloff'. LƯU Ý: Tùy chọn này được đặt thành 0 khi 'tương thích' được đặt.



1
N <CR-E>
N <CR-Y>

... trong đó 'N' là số dòng đơn bạn muốn cuộn.

Không mượt mà theo nghĩa đen, nhưng bạn vẫn giữ bàn phím.


0

Tôi chỉ tìm thấy plugin này được gọi là "tăng tốc-mịn-cuộn" ( "Vim plugin cho cuộn mịn tăng tốc (ánh xạ tới <C-D>/<C-U>, <C-F>/<C-B>)") mà có thể là ví dụ sử dụng thông qua Vundle bằng cách đặt dòng này trong vimrc của bạn:

Plugin 'yonchu/accelerated-smooth-scroll'

Sau đó, khởi động lại Vim và chạy :PluginInstalllệnh, sau đó khởi động lại Vim và sử dụng lệnh <C-D>( Ctrl+D) và <C-O>( Ctrl+O) bình thường.

Đáng buồn thay, plugin này cũng di chuyển con trỏ thay vì những gì tôi muốn: chỉ cuộn màn hình như các lệnh <C-E><C-Y>.


0

Điều này kết hợp nhiều câu trả lời và đây là những gì tôi sử dụng.

noremap <expr> <C-u> repeat("\<C-y> :sleep 10m<CR>", winheight('%')/2)
noremap <expr> <C-d> repeat("\<C-e> :sleep 10m<CR>", winheight('%')/2)
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.