Làm cách nào để quản lý và ghi nhớ nhiều chữ viết tắt trong vimrc của tôi?


10

Tôi có hơn 500 chữ viết tắt ( iabbr, abbr) và một số ánh xạ trong tệp vimrc của tôi từ Java, PHP, C / C ++ và latex.

Thật không dễ để nhớ ngay khi tôi không sử dụng ngôn ngữ trong một thời gian.

Tôi đang tự hỏi liệu tôi có thể hoàn thành tên viết tắt. Có cách nào tốt hơn để truy cập / quản lý tất cả các chữ viết tắt này không?

Câu trả lời:


10

Tôi không biết cách tốt nhất để quản lý hơn 500 chữ viết tắt. Có thể về lâu dài, như @statox đã giải thích, bạn có thể xem qua các đoạn trích để giảm con số này.

Và nếu bạn muốn tự động hoàn thành các chữ viết tắt, bạn có thể thử đoạn mã sau:

augroup GetAbbrev
    autocmd!
    autocmd VimEnter * let s:abbrev_list = [] |
                \ call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(s:abbrev_list, submatch(1))', 'gn')
augroup END

set completefunc=CompleteAbbrev
function! CompleteAbbrev(findstart, base)
    if a:findstart
        return searchpos('\<\k', 'bcnW', line('.'))[1] - 1
    else
        return filter(copy(s:abbrev_list), 'v:val =~ "^" . a:base')
    endif
endfunction

Để sử dụng nó, bạn sẽ phải nhấn C-x C-usau khi bắt đầu viết tắt.


Autocmd thiết lập biến s:abbrev_listchứa tất cả các chữ viết tắt của bạn.

Hàm CompleteAbbrev()sẽ trả về một danh sách các ứng cử viên dựa trên từ trước con trỏ.

Các 'completefunc'giá trị của tùy chọn nói với Vim mà hàm nào để gọi khi bạn nhấn C-x C-u.
Lưu ý rằng tùy chọn này là cục bộ của bộ đệm, vì vậy bạn vẫn có thể sử dụng các chức năng khác trong các loại bộ đệm khác nhau, bằng cách sử dụng autocmd và FileTypesự kiện chẳng hạn.

Xem :h complete-functionsđể biết thêm thông tin về cách hoạt động của chức năng.


Một giải pháp khác là sử dụng hoàn thành từ đồng nghĩa. Từ :h i_^x^t:

                            *i_CTRL-X_CTRL-T*
CTRL-X CTRL-T       Works as CTRL-X CTRL-K, but in a special way.  It uses
                    the 'thesaurus' option instead of 'dictionary'.  If a
                    match is found in the thesaurus file, all the
                    remaining words on the same line are included as
                    matches, even though they don't complete the word.
                    Thus a word can be completely replaced.

                    For an example, imagine the 'thesaurus' file has a
                    line like this:
                            angry furious mad enraged
                    Placing the cursor after the letters "ang" and typing
                    CTRL-X CTRL-T would complete the word "angry";
                    subsequent presses would change the word to "furious",
                    "mad" etc.
                    Other uses include translation between two languages,
                    or grouping API functions by keyword.

Để sử dụng giải pháp này, bạn sẽ phải làm 3 việc:

  1. Viết {lhs}tất cả các chữ viết tắt của bạn trong một tập tin chuyên dụng.
    Ví dụ , /home/user/mysynonyms.txt. Và nhóm chúng xung quanh các chủ đề tương tự.
  2. Thêm đường dẫn đến tệp này vào tùy chọn 'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. Nhấn C-x C-tsau khi bắt đầu tên của bất kỳ chữ viết tắt trong một nhóm.

Ví dụ: giả sử bạn có các chữ viết tắt sau:

iab cfa CFuncA
iab cfb CFuncB
iab cfc CFuncC

iab jfa JavaFuncA
iab jfb JavaFuncB
iab jfc JavaFuncC

iab pfa PhpFuncA
iab pfb PhpFuncB
iab pfc PhpFuncC

Bạn có thể nhóm chúng theo ngôn ngữ lập trình mà chúng thuộc về.
Bên trong /home/user/mysynonyms.txt, bạn sẽ viết:

cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc

Bây giờ, bất cứ khi nào bạn nhấn vào C-x C-tsau tên viết tắt (hoặc chỉ bắt đầu), Vim sẽ hiển thị, trong menu bật lên, tất cả các chữ viết tắt trên cùng một dòng.

Đây là giao diện của nó:

nhập mô tả hình ảnh ở đây

Lưu ý rằng các chữ viết tắt không cần bắt đầu với cùng một ký tự được nhóm, chúng có thể hoàn toàn khác nhau. Miễn là chúng nằm trên cùng một dòng trong tệp từ đồng nghĩa của bạn, Vim sẽ hiển thị tất cả chúng.

Và bạn không phải sử dụng ngôn ngữ lập trình để quyết định nhóm nào viết tắt. Bạn có thể nhóm chúng theo bất kỳ sự tương đồng / chủ đề / danh mục có ý nghĩa mà bạn có trong tâm trí.

Vì vậy, khi bạn quên một từ viết tắt cụ thể, bạn có thể nhập các chữ cái đầu tiên của danh mục, nhấn C-x C-tvà chọn một chữ cái có liên quan trong menu.

Chỉnh sửa:
Để kết xuất tất cả các chữ viết tắt của bạn bên trong /home/user/mysynonyms.txt, bạn có thể sử dụng 3 lệnh Ex này:

