Làm cách nào để giữ vim làm nổi bật các trận đấu sau khi thay thế?


13

Tôi có set hlsearchtrong tôi ~/.vimrc. Điều này thường rất hữu ích, nhưng thật khó chịu khi phải thực hiện :nohsau khi tôi thực hiện thay thế '<,'>s/$/',/(làm nổi bật phần cuối của mỗi dòng sau khi tôi chạy nó). Làm thế nào để tôi vimkhông nổi bật sau khi thay thế như thế này?

Tôi đang dùng Ubuntu 9.04 với vim7.2. Tôi gặp vấn đề tương tự trên OS X 10.6 (cũng vim7.2). Một cái gì đó sẽ làm việc trên cả hai sẽ được mong muốn.

CẬP NHẬT: Tất cả các câu trả lời tôi nhận được chỉ là thêm một ánh xạ chính để làm :noh(hoặc tương đương). Tôi thực sự cố gắng tránh các hành vi quan trọng tùy chỉnh mà tôi thực sự sẽ quen, nhưng sau đó khiến tôi thất bại thảm hại khi không có chúng (ví dụ như tại máy tính của một người bạn, v.v.). Tôi muốn vimtự động làm :nohsau khi thay thế. Đó là, tôi chỉ muốn hlsearchkhi sử dụng /hoặc *(có thể một vài trường hợp khác), nhưng không phải lần khác.

Câu trả lời:


7

Nếu bạn không muốn vô hiệu hóa vĩnh viễn, bạn có thể liên kết một phím để chuyển đổi phần tô sáng như được đề xuất trong câu trả lời này cho một câu hỏi tương tự trên stackoverflow.

map  <F12> :set hls!<CR>
imap <F12> <ESC>:set hls!<CR>a
vmap <F12> <ESC>:set hls!<CR>gv

Nếu bạn muốn tắt vĩnh viễn phần tô sáng:

11.1. After I searched for a text with a pattern, all the matched text
      stays highlighted. How do I turn off the highlighting
      temporarily/permanently?

The 'hlsearch' option controls whether all the matches for the last
searched pattern are highlighted or not. By default, this option is not
enabled. If this option is set in a system-wide vimrc file, then you can
turn off the search highlighting by using the following command:

    :set nohlsearch

(từ Câu hỏi thường gặp về VIM )


2
Tôi đã nhận thức được tùy chọn này. Vấn đề là tôi thường không tìm kiếm những gì tôi muốn thay thế, vì vậy thật vô nghĩa khi làm nổi bật trong hầu hết các trường hợp mà tôi thay thế. Tuy nhiên, nó rất hữu ích khi tôi đang tìm kiếm thứ gì đó, vì vậy tôi không muốn nó biến mất hoàn toàn .
Benjamin Oakes

@Benjamin: Bạn đã ngầm tìm kiếm nó. Đó là những gì: s làm. Tìm kiếm một mẫu và sau đó thực hiện chuyển đổi trên (các) trận đấu. Sử dụng: nohl là giải pháp phù hợp vì nó tắt phần nổi bật của mẫu tìm kiếm hiện tại cho đến khi tìm kiếm tiếp theo được thực hiện. Nó thực hiện điều này mà không thay đổi trạng thái của tùy chọn 'hlsearch' hoặc ảnh hưởng đến giá trị được lưu trữ của cụm từ tìm kiếm trước đó.
jamessan

2
@jamessan: Tôi hiểu rằng đó là một tìm kiếm và thay thế. Chỉ là tôi không cần nó làm nổi bật sau đó. Chủ yếu là một phiền toái hơn bất cứ điều gì.
Benjamin Oakes

Cách đây ít lâu, tôi bắt đầu tắt đánh dấu theo mặc định và bật nó khi tôi muốn, như bạn đề xuất. Vẫn không hoàn hảo, nhưng nó tốt hơn.
Benjamin Oakes

9

Tôi có hai giải pháp khác nhau, cả hai đều khá tốt, mỗi cách có một sắc thái khác nhau. Yêu thích của tôi là tùy chọn 2:

  1. Tôi có 2 dòng sau trong .vimrc:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    Người đầu tiên đợi thời gian chờ (không thể định cấu hình) nếu con trỏ không di chuyển và tắt hlsearch. Cái thứ hai bật lại nếu con trỏ di chuyển lại.

    Nó không phải là một giải pháp hoàn hảo, nhưng nó hoạt động với tôi (và sẽ gần hoàn hảo khi thời gian chờ có thể định cấu hình - hiện tại, thời gian chờ được gắn với một bộ đếm thời gian dựng sẵn cho vim.)

  2. Hoặc bạn có thể thử những dòng sau:

    autocmd cursorhold * set nohlsearch
    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    

