Cách thuận tiện nhất để làm việc với các bàn phím khác nhau trong vim là gì?


18

Đôi khi tôi cần phải viết các từ Hy Lạp, nhưng khi tôi đang sử dụng bàn phím tiếng Hy Lạp, nhấn, nói, <C-p>sẽ được hiểu <C-π>và không phải là lệnh tôi dự định. Điều này có thể được sửa chữa với :map <C-p> <C-π>. Tôi có thể làm điều này cho tất cả các chữ cái mà không lập danh sách tất cả không?

Tái bút Lập danh sách tất cả không tạo ra kết quả hoàn hảo. Ví dụ, q;trên Gr. bàn phím, nhưng chúng tôi không muốn lập bản đồ; đến q. Ngoài ra, vì một số lý do, (zeta zeta) không hoạt động sau :map Ζ Z. Và một lệnh tôi đã xác định, \lwkhông hoạt động như \λς.


2
Tôi nghĩ rằng ánh xạ không phải là cách tốt để đi: có thể những gì bạn đang tìm kiếm là langmaptùy chọn (xem tài liệu bao gồm một ví dụ cho bố cục Hy Lạp). Tùy chọn này thực sự được thực hiện để giúp đối phó với các bàn phím không phải là tiếng Latin như Hy Lạp hoặc Cyrilic. Nó cho phép bạn xác định các cặp ký hiệu sẽ được hiểu thông thường trong chế độ chèn nhưng sẽ được thay thế trong các chế độ khác, có thể điều này sẽ giúp bạn.
statox

@statox: Cảm ơn! Tôi đã thử sử dụng ex. nhưng không có gì xảy ra. Trợ giúp nói rằng vim phải được tuân thủ tùy chọn + langmap. Có một cách dễ dàng để kiểm tra nếu nó là? Tôi đang sử dụng phiên bản đi kèm với Mac OS.
Tẩy răng

1
Bạn có thể sử dụng :echo has('langmap')nếu bạn nhận được một cái 1bạn có nó nếu bạn 0không có.
statox

@statox: Cảm ơn! Tôi đã cập nhật brew install vim --override-system-vi:echo has &ctrả về 1. ZZ hoạt động. Vấn đề với \lv& c vẫn còn.
Tẩy răng

Tôi không hiểu :echo has &cphần này, tôi không thấy nó có liên quan như thế nào langmapmột khi bạn đã biên dịch vim với langmapbạn phải chỉ định ánh xạ :set langmap=ΑA,ΒB,ΨC [...]trong vimrc của bạn.
statox

Câu trả lời:


6

Tôi muốn giới thiệu keymap, có thể giải quyết rắc rối của bạn. Đặt chúng trong vimrc của bạn

" set keymap=greek_utf-8
set iminsert=0
set imsearch=-1

để tắt tiếng Hy Lạp làm mặc định. Bạn có thể bật tùy chọn bật (tiếng Hy Lạp) và tắt (tiếng Anh) bằng cách sử dụng <ctrl>+^(bạn cũng có thể sử dụng <ctrl>+6, nó được ánh xạ trên phím, không phải trên biểu tượng) trong chế độ chèn và chế độ Thay thế (không hoạt động trong Chế độ bình thường). Để tự động tắt khi rời chế độ chèn, bạn có thể sử dụng

inoremap <ESC> <ESC>:set iminsert=0<CR>

Thêm về những

:h iminsert :h keymap :h imsearch :h i_CTRL-^


EDIT để bình luận thứ hai:

Bạn có thể thử điều này để tự động bật tiếng Hy Lạp, nếu vào chế độ chèn (và chế độ thay thế) và tự động tắt, nếu rời khỏi (thì bạn không cần ánh xạ được đề cập trước đó).

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END

Có thực sự cần thiết để sử dụng Hy Lạp polytonic? Đối với tôi, dường như chỉ cần mã hóa đúng, và sau đó sử dụng đầu vào MacOS X tích hợp. Nhưng đây có lẽ chỉ là ấn tượng sai lầm của tôi. Bạn cũng có thể chuyển sang bàn phím Hy Lạp đa âm trong MacOS X (và tìm hiểu nó, nhưng tôi đoán đó không phải là thứ bạn tìm kiếm :-) Về độ trễ của, có thể có một số ánh xạ, hãy thử tìm hiểu :map >avà nếu có , hủy bỏ nó bằng cách :unmap >a. Là một người dùng không phải là người Hy Lạp và không phải là người MacO, tôi đã sẵn sàng. Xin lỗi và chúc may mắn!
ryuichiro

