【问题标题】:How to use vi to edit a command in terminal on Linux?如何使用 vi 在 Linux 的终端中编辑命令?
【发布时间】:2014-03-26 08:47:37
【问题描述】:

当输入一个很长的命令时,我想先在文本编辑器(例如 vi)中编辑命令,然后在出现拼写错误的情况下执行。有没有办法直接在终端中编辑命令并运行而不是通过键入 vi 来调用 vi 然后键入命令?

【问题讨论】:

    标签: linux vim terminal


    【解决方案1】:

    如果您使用的是 bash,请尝试使用 edit-and-execute-command 命令。默认情况下,它分配给Ctrl-x Ctrl-e(输入 ctrl-x,然后 ctrl-e)。

    这应该会打开您环境中指定的任何编辑器。退出时缓冲区中的任何内容都将在 shell 中执行 - 包括多行命令。

    【讨论】:

    • 如果 bash 编辑模式是 vi,这可能不起作用。请参阅bind -P 以检查edit-and-execute-command 是否完全绑定,如果没有,可以分配它(请参阅help bind)。一篇关于 GNU Readline 和 bash 的好博文:sanctum.geek.nz/arabesque/vi-mode-in-bash
    • @toraritte 在 vi​​ 模式下,<Esc>v 做到了
    【解决方案2】:

    你可以通过设置vi编辑模式。如果你使用的是 bash,你可以输入以下内容或者把它放在你的shell configuration files

    set -o vi
    

    你可以像在 vi 中一样使用命令模式和插入模式。

    当命令已经在线时(通过按向上箭头键调用,CTRL-Rfzf 等),在 shell 上处于正常模式时,一个有用的命令是 v,因为它将启动默认编辑器来编辑命令。

    来自this gist的备忘单:

    .---------------------------------------------------------------------------.
    |                                                                           |
    |                          Readline VI Editing Mode                         |
    |                     Default Keyboard Shortcuts for Bash                   |
    |                               Cheat Sheet                                 |
    |                                                                           |
    '---------------------------------------------------------------------------'
    | Peteris Krumins (peter@catonmat.net), 2008.01.08                          |
    | http://www.catonmat.net  -  good coders code, great reuse                 |
    |                                                                           |
    | Released under the GNU Free Document License                              |
    '---------------------------------------------------------------------------'
    
     ======================== Keyboard Shortcut Summary ========================
    
    .--------------.------------------------------------------------------------.
    |              |                                                            |
    | Shortcut     | Description                                                |
    |              |                                                            |
    '--------------'------------------------------------------------------------'
    | Switching to COMMAND Mode:                                                |
    '--------------.------------------------------------------------------------'
    | ESC          | Switch to command mode.                                    |
    '--------------'------------------------------------------------------------'
    | Commands for Entering INPUT Mode:                                         |
    '--------------.------------------------------------------------------------'
    | i            | Insert before cursor.                                      |
    '--------------+------------------------------------------------------------'
    | a            | Insert after cursor.                                       |
    '--------------+------------------------------------------------------------'
    | I            | Insert at the beginning of line.                           |
    '--------------+------------------------------------------------------------'
    | A            | Insert at the end of line.                                 |
    '--------------+------------------------------------------------------------'
    | c<mov. comm> | Change text of a movement command <mov. comm> (see below). |
    '--------------+------------------------------------------------------------'
    | C            | Change text to the end of line (equivalent to c$).         |
    '--------------+------------------------------------------------------------'
    | cc or S      | Change current line (equivalent to 0c$).                   |
    '--------------+------------------------------------------------------------'
    | s            | Delete a single character under the cursor and enter input |
    |              | mode (equivalent to c[SPACE]).                             |
    '--------------+------------------------------------------------------------'
    | r            | Replaces a single character under the cursor (without      |
    |              | leaving command mode).                                     |
    '--------------+------------------------------------------------------------'
    | R            | Replaces characters under cursor.                          |
    '--------------+------------------------------------------------------------'
    | v            | Edit (and execute) the current command in the text editor. |
    |              | (an editor defined in $VISUAL or $EDITOR variables, or vi  |
    '--------------'------------------------------------------------------------'
    | Basic Movement Commands (in command mode):                                |
    '--------------.------------------------------------------------------------'
    | h            | Move one character right.                                  |
    '--------------+------------------------------------------------------------'
    | l            | Move one character left.                                   |
    '--------------+------------------------------------------------------------'
    | w            | Move one word or token right.                              |
    '--------------+------------------------------------------------------------'
    | b            | Move one word or token left.                               |
    '--------------+------------------------------------------------------------'
    | W            | Move one non-blank word right.                             |
    '--------------+------------------------------------------------------------'
    | B            | Move one non-blank word left.                              |
    '--------------+------------------------------------------------------------'
    | e            | Move to the end of the current word.                       |
    '--------------+------------------------------------------------------------'
    | E            | Move to the end of the current non-blank word.             |
    '--------------+------------------------------------------------------------'
    | 0            | Move to the beginning of line                              |
    '--------------+------------------------------------------------------------'
    | ^            | Move to the first non-blank character of line.             |
    '--------------+------------------------------------------------------------'
    | $            | Move to the end of line.                                   |
    '--------------+------------------------------------------------------------'
    | %            | Move to the corresponding opening/closing bracket.         |
    '--------------'------------------------------------------------------------'
    | Character Finding Commands (these are also Movement Commands):            |
    '--------------.------------------------------------------------------------'
    | fc           | Move right to the next occurance of char c.                |
    '--------------+------------------------------------------------------------'
    | Fc           | Move left to the previous occurance of c.                  |
    '--------------+------------------------------------------------------------'
    | tc           | Move right to the next occurance of c, then one char       |
    |              | backward.                                                  |
    '--------------+------------------------------------------------------------'
    | Tc           | Move left to the previous occurance of c, then one char    |
    |              | forward.                                                   |
    '--------------+------------------------------------------------------------'
    | ;            | Redo the last character finding command.                   |
    '--------------+------------------------------------------------------------'
    | ,            | Redo the last character finding command in opposite        |
    |              | direction.                                                 |
    '--------------+------------------------------------------------------------'
    | |            | Move to the n-th column (you may specify the argument n by |
    |              | typing it on number keys, for example, 20|)                |
    '--------------'------------------------------------------------------------'
    | Deletion Commands:                                                        |
    '--------------.------------------------------------------------------------'
    | x            | Delete a single character under the cursor.                |
    '--------------+------------------------------------------------------------'
    | X            | Delete a character before the cursor.                      |
    '--------------+------------------------------------------------------------'
    | d<mov. comm> | Delete text of a movement command <mov. comm> (see above). |
    '--------------+------------------------------------------------------------'
    | D            | Delete to the end of the line (equivalent to d$).          |
    '--------------+------------------------------------------------------------'
    | dd           | Delete current line (equivalent to 0d$).                   |
    '--------------+------------------------------------------------------------'
    | CTRL-w       | Delete the previous word.                                  |
    '--------------+------------------------------------------------------------'
    | CTRL-u       | Delete from the cursor to the beginning of line.           |
    '--------------'------------------------------------------------------------'
    | Undo, Redo and Copy/Paste Commands:                                       |
    '--------------.------------------------------------------------------------'
    | u            | Undo previous text modification.                           |
    '--------------+------------------------------------------------------------'
    | U            | Undo all previous text modifications.                      |
    '--------------+------------------------------------------------------------'
    | .            | Redo the last text modification.                           |
    '--------------+------------------------------------------------------------'
    | y<mov. comm> | Yank a movement into buffer (copy).                        |
    '--------------+------------------------------------------------------------'
    | yy           | Yank the whole line.                                       |
    '--------------+------------------------------------------------------------'
    | p            | Insert the yanked text at the cursor.                      |
    '--------------+------------------------------------------------------------'
    | P            | Insert the yanked text before the cursor.                  |
    '--------------'------------------------------------------------------------'
    | Commands for Command History:                                             |
    '--------------.------------------------------------------------------------'
    | k            | Move backward one command in history.                      |
    '--------------+------------------------------------------------------------'
    | j            | Move forward one command in history.                       |
    '--------------+------------------------------------------------------------'
    | G            | Move to history line N (for example, 15G).                 |
    '--------------+------------------------------------------------------------'
    | /string or   | Search history backward for a command matching string.     |
    | CTRL-r       |                                                            |
    '--------------+------------------------------------------------------------'
    | ?string or   | Search history forward for a command matching string.      |
    | CTRL-s       | (Note that on most machines Ctrl-s STOPS the terminal      |
    |              | output, change it with `stty' (Ctrl-q to resume)).         |
    '--------------+------------------------------------------------------------'
    | n            | Repeat search in the same direction as previous.           |
    '--------------+------------------------------------------------------------'
    | N            | Repeat search in the opposite direction as previous.       |
    '--------------'------------------------------------------------------------'
    | Completion commands:                                                      |
    '--------------.------------------------------------------------------------'
    | TAB or = or  | List all possible completions.                             |
    | CTRL-i       |                                                            |
    '--------------+------------------------------------------------------------'
    | *            | Insert all possible completions.                           |
    '--------------'------------------------------------------------------------'
    | Miscellaneous commands:                                                   |
    '--------------.------------------------------------------------------------'
    | ~            | Invert case of the character under cursor and move a       |
    |              | character right.                                           |
    '--------------+------------------------------------------------------------'
    | #            | Prepend '#' (comment character) to the line and send it to |
    |              | the history.                                               |
    '--------------+------------------------------------------------------------'
    | _            | Inserts the n-th word of the previous command in the       |
    |              | current line.                                              |
    '--------------+------------------------------------------------------------'
    | 0, 1, 2, ... | Sets the numeric argument.                                 |
    '--------------+------------------------------------------------------------'
    | CTRL-v       | Insert a character literally (quoted insert).              |
    '--------------+------------------------------------------------------------'
    | CTRL-r       | Transpose (exchange) two characters.                       |
    '--------------'------------------------------------------------------------'
    
    
     ===========================================================================
    
    .---------------------------------------------------------------------------.
    | Peteris Krumins (peter@catonmat.net), 2008.01.08.                         |
    | http://www.catonmat.net  -  good coders code, great reuse                 | 
    |                                                                           |
    | Released under the GNU Free Document License                              |
    '---------------------------------------------------------------------------'
    

    【讨论】:

      【解决方案3】:

      您是否尝试过内置的 fc(“修复命令”)shell?1

      默认情况下,它会在您的编辑器中打开最后一个命令,但您可以丢弃它并将其替换为您想要的任何内容,并在退出时执行。见help fc

      Tom Ryder 在他的博文Vi mode in Bash 中提出的想法。


      (1) 在fish、zsh、bash、dash 中可用,但也可能在其他版本中可用。

      【讨论】:

        【解决方案4】:

        如果您使用zsh,则shell 命令称为edit-command-line。默认情况下它没有绑定,所以在你的配置中添加这样的东西:

        bindkey "^X^E" edit-command-line
        

        现在 Ctrl+xCtrl+e 的工作方式与 bash 相同,只是在 Return 之前不执行命令被击中。

        【讨论】:

          【解决方案5】:

          如果您使用的是 fish shell 而不是 bash,您可以在编辑器中打开当前命令:

          Alt-v(使用 VISUAL 环境变量中设置的编辑器)

          Alt-e(使用EDITOR环境变量中设置的编辑器)

          【讨论】:

            猜你喜欢
            • 2020-11-11
            • 2019-05-10
            • 2015-08-15
            • 2021-12-04
            • 1970-01-01
            • 2018-09-23
            • 2010-09-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多