перейти к строке и столбцу команды vi

Вопрос или проблема

перейти к строке и столбцу команды vi

Я долго смешивал использование emacs и vi (vim). Каждый из них имеет свои преимущества. Я парсирую вывод ошибок из процесса компиляции и получаю номер строки и столбца, но я могу использовать emacs для прямого перехода к строке и столбцу:

emacs +15:25 myfile.xml

В vi у меня есть только номер строки (согласно странице man)

vi +15 myfile.xml

Существует опция для перемещения курсора на шаблон (vi +/pattern myfile.xml), но у меня она никогда не работала. Но это не помогло бы мне, поскольку шаблон не всегда является первым вхождением в файле.

Как я могу запустить vi, чтобы он переместился на столбец 25 в строке 15 моего файла? Могу ли я что-то сделать с опцией -c?

Вы можете использовать:

vi '+normal 15G25|'  myfile.xml

С помощью плагина file-line вы можете просто добавить номер строки и столбца к имени файла, как при вызове Vim, так и внутри с помощью команд, таких как :edit:

vim myfile.xml:15:25

На всякий случай есть -c 'normal 14j24l', который переместит вас на строку 15, символ 25.

Я не знаю об опции -c, но вы должны иметь возможность сделать:

vi '+cal cursor(15,25)' myfile.xml

(убедитесь, что вы используете кавычки из-за круглых скобок ())

Стоит отметить:

-c command 

Запустите данную ex-команду при старте. Только одна опция -c разрешена для vi; Vim принимает до 10. Старая форма этой опции, +command, все еще поддерживается.

Опция +command имеет то же ограничение на одну ex команду при использовании vi.

Опция +/pattern также ограничена одной командой с vi.

(взято из vim и ex редактор)

Вы можете добавить следующий код в ваш vimrc, чтобы при возврате к вашему файлу, vim автоматически возвращался на старую позицию:

if has("autocmd")
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif

Я хотел создать алиас, который позволил бы мне использовать vi file:line:col (полезно при копировании из вывода grep), и, похоже, это выполняет свою задачу. (Буду рад улучшениям.)

alias vi='vi_with_line_col() {
    local filename line column
    if [[ "$1" =~ ^(.+):([0-9]+):([0-9]+)?$ ]]; then
        if [ -n "$BASH_VERSION" ]; then
            filename="${BASH_REMATCH[1]}"
            line="${BASH_REMATCH[2]}"
            column="${BASH_REMATCH[3]:-}"
        else
            filename="${match[1]}"
            line="${match[2]}"
            column="${match[3]:-}"
        fi
        if [ -n "$column" ]; then
            command vi +"call cursor($line, $column)" "$filename"
        else
            command vi +"$line" "$filename"
        fi
    else
        if [[ "$1" =~ ^(.+):([0-9]+)?$ ]]; then
            if [ -n "$BASH_VERSION" ]; then
                filename="${BASH_REMATCH[1]}"
                line="${BASH_REMATCH[2]:-}"
            else
                filename="${match[1]}"
                line="${match[2]:-}"
            fi
            command vi +"$line" "$filename"
        else
            command vi "$@"
        fi
    fi
}; vi_with_line_col'

Ответ или решение

Вопрос заключается в том, как в текстовом редакторе vi (или vim) переместить курсор на определённую строку и столбец файла, учитывая, что при запуске редактора можно указать только номер строки.

Для того чтобы открыть файл и сразу перейти к нужной строке и столбцу, вы можете использовать следующую команду:

vi '+normal 15G25|' myfile.xml

Разберём эту команду подробнее:

  • +normal — это команда, которая позволяет выполнить команду в нормальном режиме по окончании загрузки.
  • 15G — перемещает курсор на строку 15.
  • 25| — перемещает курсор на столбец 25 в указанной строке.

Таким образом, после выполнения этой команды редактор vi откроет файл myfile.xml и установит курсор на строку 15 и столбец 25.

Кроме того, в vim вы можете воспользоваться более удобной функцией, если у вас установлен плагин file-line. В этом случае вы сможете открыть файл, указав строку и столбец в формате:

vim myfile.xml:15:25

Если нужно просто указать строку и продолжить работу, вы также можете использовать команду:

vi '+15' myfile.xml

Это откроет файл с курсором на строке 15, а затем вам нужно будет вручную переместить курсор к нужному столбцу.

Существует также возможность использования опции -c, но в vi она ограничена одной командой. В vim вы можете использовать несколько команд с этой опцией. Например, следующая команда установит курсор на строку 15 и столбец 25:

vi -c 'normal 15G25|' myfile.xml

Если вы хотите автоматизировать этот процесс, можно создать алиас в вашем .bashrc или .zshrc файле, чтобы быстро переходить к указанной строке и столбцу, используя формат файл:строка:столбец. Пример алиаса может выглядеть так:

alias vi='vi_with_line_col() {
    local filename line column
    if [[ "$1" =~ ^(.+):([0-9]+):([0-9]+)?$ ]]; then
        filename="${BASH_REMATCH[1]}"
        line="${BASH_REMATCH[2]}"
        column="${BASH_REMATCH[3]:-}"
        if [ -n "$column" ]; then
            command vi +"call cursor($line, $column)" "$filename"
        else
            command vi +"$line" "$filename"
        fi
    else
        command vi "$@"
    fi
}; vi_with_line_col'

Этот алиас позволит вам использовать формат vi файл:строка:столбец для быстрого открытия файлов в vi с указанием позиции курсора.

Таким образом, существует несколько методов для достижения желаемого результата, и вы можете выбрать наиболее удобный для вашего рабочего процесса.

Оцените материал
Добавить комментарий

Капча загружается...