10

Như tôi đã nói trong các bình luận, ánh xạ trong không được thiết kế để làm những gì bạn muốn làm. Một lựa chọn thú vị cho trường hợp sử dụng này là langmap.

Tùy chọn này cho phép giữ hành vi hoặc bàn phím của bạn ở chế độ chèn và thay đổi hành vi của nó ở các chế độ khác.

Để sử dụng nó, Vim phải được biên dịch +langmap, bạn có thể kiểm tra xem tùy chọn này có được bật hay không echo has('langmap'): nếu lệnh trả về 1tùy chọn được bật, bạn sẽ phải thiết lập với tùy chọn này được bật (để biết cách thực hiện, tùy chọn là một câu hỏi khác).

Khi được bật, tùy chọn lấy các cặp ký tự chẳng hạn set langmap += à@sẽ cho phép bạn thêm một àbộ đệm khi bạn ở chế độ chèn và bạn nhập ànhưng gõ àở chế độ bình thường sẽ thực sự kích hoạt @(ví dụ này có thể hữu ích trên azerty bàn phím để dễ dàng làm việc với các macro).

Để sử dụng langmap trong tiếng Hy Lạp, bạn có thể làm theo ví dụ được đưa ra khi :h 'langmap'thêm dòng này vào vimrc (Sao chép dòng này từ đây có thể không phải là ý tưởng hay vì tôi thực sự không chắc chắn về mã hóa, có thể lấy dòng trực tiếp từ tệp trợ giúp an toàn hơn) :

:set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz

Bây giờ từ những gì tôi hiểu trong các bình luận của bạn, nó vẫn là một vấn đề khi bạn cố gắng sử dụng các lệnh được xác định trước: khi bạn nhập lệnh, hành vi chế độ chèn sẽ được kích hoạt thay vì hành vi được xác định langmap. Thật không may, tôi không chắc chắn tôi có một giải pháp tốt cho điều đó. Một ý tưởng có thể là xác định lại các lệnh chẳng hạn như thế:

command λς lw

Theo cách này, khi bạn gõ lệnh λςVim sẽ thực thi lwnhưng tôi thấy một số nhược điểm của phương thức này:

  • Nó có thể là một nỗi đau rất lớn ở mông để xác định lại tất cả các lệnh bạn muốn sử dụng.
  • Các lệnh do người dùng định nghĩa phải bắt đầu bằng chữ in hoa và bây giờ tôi đã biết làm thế nào thuận tiện để làm điều đó trong tiếng Hy Lạp.

Vì vậy, có thể một plugin được đề xuất bởi @Alexander Myshov trong câu trả lời của anh ấy cho câu hỏi này có thể hữu ích (vì tôi chưa bao giờ thử bất kỳ trong số này, tôi không biết liệu họ có giải quyết được vấn đề không nhưng có vẻ như họ làm vậy).


1

Tôi gõ thường xuyên bằng tiếng Anh và tiếng Thụy Điển. Tiếng Thụy Điển là một vấn đề nhỏ hơn để giải quyết so với tiếng Hy Lạp vì nó chỉ mở rộng bảng chữ cái tiếng Anh với một vài ký tự, nhưng tôi nghĩ giải pháp của tôi có thể chuyển sang tiếng Hy Lạp.

Tôi đã sử dụng để chuyển đổi bằng cách sử dụng chuyển đổi bàn phím hệ thống của hệ điều hành của tôi. Vấn đề với điều này là, như OP lưu ý, nó phá vỡ cả đống lệnh, vì ở chế độ bình thường, mỗi phím sẽ gửi một tín hiệu khác đến Vim bằng bàn phím không phải tiếng Anh. Trong cách bố trí bàn phím tiếng Thụy Điển, hơn nữa, một bó toàn bộ các ký tự không tự chữ cái được di chuyển để nhường chỗ cho các nhân vật mới å, äö. Ví dụ: }được nhập bằng Alt-Shift-9 (khớp với dấu ngoặc đơn mở trên bàn phím tiếng Anh) và dấu gạch chéo ngược được nhập bằng Alt-Shift-7. Chuyển sang bố trí bàn phím Thụy Điển vanilla cho insertmode do đó gây ra một loạt các vấn đề đau đầu.

