@@ -4252,6 +4309,7 @@
// 货源状态
document.getElementById('supplyStatus').value = supply.supplyStatus || '';
+
// 联系人 - 使用contacts数组查找完整信息
document.getElementById('contactId').value = supply.contactId || '';
selectedContactId = supply.contactId || '';
@@ -4485,6 +4543,9 @@
// 重新加载联系人数据,确保最新
loadContacts();
+ // 重新加载联系人数据,确保最新
+ loadContacts();
+
// 尝试从localStorage加载保存的表单数据
const savedFormData = localStorage.getItem('supplyFormDraft');
if (savedFormData) {
@@ -4685,25 +4746,45 @@
updateEditImageDisplay();
}
- // 更新编辑页面图片显示
+
+ // 更新编辑页面媒体文件显示
function updateEditImageDisplay() {
const editUploadImages = document.getElementById('editUploadImages');
editUploadImages.innerHTML = '';
editCurrentImages.forEach(imageUrl => {
- const imageElement = document.createElement('div');
- imageElement.className = 'upload-image';
- imageElement.innerHTML = `
-
-
- `;
- editUploadImages.appendChild(imageElement);
+ const mediaElement = document.createElement('div');
+ mediaElement.className = 'upload-image';
+
+ let mediaContent;
+ if (imageUrl.startsWith('data:video/')) {
+ // 视频文件
+ mediaContent = `
+
+
+ `;
+ } else {
+ // 图片文件
+ mediaContent = `
+
+
+ `;
+ }
+
+ mediaElement.innerHTML = mediaContent;
+ editUploadImages.appendChild(mediaElement);
});
}
- // 为图片添加水印(前端Canvas实现)
+ // 为媒体文件添加水印(前端Canvas实现,仅处理图片,视频跳过)
function addWatermarkToImage(imageUrl) {
return new Promise((resolve, reject) => {
+ // 如果是视频文件,直接返回,不添加水印
+ if (imageUrl.startsWith('data:video/')) {
+ resolve(imageUrl);
+ return;
+ }
+
const img = new Image();
img.crossOrigin = 'anonymous'; // 允许跨域图片
@@ -4781,19 +4862,32 @@
event.target.value = '';
}
- // 渲染已上传图片
+ // 渲染已上传媒体文件(图片或视频)
function renderUploadedImages() {
const uploadArea = document.getElementById('uploadImages');
uploadArea.innerHTML = '';
- supplyData.uploadedImages.forEach((imageUrl, index) => {
- const imageElement = document.createElement('div');
- imageElement.className = 'upload-image';
- imageElement.innerHTML = `
-
-
- `;
- uploadArea.appendChild(imageElement);
+ supplyData.uploadedImages.forEach((mediaUrl, index) => {
+ const mediaElement = document.createElement('div');
+ mediaElement.className = 'upload-image';
+
+ let mediaContent;
+ if (mediaUrl.startsWith('data:video/')) {
+ // 视频文件
+ mediaContent = `
+
+
+ `;
+ } else {
+ // 图片文件
+ mediaContent = `
+
+
+ `;
+ }
+
+ mediaElement.innerHTML = mediaContent;
+ uploadArea.appendChild(mediaElement);
});
}
@@ -5103,6 +5197,7 @@
}
});
+
// 获取自动下架分钟数
const autoOfflineMinutes = document.getElementById('autoOfflineMinutes').value;
// 将分钟转换为小时(用于存储到数据库)
@@ -5115,6 +5210,7 @@
productName: document.getElementById('productName').value,
category: document.getElementById('category').value,
price: document.getElementById('price').value,
+
costprice: document.getElementById('costprice').value, // 添加采购价
quantity: quantities.join(','), // 将件数以英文逗号分隔的字符串形式提交
grossWeight: document.getElementById('grossWeight').value,
@@ -5271,12 +5367,28 @@
setupImageViewerEvents();
}
- // 更新预览图片
+ // 更新预览媒体文件(图片或视频)
function updatePreviewImage() {
const previewImage = document.getElementById('previewImage');
+ const previewVideo = document.getElementById('previewVideo');
const previewCounter = document.getElementById('previewCounter');
- previewImage.src = currentPreviewImages[currentPreviewIndex];
+ const mediaUrl = currentPreviewImages[currentPreviewIndex];
+
+ // 根据媒体类型显示相应的元素
+ if (mediaUrl.startsWith('data:video/') ||
+ mediaUrl.match(/\.(mp4|mov|avi|wmv|flv|webm|mkv)$/i) ||
+ mediaUrl.includes('video')) {
+ // 视频文件
+ previewVideo.src = mediaUrl;
+ previewVideo.style.display = 'block';
+ previewImage.style.display = 'none';
+ } else {
+ // 图片文件
+ previewImage.src = mediaUrl;
+ previewImage.style.display = 'block';
+ previewVideo.style.display = 'none';
+ }
// 更新图片计数器
if (previewCounter) {
@@ -5305,12 +5417,23 @@
// 关闭图片预览
function closeImagePreview() {
const previewModal = document.getElementById('imagePreview');
+ const previewVideo = document.getElementById('previewVideo');
+
+ // 停止视频播放并重置视频状态
+ if (previewVideo) {
+ previewVideo.pause();
+ previewVideo.src = '';
+ previewVideo.load();
+ }
+
previewModal.classList.remove('active');
}
- // 重置图片变换
+ // 重置媒体变换
function resetImageTransform() {
const previewImage = document.getElementById('previewImage');
+ const previewVideo = document.getElementById('previewVideo');
+
scale = 1;
lastScale = 1;
pointX = 0;
@@ -5319,10 +5442,17 @@
updateImageTransform();
}
- // 更新图片变换
+ // 更新媒体变换
function updateImageTransform() {
const previewImage = document.getElementById('previewImage');
- previewImage.style.transform = `translate(${pointX}px, ${pointY}px) scale(${scale})`;
+ const previewVideo = document.getElementById('previewVideo');
+
+ // 对当前显示的媒体元素应用变换
+ if (previewImage.style.display !== 'none') {
+ previewImage.style.transform = `translate(${pointX}px, ${pointY}px) scale(${scale})`;
+ } else if (previewVideo.style.display !== 'none') {
+ previewVideo.style.transform = `translate(${pointX}px, ${pointY}px) scale(${scale})`;
+ }
}
// 设置图片查看器事件
@@ -5665,11 +5795,17 @@
document.getElementById('editProductingValue').value = supply.producting || '';
editSelectedProducting = supply.producting || '';
+ // 产品包装
+ document.getElementById('editProductingDisplayText').textContent = supply.producting || '请选择产品包装';
+ document.getElementById('editProductingValue').value = supply.producting || '';
+ editSelectedProducting = supply.producting || '';
+
// 货源状态(使用按钮组)
const supplyStatus = supply.supplyStatus || '预售';
document.getElementById('editSupplyStatus').value = supplyStatus;
setEditSupplyStatus(supplyStatus);
+
// 分配联系人 - 使用contacts数组查找完整信息
document.getElementById('editContactId').value = supply.contactId || '';
editSelectedContactId = supply.contactId || '';
@@ -5689,6 +5825,7 @@
document.getElementById('editRegionDisplayText').textContent = supply.region || '请选择地区';
document.getElementById('editRegionValue').value = supply.region || '';
document.getElementById('editPrice').value = supply.price || '';
+
document.getElementById('editCostprice').value = supply.costprice || '';
document.getElementById('editGrossWeight').value = supply.grossWeight || '';
@@ -5696,6 +5833,7 @@
const autoOfflineMinutes = (parseFloat(supply.autoOfflineHours) || 24) * 60;
document.getElementById('editAutoOfflineMinutes').value = Math.round(autoOfflineMinutes);
+
// 规格和件数 - 支持中文逗号分隔和英文逗号分隔字符串
let specifications = [];
let quantities = [];
@@ -5800,6 +5938,7 @@
currentEditSupplyId = null;
// 重置发布模式状态
window.currentEditPublishMode = false;
+
// 恢复body滚动条
document.body.style.overflow = 'auto';
}
@@ -5941,11 +6080,60 @@
} else {
currentEditSpecInput.value = '';
}
+
+
+ } else {
+ // 否则,为旧的规格选择逻辑
+ if (editSelectedSpec.length > 0) {
+ document.getElementById('editSpecDisplayText').textContent = editSelectedSpec.join(', ');
+ document.getElementById('editSpecValue').value = JSON.stringify(editSelectedSpec);
+ // 根据选中的规格数量动态调整件数输入框数量
+ adjustEditQuantityInputs();
+ } else {
+ document.getElementById('editSpecDisplayText').textContent = '请选择规格';
+ document.getElementById('editSpecValue').value = '[]';
+ }
+
}
hideEditSpecSelectModal();
}
+
+ // 添加编辑件数输入项
+ function addEditQuantityItem() {
+ const container = document.getElementById('editQuantityContainer');
+ const quantityItem = document.createElement('div');
+ quantityItem.className = 'quantity-item';
+ quantityItem.innerHTML = `
+
+
+ `;
+ container.insertBefore(quantityItem, container.lastElementChild);
+ }
+
+ // 删除编辑件数输入项
+ function removeEditQuantityItem(btn) {
+ const container = document.getElementById('editQuantityContainer');
+ const quantityItems = container.querySelectorAll('.quantity-item');
+
+ // 至少保留一个件数输入项
+ if (quantityItems.length > 1) {
+ const quantityItem = btn.parentElement;
+ quantityItem.remove();
+ }
+ }
+
// 根据选中的规格数量调整编辑件数输入框数量
+ function adjustEditQuantityInputs() {
+ const container = document.getElementById('editQuantityContainer');
+ const quantityItems = container.querySelectorAll('.quantity-item');
+ const specCount = editSelectedSpec.length;
+
+ // 如果规格数量大于件数输入框数量,添加缺少的输入框
+ while (quantityItems.length < specCount) {
+ addEditQuantityItem();
+ }
+ }
// 添加编辑规格和件数对
@@ -5964,12 +6152,19 @@
// 删除编辑规格和件数对
function removeEditSpecQuantityPair(btn) {
const pair = btn.parentElement;
- const specInput = pair.querySelector('.spec-value');
- const quantityInput = pair.querySelector('.quantity-input');
+ const container = pair.parentElement;
+ const pairs = container.querySelectorAll('.spec-quantity-pair');
- // 清除当前对的输入值
- if (specInput) specInput.value = '';
- if (quantityInput) quantityInput.value = '';
+ // 如果超过一个对,移除整个对元素
+ if (pairs.length > 1) {
+ pair.remove();
+ } else {
+ // 否则,只清除输入值
+ const specInput = pair.querySelector('.spec-value');
+ const quantityInput = pair.querySelector('.quantity-input');
+ if (specInput) specInput.value = '';
+ if (quantityInput) quantityInput.value = '';
+ }
}
// 为编辑规格和件数对显示规格选择弹窗
@@ -6627,6 +6822,7 @@
}
});
+
// 获取自动下架分钟数
const autoOfflineMinutes = document.getElementById('editAutoOfflineMinutes')?.value;
// 将分钟转换为小时(用于存储到数据库)
@@ -6644,6 +6840,7 @@
sourceType: document.getElementById('editSourceType').value,
category: document.getElementById('editCategory').value,
price: document.getElementById('editPrice').value,
+
costprice: document.getElementById('editCostprice').value, // 添加采购价
quantity: quantities.join(','), // 将件数以英文逗号分隔的字符串形式提交
grossWeight: document.getElementById('editGrossWeight').value,
@@ -6654,6 +6851,7 @@
description: document.getElementById('editDescription').value,
region: document.getElementById('editRegionValue').value,
contactId: document.getElementById('editContactId').value,
+
imageUrls: editCurrentImages, // 添加编辑后的图片列表
autoOfflineTime: autoOfflineTime, // 自动下架时间
autoOfflineDays: null, // 不再使用天数,设置为null
@@ -6732,6 +6930,7 @@
}
// 隐藏编辑货源模态框
+
// 处理点击模态框外部关闭
window.onclick = function(event) {
// 确保只处理click事件,不处理拖拽选择文本导致的mouseup事件
diff --git a/tatus b/tatus
new file mode 100644
index 0000000..2a6a1dc
--- /dev/null
+++ b/tatus
@@ -0,0 +1,410 @@
+
+ SSUUMMMMAARRYY OOFF LLEESSSS CCOOMMMMAANNDDSS
+
+ Commands marked with * may be preceded by a number, _N.
+ Notes in parentheses indicate the behavior if _N is given.
+ A key preceded by a caret indicates the Ctrl key; thus ^K is ctrl-K.
+
+ h H Display this help.
+ q :q Q :Q ZZ Exit.
+ ---------------------------------------------------------------------------
+
+ MMOOVVIINNGG
+
+ e ^E j ^N CR * Forward one line (or _N lines).
+ y ^Y k ^K ^P * Backward one line (or _N lines).
+ ESC-j * Forward one file line (or _N file lines).
+ ESC-k * Backward one file line (or _N file lines).
+ f ^F ^V SPACE * Forward one window (or _N lines).
+ b ^B ESC-v * Backward one window (or _N lines).
+ z * Forward one window (and set window to _N).
+ w * Backward one window (and set window to _N).
+ ESC-SPACE * Forward one window, but don't stop at end-of-file.
+ ESC-b * Backward one window, but don't stop at beginning-of-file.
+ d ^D * Forward one half-window (and set half-window to _N).
+ u ^U * Backward one half-window (and set half-window to _N).
+ ESC-) RightArrow * Right one half screen width (or _N positions).
+ ESC-( LeftArrow * Left one half screen width (or _N positions).
+ ESC-} ^RightArrow Right to last column displayed.
+ ESC-{ ^LeftArrow Left to first column.
+ F Forward forever; like "tail -f".
+ ESC-F Like F but stop when search pattern is found.
+ r ^R ^L Repaint screen.
+ R Repaint screen, discarding buffered input.
+ ---------------------------------------------------
+ Default "window" is the screen height.
+ Default "half-window" is half of the screen height.
+ ---------------------------------------------------------------------------
+
+ SSEEAARRCCHHIINNGG
+
+ /_p_a_t_t_e_r_n * Search forward for (_N-th) matching line.
+ ?_p_a_t_t_e_r_n * Search backward for (_N-th) matching line.
+ n * Repeat previous search (for _N-th occurrence).
+ N * Repeat previous search in reverse direction.
+ ESC-n * Repeat previous search, spanning files.
+ ESC-N * Repeat previous search, reverse dir. & spanning files.
+ ^O^N ^On * Search forward for (_N-th) OSC8 hyperlink.
+ ^O^P ^Op * Search backward for (_N-th) OSC8 hyperlink.
+ ^O^L ^Ol Jump to the currently selected OSC8 hyperlink.
+ ESC-u Undo (toggle) search highlighting.
+ ESC-U Clear search highlighting.
+ &_p_a_t_t_e_r_n * Display only matching lines.
+ ---------------------------------------------------
+ Search is case-sensitive unless changed with -i or -I.
+ A search pattern may begin with one or more of:
+ ^N or ! Search for NON-matching lines.
+ ^E or * Search multiple files (pass thru END OF FILE).
+ ^F or @ Start search at FIRST file (for /) or last file (for ?).
+ ^K Highlight matches, but don't move (KEEP position).
+ ^R Don't use REGULAR EXPRESSIONS.
+ ^S _n Search for match in _n-th parenthesized subpattern.
+ ^W WRAP search if no match found.
+ ^L Enter next character literally into pattern.
+ ---------------------------------------------------------------------------
+
+ JJUUMMPPIINNGG
+
+ g < ESC-< * Go to first line in file (or line _N).
+ G > ESC-> * Go to last line in file (or line _N).
+ p % * Go to beginning of file (or _N percent into file).
+ t * Go to the (_N-th) next tag.
+ T * Go to the (_N-th) previous tag.
+ { ( [ * Find close bracket } ) ].
+ } ) ] * Find open bracket { ( [.
+ ESC-^F _<_c_1_> _<_c_2_> * Find close bracket _<_c_2_>.
+ ESC-^B _<_c_1_> _<_c_2_> * Find open bracket _<_c_1_>.
+ ---------------------------------------------------
+ Each "find close bracket" command goes forward to the close bracket
+ matching the (_N-th) open bracket in the top line.
+ Each "find open bracket" command goes backward to the open bracket
+ matching the (_N-th) close bracket in the bottom line.
+
+ m_<_l_e_t_t_e_r_> Mark the current top line with .
+ M_<_l_e_t_t_e_r_> Mark the current bottom line with .
+ '_<_l_e_t_t_e_r_> Go to a previously marked position.
+ '' Go to the previous position.
+ ^X^X Same as '.
+ ESC-m_<_l_e_t_t_e_r_> Clear a mark.
+ ---------------------------------------------------
+ A mark is any upper-case or lower-case letter.
+ Certain marks are predefined:
+ ^ means beginning of the file
+ $ means end of the file
+ ---------------------------------------------------------------------------
+
+ CCHHAANNGGIINNGG FFIILLEESS
+
+ :e [_f_i_l_e] Examine a new file.
+ ^X^V Same as :e.
+ :n * Examine the (_N-th) next file from the command line.
+ :p * Examine the (_N-th) previous file from the command line.
+ :x * Examine the first (or _N-th) file from the command line.
+ ^O^O Open the currently selected OSC8 hyperlink.
+ :d Delete the current file from the command line list.
+ = ^G :f Print current file name.
+ ---------------------------------------------------------------------------
+
+ MMIISSCCEELLLLAANNEEOOUUSS CCOOMMMMAANNDDSS
+
+ -_<_f_l_a_g_> Toggle a command line option [see OPTIONS below].
+ --_<_n_a_m_e_> Toggle a command line option, by name.
+ __<_f_l_a_g_> Display the setting of a command line option.
+ ___<_n_a_m_e_> Display the setting of an option, by name.
+ +_c_m_d Execute the less cmd each time a new file is examined.
+
+ !_c_o_m_m_a_n_d Execute the shell command with $SHELL.
+ #_c_o_m_m_a_n_d Execute the shell command, expanded like a prompt.
+ |XX_c_o_m_m_a_n_d Pipe file between current pos & mark XX to shell command.
+ s _f_i_l_e Save input to a file.
+ v Edit the current file with $VISUAL or $EDITOR.
+ V Print version number of "less".
+ ---------------------------------------------------------------------------
+
+ OOPPTTIIOONNSS
+
+ Most options may be changed either on the command line,
+ or from within less by using the - or -- command.
+ Options may be given in one of two forms: either a single
+ character preceded by a -, or a name preceded by --.
+
+ -? ........ --help
+ Display help (from command line).
+ -a ........ --search-skip-screen
+ Search skips current screen.
+ -A ........ --SEARCH-SKIP-SCREEN
+ Search starts just after target line.
+ -b [_N] .... --buffers=[_N]
+ Number of buffers.
+ -B ........ --auto-buffers
+ Don't automatically allocate buffers for pipes.
+ -c ........ --clear-screen
+ Repaint by clearing rather than scrolling.
+ -d ........ --dumb
+ Dumb terminal.
+ -D xx_c_o_l_o_r . --color=xx_c_o_l_o_r
+ Set screen colors.
+ -e -E .... --quit-at-eof --QUIT-AT-EOF
+ Quit at end of file.
+ -f ........ --force
+ Force open non-regular files.
+ -F ........ --quit-if-one-screen
+ Quit if entire file fits on first screen.
+ -g ........ --hilite-search
+ Highlight only last match for searches.
+ -G ........ --HILITE-SEARCH
+ Don't highlight any matches for searches.
+ -h [_N] .... --max-back-scroll=[_N]
+ Backward scroll limit.
+ -i ........ --ignore-case
+ Ignore case in searches that do not contain uppercase.
+ -I ........ --IGNORE-CASE
+ Ignore case in all searches.
+ -j [_N] .... --jump-target=[_N]
+ Screen position of target lines.
+ -J ........ --status-column
+ Display a status column at left edge of screen.
+ -k _f_i_l_e ... --lesskey-file=_f_i_l_e
+ Use a compiled lesskey file.
+ -K ........ --quit-on-intr
+ Exit less in response to ctrl-C.
+ -L ........ --no-lessopen
+ Ignore the LESSOPEN environment variable.
+ -m -M .... --long-prompt --LONG-PROMPT
+ Set prompt style.
+ -n ......... --line-numbers
+ Suppress line numbers in prompts and messages.
+ -N ......... --LINE-NUMBERS
+ Display line number at start of each line.
+ -o [_f_i_l_e] .. --log-file=[_f_i_l_e]
+ Copy to log file (standard input only).
+ -O [_f_i_l_e] .. --LOG-FILE=[_f_i_l_e]
+ Copy to log file (unconditionally overwrite).
+ -p _p_a_t_t_e_r_n . --pattern=[_p_a_t_t_e_r_n]
+ Start at pattern (from command line).
+ -P [_p_r_o_m_p_t] --prompt=[_p_r_o_m_p_t]
+ Define new prompt.
+ -q -Q .... --quiet --QUIET --silent --SILENT
+ Quiet the terminal bell.
+ -r -R .... --raw-control-chars --RAW-CONTROL-CHARS
+ Output "raw" control characters.
+ -s ........ --squeeze-blank-lines
+ Squeeze multiple blank lines.
+ -S ........ --chop-long-lines
+ Chop (truncate) long lines rather than wrapping.
+ -t _t_a_g .... --tag=[_t_a_g]
+ Find a tag.
+ -T [_t_a_g_s_f_i_l_e] --tag-file=[_t_a_g_s_f_i_l_e]
+ Use an alternate tags file.
+ -u -U .... --underline-special --UNDERLINE-SPECIAL
+ Change handling of backspaces, tabs and carriage returns.
+ -V ........ --version
+ Display the version number of "less".
+ -w ........ --hilite-unread
+ Highlight first new line after forward-screen.
+ -W ........ --HILITE-UNREAD
+ Highlight first new line after any forward movement.
+ -x [_N[,...]] --tabs=[_N[,...]]
+ Set tab stops.
+ -X ........ --no-init
+ Don't use termcap init/deinit strings.
+ -y [_N] .... --max-forw-scroll=[_N]
+ Forward scroll limit.
+ -z [_N] .... --window=[_N]
+ Set size of window.
+ -" [_c[_c]] . --quotes=[_c[_c]]
+ Set shell quote characters.
+ -~ ........ --tilde
+ Don't display tildes after end of file.
+ -# [_N] .... --shift=[_N]
+ Set horizontal scroll amount (0 = one half screen width).
+
+ --exit-follow-on-close
+ Exit F command on a pipe when writer closes pipe.
+ --file-size
+ Automatically determine the size of the input file.
+ --follow-name
+ The F command changes files if the input file is renamed.
+ --form-feed
+ Stop scrolling when a form feed character is reached.
+ --header=[_L[,_C[,_N]]]
+ Use _L lines (starting at line _N) and _C columns as headers.
+ --incsearch
+ Search file as each pattern character is typed in.
+ --intr=[_C]
+ Use _C instead of ^X to interrupt a read.
+ --lesskey-context=_t_e_x_t
+ Use lesskey source file contents.
+ --lesskey-src=_f_i_l_e
+ Use a lesskey source file.
+ --line-num-width=[_N]
+ Set the width of the -N line number field to _N characters.
+ --match-shift=[_N]
+ Show at least _N characters to the left of a search match.
+ --modelines=[_N]
+ Read _N lines from the input file and look for vim modelines.
+ --mouse
+ Enable mouse input.
+ --no-edit-warn
+ Don't warn when using v command on a file opened via LESSOPEN.
+ --no-keypad
+ Don't send termcap keypad init/deinit strings.
+ --no-histdups
+ Remove duplicates from command history.
+ --no-number-headers
+ Don't give line numbers to header lines.
+ --no-paste
+ Ignore pasted input.
+ --no-search-header-lines
+ Searches do not include header lines.
+ --no-search-header-columns
+ Searches do not include header columns.
+ --no-search-headers
+ Searches do not include header lines or columns.
+ --no-vbell
+ Disable the terminal's visual bell.
+ --redraw-on-quit
+ Redraw final screen when quitting.
+ --rscroll=[_C]
+ Set the character used to mark truncated lines.
+ --save-marks
+ Retain marks across invocations of less.
+ --search-options=[EFKNRW-]
+ Set default options for every search.
+ --show-preproc-errors
+ Display a message if preprocessor exits with an error status.
+ --proc-backspace
+ Process backspaces for bold/underline.
+ --PROC-BACKSPACE
+ Treat backspaces as control characters.
+ --proc-return
+ Delete carriage returns before newline.
+ --PROC-RETURN
+ Treat carriage returns as control characters.
+ --proc-tab
+ Expand tabs to spaces.
+ --PROC-TAB
+ Treat tabs as control characters.
+ --status-col-width=[_N]
+ Set the width of the -J status column to _N characters.
+ --status-line
+ Highlight or color the entire line containing a mark.
+ --use-backslash
+ Subsequent options use backslash as escape char.
+ --use-color
+ Enables colored text.
+ --wheel-lines=[_N]
+ Each click of the mouse wheel moves _N lines.
+ --wordwrap
+ Wrap lines at spaces.
+
+
+ ---------------------------------------------------------------------------
+
+ LLIINNEE EEDDIITTIINNGG
+
+ These keys can be used to edit text being entered
+ on the "command line" at the bottom of the screen.
+
+ RightArrow ..................... ESC-l ... Move cursor right one character.
+ LeftArrow ...................... ESC-h ... Move cursor left one character.
+ ctrl-RightArrow ESC-RightArrow ESC-w ... Move cursor right one word.
+ ctrl-LeftArrow ESC-LeftArrow ESC-b ... Move cursor left one word.
+ HOME ........................... ESC-0 ... Move cursor to start of line.
+ END ............................ ESC-$ ... Move cursor to end of line.
+ BACKSPACE ................................ Delete char to left of cursor.
+ DELETE ......................... ESC-x ... Delete char under cursor.
+ ctrl-BACKSPACE ESC-BACKSPACE ........... Delete word to left of cursor.
+ ctrl-DELETE .... ESC-DELETE .... ESC-X ... Delete word under cursor.
+ ctrl-U ......... ESC (MS-DOS only) ....... Delete entire line.
+ UpArrow ........................ ESC-k ... Retrieve previous command line.
+ DownArrow ...................... ESC-j ... Retrieve next command line.
+ TAB ...................................... Complete filename & cycle.
+ SHIFT-TAB ...................... ESC-TAB Complete filename & reverse cycle.
+ ctrl-L ................................... Complete filename, list all.
+
+ SSUUMMMMAARRYY OOFF LLEESSSS CCOOMMMMAANNDDSS
+
+ Commands marked with * may be preceded by a number, _N.
+ Notes in parentheses indicate the behavior if _N is given.
+ A key preceded by a caret indicates the Ctrl key; thus ^K is ctrl-K.
+
+ h H Display this help.
+ q :q Q :Q ZZ Exit.
+ ---------------------------------------------------------------------------
+
+ MMOOVVIINNGG
+
+ e ^E j ^N CR * Forward one line (or _N lines).
+ y ^Y k ^K ^P * Backward one line (or _N lines).
+ ESC-j * Forward one file line (or _N file lines).
+ ESC-k * Backward one file line (or _N file lines).
+ f ^F ^V SPACE * Forward one window (or _N lines).
+ b ^B ESC-v * Backward one window (or _N lines).
+ z * Forward one window (and set window to _N).
+ w * Backward one window (and set window to _N).
+ ESC-SPACE * Forward one window, but don't stop at end-of-file.
+ ESC-b * Backward one window, but don't stop at beginning-of-file.
+ d ^D * Forward one half-window (and set half-window to _N).
+ u ^U * Backward one half-window (and set half-window to _N).
+ ESC-) RightArrow * Right one half screen width (or _N positions).
+ ESC-( LeftArrow * Left one half screen width (or _N positions).
+ ESC-} ^RightArrow Right to last column displayed.
+ ESC-{ ^LeftArrow Left to first column.
+ F Forward forever; like "tail -f".
+ ESC-F Like F but stop when search pattern is found.
+ r ^R ^L Repaint screen.
+ R Repaint screen, discarding buffered input.
+ ---------------------------------------------------
+ Default "window" is the screen height.
+ Default "half-window" is half of the screen height.
+ ---------------------------------------------------------------------------
+
+ SSEEAARRCCHHIINNGG
+
+ /_p_a_t_t_e_r_n * Search forward for (_N-th) matching line.
+ ?_p_a_t_t_e_r_n * Search backward for (_N-th) matching line.
+ n * Repeat previous search (for _N-th occurrence).
+ N * Repeat previous search in reverse direction.
+ ESC-n * Repeat previous search, spanning files.
+ ESC-N * Repeat previous search, reverse dir. & spanning files.
+ ^O^N ^On * Search forward for (_N-th) OSC8 hyperlink.
+ ^O^P ^Op * Search backward for (_N-th) OSC8 hyperlink.
+ ^O^L ^Ol Jump to the currently selected OSC8 hyperlink.
+ ESC-u Undo (toggle) search highlighting.
+ ESC-U Clear search highlighting.
+ &_p_a_t_t_e_r_n * Display only matching lines.
+ ---------------------------------------------------
+ Search is case-sensitive unless changed with -i or -I.
+ A search pattern may begin with one or more of:
+ ^N or ! Search for NON-matching lines.
+ ^E or * Search multiple files (pass thru END OF FILE).
+ ^F or @ Start search at FIRST file (for /) or last file (for ?).
+ ^K Highlight matches, but don't move (KEEP position).
+ ^R Don't use REGULAR EXPRESSIONS.
+ ^S _n Search for match in _n-th parenthesized subpattern.
+ ^W WRAP search if no match found.
+ ^L Enter next character literally into pattern.
+ ---------------------------------------------------------------------------
+
+ JJUUMMPPIINNGG
+
+ g < ESC-< * Go to first line in file (or line _N).
+ G > ESC-> * Go to last line in file (or line _N).
+ p % * Go to beginning of file (or _N percent into file).
+ t * Go to the (_N-th) next tag.
+ T * Go to the (_N-th) previous tag.
+ { ( [ * Find close bracket } ) ].
+ } ) ] * Find open bracket { ( [.
+ ESC-^F _<_c_1_> _<_c_2_> * Find close bracket _<_c_2_>.
+ ESC-^B _<_c_1_> _<_c_2_> * Find open bracket _<_c_1_>.
+ ---------------------------------------------------
+ Each "find close bracket" command goes forward to the close bracket
+ matching the (_N-th) open bracket in the top line.
+ Each "find open bracket" command goes backward to the open bracket
+ matching the (_N-th) close bracket in the bottom line.
+
+ m_<_l_e_t_t_e_r_> Mark the current top line with .
+ M_<_l_e_t_t_e_r_> Mark the current bottom line with .
+ '_<_l_e_t_t_e_r_> Go to a previously marked position.
+ '' Go to the previous position.