Làm thế nào để tìm ra một khóa được ánh xạ tới?


13

Tôi biết rằng việc chạy :mapcác lệnh không có đối số sẽ cung cấp cho tôi danh sách ánh xạ do người dùng xác định, nhưng, ví dụ, khi tôi nhấn Ctrl-W Ctrl-I, điều gì đó xảy ra, nhưng tôi không biết chức năng nào chỉ xảy ra khi ánh xạ tích hợp không xuất hiện trong các :maplệnh.

Làm thế nào để tôi tìm ra những gì một chìa khóa làm?



Không hẳn vậy. Trong emacs, tôi có thể nhấn Ctrl-H k nhấn phím tôi muốn biết và nó sẽ cung cấp cho tôi thông tin ràng buộc. Vim dường như thiếu chức năng đó. Làm cách nào để tìm ra một tổ hợp phím cụ thể được ánh xạ tới?
Mad Wombat

Bạn đã đọc bản sao được đánh dấu? Bởi vì điều đó cho bạn biết cách truy vấn hệ thống trợ giúp của Vim để biết thông tin này (danh sách mục số 8): :help CTRL-W_CTRL-Ihoặc:help CTRL-W_i
Martin Tournoij

2
Tôi đã bỏ phiếu để mở lại vì hình thức chỉnh sửa sau của câu hỏi có câu trả lời khác nhau hữu ích (": map <Keys> để in ánh xạ hoạt động") so với những gì trong bản sao hiện đang được liên kết về điều hướng trợ giúp.

1
Nhưng OP dường như biết rằng, đó là cụm từ đầu tiên của anh ấy. Sẽ rất tốt nếu Vim có cách hiển thị (theo cách tương tự) tất cả các phím không được ánh xạ, tức là những gì chúng làm theo mặc định.
VanLaser 11/03/2016

Câu trả lời:


10

Bạn không thể.

Đây là mã nguồn C để làm gì <C-w><C-i>:

normal.c:

/*
 * This table contains one entry for every Normal or Visual mode command.
 * The order doesn't matter, init_normal_cmds() will create a sorted index.
 * It is faster when all keys from zero to '~' are present.
 */
static const struct nv_cmd
{
    int         cmd_char;       /* (first) command character */
    nv_func_T   cmd_func;       /* function for this command */
    short_u     cmd_flags;      /* NV_ flags */
    short       cmd_arg;        /* value for ca.arg */
} nv_cmds[] =
{

[...]

    {Ctrl_W,    nv_window,      0,                      0},
};

[...]

/*
 * CTRL-W: Window commands
 */
    static void
nv_window(cmdarg_T *cap)
{
    if (!checkclearop(cap->oap))
        do_window(cap->nchar, cap->count0, NUL); /* everything is in window.c */
}

window.c:

/*
 * all CTRL-W window commands are handled here, called from normal_cmd().
 */
    void
do_window(
[..]
) {
    switch (nchar)
    {
[..]
    case 'i':                       /* Go to any match */
    case Ctrl_I:
                type = FIND_ANY;
                /* FALLTHROUGH */

[..]
    default:    beep_flush();
                break;

Tôi không hoàn toàn chắc chắn nơi typebiến được chọn, tôi không cảm thấy muốn tìm kiếm, nhưng vấn đề là, không có cơ sở thực sự nào để nói "khóa này được ánh xạ tới chức năng này". Về cơ bản, nó chỉ là một structánh xạ chartới một chức năng và việc thực hiện tổ hợp phím thứ hai ( <C-i>) chỉ đơn giản là sự xấu xí đặc biệt!

Điều này khác với Emacs, trong đó (tôi đoán) mọi thứ đều ở Lisp và ánh xạ tùy chỉnh của bạn không khác với ánh xạ mặc định của Emacs. Nhưng trong Vim, bạn có các ánh xạ "ma thuật" được cung cấp bởi mã C, ánh xạ chống lại các chức năng C không bao giờ được hiển thị trong Vim. Tôi luôn nói rằng Vim có ý tưởng tốt hơn, nhưng Emacs có cách triển khai tốt hơn ;-)

Vì vậy, cách duy nhất là tìm kiếm nó trong các tập tin trợ giúp. Đây là lý do tại sao tôi đóng cái này như một bản sao của Làm thế nào để tôi điều hướng đến các chủ đề trong tài liệu của Vim vì đó là câu trả lời thực tế duy nhất mà bất cứ ai cũng có thể đưa ra. Người ta thực sự có thể lập luận rằng một lời giải thích sâu sắc hơn cho câu hỏi có thể được đưa ra (như tôi vừa làm), và bạn đã lập luận rằng , thay vì đưa ra câu trả lời (hiện đã bị xóa), tôi có thể đã nói "bạn" đúng, xin lỗi vì sai lầm "và mở lại ;-)

Bằng mọi giá, để minh họa ngắn gọn các quy ước với một số ví dụ:

  • :help w- ánh xạ chế độ bình thường cho w(phân biệt chữ hoa chữ thường);
  • :help g8- ánh xạ chế độ bình thường cho g8;
  • :help v_o- ánh xạ chế độ trực quan cho o; các chế độ khác cdành cho dòng lệnh và ichèn;
  • :help CTRL-W- ánh xạ chế độ bình thường cho <C-w>;
  • :help i_CTRL-W- chèn ánh xạ chế độ cho <C-w>;
  • :help CTRL-W_CTRL-I- ánh xạ chế độ bình thường cho <C-w><C-i>;
  • :help i_CTRL-G_<Down>- chèn ánh xạ chế độ cho <C-g><Down>.

1
Một điểm quan trọng về: trợ giúp dường như luôn bị bỏ qua là những gì được gọi là commandline completiontrợ giúp vim bằng cách sử dụng CTRL-D (tôi gọi đó là "tìm kiếm trợ giúp"). Nhập :h CTRL-Wrồi nhấn <CTRL-D> và bạn sẽ nhận được danh sách tất cả các lệnh có chứa chuỗi "CTRL-W", ví dụ : CTRL-W, CTRL-W_^, CTRL-W-<Down>, .... Nhập :h g8<CTRL-D>và bạn sẽ thấy g88g8như các đối tượng trợ giúp có sẵn. Nếu không có điều này, bạn phải nhập chính xác chủ đề trợ giúp và việc tìm chuỗi chính xác hoạt động rất khó khăn.
JESii


1

Tôi nghĩ rằng bạn có thể có được ánh xạ thông qua các lệnh sau

:nmap - Mapping on normal mode
:cmap - Mapping on command mode
:vmap - Mapping on visual mode

Hy vọng nó giúp!


2
Tôi không nghĩ rằng nó sẽ có ích vì một vài từ đầu tiên của dòng đầu tiên của câu hỏi.
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.