Giải pháp của tôi là chỉ ánh xạ lại các khóa có liên quan trong insertmode và bọc các ánh xạ này trong một chức năng để tôi có thể dễ dàng chuyển đổi qua lại. Mã dưới đây là cách tôi đã làm điều này trong của tôi .vimrc. Điều này chỉ thêm các ký tự tôi cần vào vị trí họ có trong bố trí bàn phím Thụy Điển, để lại mọi thứ khác. Để nhập các ký tự được che đậy bởi họ ( ;, :, [, {, ", và '), tôi chỉ cần nhấn phím này hai lần. May mắn thay, chỉ những người ngớ ngẩn thậm chí cần loại haiäs liên tiếp. . hơn là di chuyển chúng xung quanh.) Điều gì có nghĩa là khi tôi muốn gõ bằng tiếng Thụy Điển, tôi nhấn <Leader>s, chuyển sang các ánh xạ này và áp dụng kiểm tra chính tả tiếng Thụy Điển. Để chuyển trở lại tôi làm <Leader>e.

Bây giờ, đối với tiếng Hy Lạp, điều này sẽ liên quan đến việc lập bản đồ cho toàn bộ bảng chữ cái, điều này thực sự ít rắc rối hơn so với khi bạn hiểu nguyên tắc. Phần khó khăn sau đó sẽ là hủy bỏ tất cả những thay đổi khi chuyển sang tiếng Anh. Có lẽ ai đó có thể đưa ra một cách tiện lợi để làm điều đó.

Tôi đang lên kế hoạch thực hiện một chức năng chèn như những ngôn ngữ dưới đây cho tiếng Ả Rập, ngôn ngữ khác tôi thường nhập. Tôi có thể quay lại đây để báo cáo về quy trình.

" Switch to Swedish
function! SweType()
  set spelllang=sv
  inoremap ; ö
  inoremap ;; ;
  inoremap : Ö
  inoremap :: :
  inoremap [ å
  inoremap { Å
  inoremap ' ä
  inoremap '' '
  inoremap " Ä
  inoremap "" "
  inoremap [[ [
  inoremap {{ {
endfunction
nmap <Leader>s :<C-U>call SweType()<CR>


" Switch to English
function! EngType()
  set spelllang=en_us
  inoremap ; ;
  iunmap ;;
  inoremap : :
  iunmap ::
  inoremap [ [
  iunmap [[
  inoremap { {
  iunmap {{
  inoremap ' '
  iunmap ''
  inoremap " "
  iunmap ""
endfunction
nmap <Leader>e :<C-U>call EngType()<CR>

1
Tôi có thể sai nhưng tôi nghĩ rằng câu trả lời của bạn cho phép dễ dàng nhận được các ký tự không phải tiếng Anh ở chế độ chèn trong khi vấn đề của OP là dễ dàng lấy các ký tự tiếng Anh ở các chế độ khác ngoài chế độ chèn. Tôi không chắc câu trả lời của bạn giải quyết vấn đề ban đầu. Tuy nhiên, ý tưởng về chức năng kích hoạt / vô hiệu hóa ánh xạ là khá thú vị.
statox

@statox Vâng, tôi có thể đã hiểu nhầm câu hỏi, nhưng nếu vấn đề là dễ dàng chèn các ký tự không phải tiếng Anh vào insertmode trong khi duy trì các chức năng của chế độ bình thường, tôi tin rằng câu hỏi của tôi ít nhất là để giải quyết vấn đề đó.
Andreas

Tôi xin lỗi tôi không có ý xúc phạm: Tôi đã chỉ ra rằng có thể có một khoảng cách giữa câu hỏi và câu trả lời của bạn nhưng tất nhiên bạn cố gắng giải quyết vấn đề và như tôi đã nói tôi thực sự thích ý tưởng về chức năng cho phép và vô hiệu hóa ánh xạ. Tôi thực sự không phủ nhận câu trả lời của bạn và tôi thực sự xin lỗi về những gì nó nghe giống như vậy.
statox

1
@statox Không có hành vi phạm tội. Và nếu bạn đã từ chối câu trả lời của tôi thì tất cả sẽ theo thứ tự tốt.
Andreas

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.