Điều này sẽ tắt hlsearch sau một khoảng thời gian ngắn không có chuyển động con trỏ và bật lại cho các lệnh tìm kiếm tiêu chuẩn. Nó không bao gồm tất cả các khả năng bật lại hlsearch, nhưng nó đủ để bắt đầu bằng chứng về khái niệm.


Cảm ơn đã cập nhật - không thấy nó cho đến bây giờ. (Có vẻ như bạn vừa thêm nó? Hài hước mà.) Đây là một khái niệm hay; Tôi sẽ phải chơi xung quanh nó.
Benjamin Oakes


Tôi đã sửa đổi dòng đầu tiên trong tùy chọn 1 bằng cách sau autocmd cursorhold * set nohlsearch | let @/ = "" Điều này sẽ xóa sổ đăng ký tìm kiếm cũng như xóa phần tô sáng. Không dành nhiều thời gian với thiết lập này nhưng tôi muốn đưa nó ra ngoài cho những người kết thúc ở đây.
Berkeley Martinez

2

Tôi chỉ gõ "/ asdf" (giả sử "asdf" không có trong tệp) để loại bỏ phần tô sáng. Tôi biết nó khá đơn giản, nhưng nó hiệu quả với tôi.


2
Đó là ý tưởng tương tự :noh, nhưng nó không luôn luôn hoạt động. :) Thật buồn cười khi bạn đề cập đến điều đó: Tôi đã từng có một người bạn luôn gõ tên anh ta vì nó sẽ xuất hiện ít thường xuyên hơn những gì như "asdf" trong những gì anh ta viết. (Hơi buồn cười, tôi nghĩ vậy.)
Benjamin Oakes

Thật. Có lẽ tôi sẽ nhớ: noh lần sau.
Greg Graham

1

Đặt phần sau vào tệp .vimrc của bạn:

nnoremap <silent> <F11> :exe ":silent! normal /$^\r"<CR>

Điều này sẽ âm thầm ẩn cụm từ tìm kiếm được tô sáng nhưng không tắt :set hlsearchtính năng này. Nó được kích hoạt một lần nữa trong lần tìm kiếm tiếp theo.


Tốt hơn hết là sử dụng lệnh dựng sẵn được thiết kế cho mục đích này -: nohl. Sau đó, bạn không thổi bay nội dung của sổ đăng ký tìm kiếm, được sử dụng cho những thứ như nhảy sang trận đấu tiếp theo, giá trị mặc định của mẫu khi không được chỉ định, v.v.
jamessan

Vâng, nhưng điều đó làm tôi bực mình vì tìm kiếm tiếp theo của tôi không được tô sáng như đáng lẽ. Vì vậy, tôi đưa ra giải pháp nhanh chóng này. Nó cũng có thể bẩn nhưng nó hoạt động. Tôi nghĩ rằng điều này có thể chấp nhận được đối với vim - ngay cả khi tôi sẽ không sử dụng những thứ "bẩn" trong mã nguồn của một dự án lớn, thực sự.
Gregor Müllegger

1

Một khả năng khác là đặt lại thanh @/ghi (thực ra là thanh ghi đọc-ghi) sau khi thực hiện thay thế. Điều này khôi phục lại điểm nổi bật trước đó:

command! -nargs=* -range S
\ let atslash=@/|exe ':'.<line1>.','.<line2>.'s'.<q-args>|let @/=atslash

Tuy nhiên, điều này vẫn có một vài vấn đề:
- thay vì sửa đổi :s, nó xác định một lệnh mới. Mặc dù có thể sử dụng cabbrevđể ánh xạ :stới :S, tôi biết không có cách nào để bắt tất cả các công trình như :<range>s.
- nếu bạn đã sử dụng :nohltrước đây để ẩn chỉ một tìm kiếm, thì điều này sẽ làm nổi bật lại tìm kiếm trước đó. Tôi biết không có cách nào để tìm nếu :nohlđược gọi trước đó. (Có thể đi xung quanh điều này và cũng có thể ghi đè :nohllệnh, nhưng điều này cũng sẽ yêu cầu ghi đè tất cả các lệnh tìm kiếm, có thể quá nhiều ...).

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.