Làm cách nào tôi có thể tạo chế độ chèn giả với một sơ đồ phím khác?


9

Tôi ở vị trí hơi bất thường khi sử dụng hai bố cục bàn phím khác nhau một cách thường xuyên ( Lập trình viên-DvorakThổ Nhĩ Kỳ-F ). Những bố cục này khá khác biệt với nhau và tôi chỉ có thể thành thạo vim với một bộ ký ức cơ bắp. Tôi khá thành thạo với các lệnh vim trong bố cục Dvorak, nhưng hầu như không thể sử dụng nếu bàn phím của tôi có bố cục Thổ Nhĩ Kỳ-F. Thật không may, tôi thường xuyên chỉnh sửa các tập tin bằng cả tiếng Anh và tiếng Thổ Nhĩ Kỳ và thậm chí cả các ngôn ngữ hỗn hợp. Sự thành thạo của tôi là tôi có thể gõ ngôn ngữ trong cách bố trí bàn phím tương ứng khá tốt, nhưng bộ não của tôi từ chối nối dây chúng và gõ một vài chữ cái trong tiếng Thổ Nhĩ Kỳ từ bố cục Dvorak hoặc ngược lại.

Tôi có các ràng buộc hai phím để thay đổi bố cục trong Xorg, nhưng ngay cả điều này cũng khiến tôi có một quy trình làm việc khó xử trong vim khi chỉnh sửa các tệp ngôn ngữ hỗn hợp:

<vim commands…>i<switch to tr>…content…<escape><switch to en><vim commands…>

Tôi muốn có thể rút ngắn điều này thành một cái gì đó như:

<vim commands…><leader>i…content…<escape><vim commands…>

... sao cho việc sử dụng <leader>itập hợp các :imapgiá trị để mô phỏng bố cục Thổ Nhĩ Kỳ mà không thay đổi bố cục bàn phím hệ thống. Đồng thời, isẽ chuyển sang chế độ chèn nhưng không có :imapgiá trị bổ sung . Bản thân các giá trị rất dễ, tôi chỉ cần ánh xạ bảng chữ cái giống như thế này:

:imap a u
:imap A U
:imap o i
:imap O İ
"etc.

Câu hỏi đặt ra là, làm thế nào để thiết lập hai chế độ chèn, một chế độ chèn bình thường và một pseudo chèn chế độ đó là giống hệt nhau ngoại trừ một loạt các ánh xạ, và làm thế nào tôi có thể kích hoạt các chế độ này với <leader>i, <leader>avv?


1
Đây là một ý tưởng khác: Bạn có InsertEnterInsertLeaveautocmds, bạn có thể sử dụng để tự động chuyển bố cục. Cụ thể, trên trang InsertLeavebạn có thể kiểm tra xem đó có phải là tiếng Thổ Nhĩ Kỳ không, nếu có, hãy chuyển sang Dvorak, đặt cờ và khi bạn nhập lại, hãy chuyển trở lại Thổ Nhĩ Kỳ nếu đó là trường hợp lần trước bạn rời chế độ chèn.
Martin Tournoij

@Carpetsmoker Tôi không thấy cách khắc phục vấn đề của mình. Ngay cả khi có một cái gì đó để "kiểm tra" (Tôi không chắc bạn nghĩ tôi đang kiểm tra ở đâu ... một phần của vấn đề là tôi qua lại trên cơ sở từng từ một), một trong những lý do tôi đã suy nghĩ theo hướng :imaplà nó sẽ hoạt động ngay cả trong một phiên ssh từ xa hoặc khi $DISPLAYkhông được thiết lập.
Caleb

Câu trả lời:


7

Vim có một cái gì đó như thế này dưới dạng keymap . Từ :help mbyte-keymap:

When the keyboard doesn't produce the characters you want to enter in your
text, you can use the 'keymap' option.  This will translate one or more
(English) characters to another (non-English) character.  This only happens
when typing text, not when typing Vim commands.  This avoids having to switch
between two keyboard settings.

Chế độ chèn chỉ Caps Lock mô tả ánh xạ như vậy để mô phỏng Caps Lock; như bạn có thể thấy ở đó, tệp ánh xạ tương tự như những gì bạn phác thảo trong câu hỏi của mình.

Bạn kích hoạt cài đặt này thông qua :set iminsert=1hoặc tự động thông qua i_CTRL-^. Nó cũng hoạt động /searchvới 'imsearch'tùy chọn.


3

Câu trả lời của Ingo Karkat có vẻ như đó là giải pháp chính xác và đã giải quyết được tình huống của tôi. Tuy nhiên, đây là một số hướng dẫn dài dòng hơn cho bất kỳ ai khác mới bắt đầu với các chức năng bản đồ ngôn ngữ của vim.

Đầu tiên, bạn cần một tập tin bản đồ ngôn ngữ. Như trong ví dụ về Caps Lock, bạn sẽ muốn đưa một cái gì đó như sau vào ~/.vim/keymap/dvorak2turkishf.vim(tải xuống bản đồ đầy đủ của tôi từ Githu b):

let b:keymap_name = "dvorak2turkishf"
loadkeymap
; f
, g
. ğ
p ı
y o
f d
g r
" etc...

Với điều đó, nó vẫn còn để thiết lập các ràng buộc để kích hoạt nó trong một số trường hợp nhưng không phải là các ràng buộc khác. Bạn sẽ muốn thêm một cái gì đó vào ~/.vimrctập tin của bạn .

Đầu tiên, liên kết sơ đồ tìm kiếm với đầu vào:

set imsearch=-1

Sau đó, đặt sơ đồ bàn phím nào sẽ được sử dụng cho chế độ nhập ngôn ngữ thay thế:

set keymap=dvorak2turkishf

Tắt chế độ đầu vào thay thế để theo mặc định sẽ không có thay đổi:

set iminsert=0

Thiết lập lệnh tự động để chạy bất cứ khi nào rời khỏi chế độ chèn để tắt công tắc ngôn ngữ thay thế:

autocmd InsertLeave * set iminsert=0

Thêm các ràng buộc cho tất cả các cách khác nhau mà bạn có thể kết thúc ở chế độ nhập ngôn ngữ thay thế để sử dụng <leader>(Thông thường \) trước khi chúng đặt bản đồ ngôn ngữ swtich thành trước khi chuyển đổi:

nnoremap <leader>i :set iminsert=1<Cr>i
nnoremap <leader>I :set iminsert=1<Cr>I
nnoremap <leader>a :set iminsert=1<Cr>a
nnoremap <leader>A :set iminsert=1<Cr>A
nnoremap <leader>c :set iminsert=1<Cr>c
nnoremap <leader>C :set iminsert=1<Cr>C
nnoremap <leader>r :set iminsert=1<Cr>r
nnoremap <leader>R :set iminsert=1<Cr>R
nnoremap <leader>o :set iminsert=1<Cr>o
nnoremap <leader>O :set iminsert=1<Cr>O

Đặt màu con trỏ khác khi bản đồ được bật:

:highlight Cursor guifg=NONE guibg=Green
:highlight lCursor guifg=NONE guibg=Cyan

Tất cả cùng nhau, đây là những gì đã thay đổi trong cấu hình của tôi . Như một lưu ý cuối cùng, một trong những bạn đang ở chế độ chèn, bạn có thể bật và tắt tùy chọn bản đồ ngôn ngữ bằng cách sử dụng <ctrl>+^.

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.