:let abbrev_list = []
:call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(abbrev_list, submatch(1))', 'gn')
:call writefile(abbrev_list, '/home/user/mysynonyms.txt')

Chỉnh sửa2:
Tôi đã thêm cờ nkhi substitute()hàm được gọi vì bạn không cần bất kỳ thay thế nào. Mục đích duy nhất của nó là thêm chữ viết tắt trong danh sách mỗi khi tìm thấy.
Nhưng vì bạn có nhiều chữ viết tắt, nó có thể làm cho quá trình trở nên vô ích, tôi không biết. Ban đầu, tôi không đặt nó vì tôi không biết bạn đang sử dụng phiên bản Vim nào. Nếu phiên bản của bạn mới hơn 7.3.627 , nó sẽ ổn, nếu không bạn sẽ phải xóa ncờ.


câu trả lời tuyệt vời và toàn diện. bạn Rock
1234

\ v% (^ | \ n) \ s * i?% (nore)? ab% [brev] \ s +% (% (\ <expr \> | \ <buffer \>) \ s +) {, 2} ( \ k +) không hoạt động trên tệp vimrc của tôi
1234

@JoobLee Nó hoạt động trên hệ thống của tôi, bạn có thông báo lỗi nào không? Nó hoạt động với một regex đơn giản hơn (nhưng ít đáng tin cậy hơn) như thế \vi?abbr\s+(\k+)nào? Bạn có thể cho tôi một liên kết với một đoạn trích từ viết tắt của bạn, để xem liệu tôi có thể tái tạo vấn đề của bạn không?
dùng9433424

@JoobLee Nếu phiên bản Vim của bạn đủ gần đây, hãy thêm ncờ vào cuộc gọi thay thế (Tôi đã chỉnh sửa câu trả lời để đưa vào). Nếu bạn thực hiện tìm kiếm trong vimrcvà bạn sao chép-dán này \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+, nó có làm nổi bật chữ viết tắt của bạn không?
dùng9433424

9

Một mẹo wikia đề xuất một phương pháp để hiển thị có chọn lọc các chữ viết tắt của bạn:

Bạn có thể liệt kê tất cả các chữ viết tắt của bạn với

:ab<CR>

(thay thế abbằng cách iabliệt kê chỉ viết tắt chế độ chèn)

Và bạn có thể liệt kê tất cả các chữ viết tắt có cùng tiền tố với

:ab prefix<CR>

Điều này không lý tưởng bằng việc hoàn thành các chữ viết tắt nhưng đó có thể là một cách tốt để nhanh chóng có một danh sách các chữ viết tắt hiện có của bạn.

Để làm cho giải pháp này hiệu quả hơn, một cách thực hành tốt là tạo ra từ viết tắt cụ thể cho kiểu tệp. Ví dụ, chữ viết tắt này chỉ hữu ích trong bộ đệm java:

iabbrev syso System.out.println("");

Vì vậy, thật tốt khi định nghĩa nó như thế này:

autocmd! FileType java :iabbrev <buffer> syso System.out.println("");

Phần autocommand chỉ cho phép tạo chữ viết tắt khi bạn ở trong bộ đệm java và <buffer>tùy chọn làm cho chữ viết tắt chỉ có thể truy cập được từ bộ đệm này.

Cách này :iabsẽ chỉ hiển thị chữ viết tắt khi bạn ở trong bộ đệm java. Nếu bạn có nhiều chữ viết tắt, sẽ rất thú vị khi tạo một hàm bằng filetype sẽ xác định tất cả các chữ viết tắt và để autocommand gọi hàm. Cái gì đó như:

autocmd! FileType latex call CreateLatexAbbrev()

function! CreateLatexAbbrev()
    iabbrev <buffer> something something else
    " All the other latex abbreviations
endfunction

Một giải pháp khác có thể là tạo chức năng tự động hoàn thành của riêng bạn bằng cách sử dụng danh sách viết tắt của bạn làm nguồn từ khóa.

Cuối cùng tôi phải nói rằng tôi khá ấn tượng với "hơn 500 chữ viết tắt", tôi không biết bạn đang sử dụng từ nào nhưng có lẽ sẽ rất thú vị khi bạn xem qua khái niệm về đoạn trích nếu bạn không quen với họ Vì chúng là các mẫu được kích hoạt bằng cách nhập từ khóa và nhấn phím nóng, chúng linh hoạt hơn chữ viết tắt, nó có thể cho phép bạn giảm số lượng chữ viết tắt bạn đang sử dụng. Xem ở đây để giới thiệu thú vị.


1

Làm thế nào về việc nhóm các chữ viết tắt bằng filetype?

Thay vì có tất cả chúng trong ~/.vimrctệp của bạn , hãy chia nhỏ chúng và đặt chúng vào các vị trí thích hợp trong thư mục thời gian chạy của bạn, ~/.vimtrên các hệ điều hành giống như Unix.

Ví dụ: các chữ viết tắt Markdown của bạn sẽ được đặt trong tệp ~/.vim/after/ftplugin/markdown.vim, mà Vim sẽ kiểm tra sau khi tải plugin kiểu tệp Markdown.

Hóa ra chúng ta không nên có những .vimrctập tin khổng lồ ; bạn có được sự linh hoạt hơn bằng cách sử dụng $VIMRUNTIME. Đường dẫn thời gian chạy được ghi lại trong hệ thống trợ giúp của Vim : :h 'runtimepath'.

Lần đầu tiên tôi biết về điều này từ bài viết xuất sắc Từ .vimrc đến .vim trên lịch phiêu lưu theo chủ đề Vim Vimways .

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.