Как открывать PDF-файлы под курсором (с помощью ‘gf’) с помощью внешних программ чтения PDF в vim

#vim #autocmd

#vim #autocmd

Вопрос:

Текущая gfкоманда откроет файлы * .pdf в виде текста ascii. Я хочу, чтобы PDF-файл открывался с помощью внешних инструментов (например, okular, foxitreader и т. Д.). Я попытался использовать autocmd для достижения этого следующим образом:

 au BufReadCmd *.pdf silent !FoxitReader % amp; "open file under cursor with FoxitReader
au BufEnter *.pdf <Ctrl-O> "since we do not really open the file, go back to the previous buffer
  

Однако второй autocmd не сработал должным образом. Я не мог найти способ выполнить <Ctrl-o> команду таким autocmd образом.

Может ли кто-нибудь дать мне подсказку о том, как <Ctrl-O> войти autocmd , или просто напрямую предложить лучший способ открытия PDF-файлов с gfпомощью?

Спасибо.

Ответ №1:

Это потому, что за an autocmd следует команда ex (те, которые начинаются с двоеточия). Чтобы имитировать выполнение команды обычного режима, используйте :normal команду. Проблема в том, что вы не можете передать a <C-O> (и not <Ctrl-O> ) напрямую :normal , он будет восприниматься как буквальные символы (< , затем C, затем r), что является не очень значимой обычной командой. У вас есть два варианта:

1. Вставьте буквенный символ ^O

Используйтеcontrolvcontrolo, чтобы получить один:

 au BufEnter *.pdf normal! ^O
  

2. Используйте :execute для создания вашей команды

Таким образом, вы можете получить более читаемый результат с экранированной последовательностью:

 au BufEnter *.pdf exe "normal! <c-o>"
  

В любом случае, это не самая подходящая команда. <C-O> просто перейдите к
предыдущему местоположению в списке переходов, поэтому ваш буфер остается открытым. Я бы сделал
что-то вроде:

 au BufEnter *.pdf bdelete
  

Вместо этого. Тем не менее, у меня есть другое решение для вас.


Создайте другую команду, скажем, с картойgO. Затем используйте программу чтения PDF напрямую или утилиту, например open , если вы используете macOS X или Darwin (не уверен, есть ли она в других системах Unix и как она называется). Это все равно, что дважды щелкнуть значок файла, переданного в качестве аргумента, поэтому откроется программа чтения PDF по умолчанию или любое другое приложение, настроенное на открытие любого файла по умолчанию, например изображений или около того.

 :nnoremap gO :!open <cfile><CR>
  

Это <cfile> будет расширено до файла под курсором. Итак, если вы хотите
открыть файл в Vim, используйте gf. Если вы хотите открыть его с
помощью приложения по умолчанию, используйте gO.

Если у вас нет этой команды или вы предпочитаете решение только для PDF, создайте сопоставление с вашей предпочтительной командой:

 :nnoremap gO :!FoxitReader <cfile> amp;<CR>
  

Комментарии:

1. Спасибо! Ваше предложение с autocmd работает. Однако, когда я попробовал решение ‘gO’ с FoxitReader (я не нашел эквивалентной программы open в моем дистрибутиве Linux), FoxitReader просто сообщил «Файл не найден». Кажется, <cfile> был расширен неправильно. Есть еще предложения?

2. Рад помочь @Liang! В ситуации, когда gO не работает, gf работает ли? С <cfile> ним должно быть то же самое. Возможно, файл не находится в текущем каталоге, в котором вы находитесь, или что-то в этом роде.

3. Это связано с проблемой пути! Тем не менее, gf проблема не возникает, хотя gO и возникает. В моем случае у меня был файл bibtex ~/papers/library.bib , и все PDF-файлы находились в одном каталоге papers . Когда я открыл файл bib из $HOME , gf сработал и gO потерпел неудачу; Когда я открыл его из papers каталога, оба решения сработали.

4. к сожалению gO , решение имеет проблемы при работе с именами файлов, которые содержат пробелы.

5. Поведение при удалении окон :bdelete было для меня неприемлемым, и я переключился на github.com/qpkorr/vim-bufkill (он удаляет буферы без закрытия окон).

Ответ №2:

Если приложение по умолчанию приемлемо, то работает простое использование :!open % в командном режиме. Вы всегда можете сопоставить это с подходящей комбинацией выноски в вашем файле конфигурации vim и т. Д.

Если вам нужно что-то, что работает в обычном режиме, вы можете попробовать что-то вроде следующего (я тоже использую это для открытия HTML-файлов) и изменить в соответствии с вашими потребностями:


if has('win32') || has ('win64')
autocmd FileType html nmap <Leader>g :silent ! start firefox "%"<cr>
elseif has('mac')
autocmd FileType html nmap <Leader>g :!open "%"<cr><cr>
endif

Комментарии:

1. Я использовал :nnoremap gO :!xdg-open <cfile><CR> , и он открывает файлы с помощью связанного по умолчанию приложения, но не файлы с a @ в пути, например ~/jim@webaddress.mail/paper.pdf , он захватывает только бит после @ . help <cfile> не говорит о многом. Кавычки вокруг <cfile> , подобные этому "<cfile>" , не помогают. Есть идеи?