Markdown 语法在 less(分页器)中的语法高亮

4

当我使用vim编辑markdown文件时,我可以通过vim-markdown和vim-markdown-preview插件获得漂亮的语法着色。

我希望在使用less(分页器)查看文件时也能够获得同样的语法着色。有没有办法让less进行语法着色?或者是否有其他具备此功能的分页器?


5
我也看了一下 highlight,它的工作方式类似,并且输出的颜色更漂亮(在我看来)。 LESSOPEN="| /usr/local/bin/highlight --out-format=xterm256 %s" - MERM
1
另外,我发现vimpager可以给我提供与vim相同的语法高亮:)如果您使用精简版本的.vimrc作为.vimpagerrc,则它可以很好地工作。请参见此处以获取一些建议。 - MERM
我最终设置了我的bash配置,使得我的PAGER更喜欢使用vimpager或less,并使用highlight,然后是src-hilite-lesspipe.sh。 - MERM
你应该把你的第一个评论放到答案里 - 它比被接受的答案更好地回答了问题。 - jmetz
建议:在您的代码中使用更多注释。 因为:如果另一个用户患有绿色盲,颜色可能会看起来相似和/或与背景颜色没有足够的对比度。 WCAG:可访问的颜色和对比度比率为色彩无障碍设计终端. - Stef
5个回答

2

这是一种使用 less 在控制台中查看 GitHub Markdown 文件的方法。

  1. 安装 pandoclynx

    a. 对于 Ubuntu(和 WSL): sudo apt install pandoc lynx

    b. 对于 MacOS: brew install pandoc lynx

  2. 将以下脚本文件命名为 less 并将其保存在 PATH 上的某个位置,例如 /usr/local/bin

  3. 使脚本可执行,例如 chmod a+x /usr/local/bin/less
  4. 输入 hash -r 或者运行 /usr/bin/less 而不是运行该脚本
#!/bin/bash

if [ "${1##*.}" == md ]; then
  pandoc "$1" | lynx -stdin
else
  /usr/bin/less "$1"
fi

1
你可以使用e2ansi,这个包使用Emacs批处理模式来执行语法高亮。你可以通过定义LESSOPEN环境变量来配置less使用它。
为了让Emacs语法高亮MarkDown,你还需要安装markdown-mode
(最后,要想在less中获得与编辑器相同的语法高亮,我猜你需要切换到Emacs ;) 当然,鉴于Emacs带有一个名为Evil Mode的Vim兼容包,情况可能没有看起来那么糟糕。)

0

使用Vim Markdown highlighting (and folding),最直接的解决方案是在只读模式下调用vim,可以使用vim -R或者(至少在Ubuntu上)更加优雅的方式:

$ view filename.md

在你的.vimrc文件的最底部添加以下内容,view将会像less一样运行,并且还能享受你最喜欢的语法高亮(不仅限于markdown!)和折叠功能:
" less behaviour for view
" https://dev59.com/UYbca4cB1Zd3GeqPaMYE#39836959

" http://vim.wikia.com/wiki/Using_vim_as_a_syntax-highlighting_pager
function! LessBehaviour()
    if (!&modifiable || &ro)
        set nonumber
        set nospell
        set laststatus=0    " Status line
        set cmdheight=1
        set guioptions=aiMr    " No menu bar, nor tool bar
        noremap u <C-u>
        noremap d <C-d>
        noremap q :q<CR>
    endif
endfunction

" https://vi.stackexchange.com/a/9101/3168
augroup ReadOnly
    au!
    au VimEnter * :call LessBehaviour() 
augroup END

还有一个更严格的less.sh脚本。在我的系统中,它与vim捆绑在一起。要找到它,请使用:

$ find /usr/share/vim -name less.sh

然而,与上面列出的脚本相反,折叠不会在这个less.sh中起作用。


0

我现在使用的顺序是:vimpagerhighlightsrc-hilite-lesspipe.shless,然后是more;使用bash来确定我所在系统上可用的内容。

这是我最终得出的结果:

.bash_profile

#############################################
#   Pager                                   #
#############################################
PAGER='more'
export PAGER

if (have less); then
  LESS='-i -R -e -X -z-2 -M -P%t?f%f :stdin .?pb%pb\%:?lbLine %lb:?bbByte %bb:-...'
  LESSCHARSET='utf-8'
  LESSHISTFILE=-
  PAGER='less'
  MANPAGER='less'

  export LESS LESSCHARSET LESSHISTFILE PAGER MANPAGER

  export LESS_TERMCAP_so="$(tput bold; tput setaf 0; tput setab 4)"    # begin standout
  export LESS_TERMCAP_se="$(tput sgr0)"                                # end   standout
  export LESS_TERMCAP_us="$(tput smul; tput setaf 3)"                  # begin underscore
  export LESS_TERMCAP_ue="$(tput rmul; tput sgr0)"                     # end   underscore
  export LESS_TERMCAP_mr="$(tput rev)"                                 # begin reverse
  export LESS_TERMCAP_mb="$(tput blink)"                               # begin blink
  export LESS_TERMCAP_mh="$(tput dim)"                                 # begin dim
  export LESS_TERMCAP_md="$(tput bold; tput setaf 6)"                  # begin bold
  export LESS_TERMCAP_ZH="$(tput sitm)"                                # begin italics
  export LESS_TERMCAP_ZR="$(tput ritm)"                                # end   italics
  export LESS_TERMCAP_me="$(tput sgr0)"                                # end all modes

# make less more friendly for non-text input files, see lesspipe(1)
  [ -x /usr/bin/lesspipe ] && eval "$(lesspipe)"

  if (have src-hilite-lesspipe.sh); then
    export LESSOPEN="| src-hilite-lesspipe.sh %s"
  fi

  if (have highlight); then
    export LESSOPEN="| highlight --out-format=xterm256 --style=solarized-dark %s"
  fi

fi

if (have vimpager); then
  export PAGER='vimpager'
fi

if (have vimcat); then
  alias v='vimcat'
fi

注意:have是一个Bash函数,用于检查命令是否可用。 - MERM
这个答案如果你包含你的have函数,或者(更好的是)用一个不使用子shell的普遍可用的替代方法来替换,会更好。请参阅https://stackoverflow.com/questions/592620/how-can-i-check-if-a-program-exists-from-a-bash-script/677212#677212 - undefined

-3

less本身不支持语法高亮,但是您可以使用GNU-source-highlight 来实现。

首先,您需要安装它。例如,在 RHEL/Centos/Fedora 上(以 root 用户身份):

$ yum install source-highlight

在 Debian/Ubuntu 上

$ apt-get install source-highlight

然后配置您的分页器以使用它:

$ export LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s"
$ export LESS=" -R"

现在,它应该只是替换less

$ less README.md # pager with syntax highlighting

4
有人用这种方法取得了实际的结果吗?在Ubuntu 14.04上,它可以为less添加语法高亮,但不支持Markdown;这是有道理的,因为https://www.gnu.org/software/src-highlite/上没有列出Markdown。 - gou1
2
这里有一个关于Markdown支持的未解决Bug:http://savannah.gnu.org/bugs/?46542 - Daniel Compton
1
应该是:apt-get install source-highlight - muenalan
1
@muenalan 确实,不确定我是怎么错过那个的。已经编辑并修复了。感谢你的注意! - Mureinik
2
截至今天,source-highlight仍不支持markdown(这实际上使得这个答案回答原始问题)。 - René

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接