憶えたくなんかねーのよ、こんなの。
pygments は version 2.0.2 でも、DOS プロンプト、PowerShell セッションの lexer がないのね。で、自力で書いちゃった:
1 class MSDOSSessionLexer(Lexer):
2 """
3 Lexer for simplistic MSDOS sessions.
4
5 .. versionadded:: 2.0
6 """
7
8 name = 'MSDOS Session'
9 aliases = ['doscon']
10 filenames = []
11 mimetypes = []
12
13 def get_tokens_unprocessed(self, text):
14 bashlexer = BatchLexer(**self.options)
15
16 pos = 0
17 curcode = ''
18 insertions = []
19
20 for match in line_re.finditer(text):
21 line = match.group()
22 m = re.match(r'^([^>]+>)(.*\n?)', line)
23 if m:
24 # To support output lexers (say diff output), the output
25 # needs to be broken by prompts whenever the output lexer
26 # changes.
27 if not insertions:
28 pos = match.start()
29
30 insertions.append((len(curcode),
31 [(0, Generic.Prompt, m.group(1))]))
32 curcode += m.group(2)
33 elif line.startswith('More? '):
34 insertions.append((len(curcode),
35 [(0, Generic.Prompt, line[:len('More? ')])]))
36 curcode += line[len('More? '):]
37 else:
38 if insertions:
39 toks = bashlexer.get_tokens_unprocessed(curcode)
40 for i, t, v in do_insertions(insertions, toks):
41 yield pos+i, t, v
42 yield match.start(), Generic.Output, line
43 insertions = []
44 curcode = ''
45 if insertions:
46 for i, t, v in do_insertions(insertions,
47 bashlexer.get_tokens_unprocessed(curcode)):
48 yield pos+i, t, v
49
50
51 class PowerShellSessionLexer(Lexer):
52 """
53 Lexer for simplistic Windows PowerShell sessions.
54
55 .. versionadded:: 2.0
56 """
57
58 name = 'PowerShell Session'
59 aliases = ['ps1con']
60 filenames = []
61 mimetypes = []
62
63 def get_tokens_unprocessed(self, text):
64 bashlexer = PowerShellLexer(**self.options)
65
66 pos = 0
67 curcode = ''
68 insertions = []
69
70 for match in line_re.finditer(text):
71 line = match.group()
72 m = re.match(r'^(PS [^>]+> )(.*\n?)', line)
73 if m:
74 # To support output lexers (say diff output), the output
75 # needs to be broken by prompts whenever the output lexer
76 # changes.
77 if not insertions:
78 pos = match.start()
79
80 insertions.append((len(curcode),
81 [(0, Generic.Prompt, m.group(1))]))
82 curcode += m.group(2)
83 elif line.startswith('>> '):
84 insertions.append((len(curcode),
85 [(0, Generic.Prompt, line[:len('>> ')])]))
86 curcode += line[len('>> '):]
87 else:
88 if insertions:
89 toks = bashlexer.get_tokens_unprocessed(curcode)
90 for i, t, v in do_insertions(insertions, toks):
91 yield pos+i, t, v
92 yield match.start(), Generic.Output, line
93 insertions = []
94 curcode = ''
95 if insertions:
96 for i, t, v in do_insertions(insertions,
97 bashlexer.get_tokens_unprocessed(curcode)):
98 yield pos+i, t, v
shell.py 内 __all__ にはこの2つを追加した上で、(おそらく本来は自動生成されると思われる)_mapping.py をメンテ:
1 # ...
2 LEXERS = {
3 # ...
4 'MSDOSSessionLexer': ('pygments.lexers.shell', 'MSDOS Session', ('doscon',), (), (),),
5 # ...
6 'PowerShellSessionLexer': ('pygments.lexers.shell', 'PowerShell Session', ('ps1con',), (), (),),
7 # ...
そうなんだけどさ、あたしは日常的に MSYS ユーザなんであって、剥き身のコマンドプロンプトにいる時間なんか、一日5秒にも満たないわけよ。(プロンプト起動してそのまますぐさま bash とタイプする。)
はじめてみたぞ、dos の PS2(*):
1 Microsoft Windows [Version 6.1.7601]
2 Copyright (c) 2009 Microsoft Corporation. All rights reserved.
3
4 C:\Users\hhsprings>echo 1
5 1
6
7 C:\Users\hhsprings>\
8 '\' は、内部コマンドまたは外部コマンド、
9 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
10
11 C:\Users\hhsprings>_
12 '_' は、内部コマンドまたは外部コマンド、
13 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
14
15 C:\Users\hhsprings>echo ^
16 More? 1
17 1
18
19 C:\Users\hhsprings>
継続行は「^」なんだと。
powershell は python 対話モードや unix シェルと似て、不完全行では自動で継続しますね:
1 PS C:\Users\hhsprings> $a =
2 >> 1
3 >>
4 PS C:\Users\hhsprings> $a
5 1
6 PS C:\Users\hhsprings>
追記:
このサイトでは結構出てきてるけど一応。unix系シェルでは、「バックスラッシュ」でも継続行:
1 me@host: ~$ ls -l | \
2 > awk '{print $1, $2}'
3 total 33
4 -rw-r--r-- 1
5 -rw-r--r-- 1
6 -rw-r--r-- 1
7 -rw-r--r-- 1
8 -rw-r--r-- 1
9 -rw-r--r-- 1
10 -rwxr-xr-x 1
11 -rwxr-xr-x 1
12 -rwxr-xr-x 1
13 drwxr-xr-x 6
14 drwxr-xr-x 8
15 me@host: ~$
powershellと同じで、不完全行では自動的に継続行になります。