+ 20.02.2025 +19.05.2025
Fragmenty konfiguracji Notepad++ i Total Commander

Notepad++

  • “%AppData%\Notepad++\shortcuts.xml”:
    <UserDefinedCommands>
        <Command name="Transl. Google PL to EN" Ctrl="no" Alt="no" Shift="no" Key="0">https://translate.google.com/?sl=pl&amp;tl=en&amp;text=$(CURRENT_WORD)</Command>
        <Command name="Transl. Bing PL to EN" Ctrl="no" Alt="no" Shift="no" Key="0">https://www.bing.com/translator/?from=pl&amp;to=en&amp;text=$(CURRENT_WORD)</Command>
        <Command name="Transl. DeepL PL to EN" Ctrl="no" Alt="no" Shift="no" Key="0">https://www.deepl.com/translator#pl/en/$(CURRENT_WORD)</Command>

ESLint NppExec

npp_console 1
eslint.cmd --fix-dry-run "$(CURRENT_DIRECTORY)\$(FILE_NAME)"

NppExec \ Console Output Filters \ HighLight:
[x] %LINE%:%CHAR% (jakiś kolor)

Zob. też

TotalCommander

Od wersji TC 10.00 w menu startowym można dodawać tekst do każdego elementu listy %S, %R, %P%S, %T%R. Wyrażenie musi być wtedy w cudzysłowach, np. “%P%S.bak”. Od wersji 11.50 jest to rozszerzone do kolejnych dopisków, np. “beforename%Sbeforeext%Eafterext”. Wygląda na to, że teraz podając “%P%S” czy “%S” itp. uzyskuje się elementy listy WSZYSTKIE otoczone cudzysłowami (a nie tylko te zawierające spacje). Czyli nie ma problemu z plikiem, którego nazwa zawiera nawiasy otoczonym nawiasami jakiegoś polecenia, np. (…“a(b).txt”… ).
Zresztą teraz nawet w liście %S (bez cudzysłowów) także taki plik występuje jako “a(b).txt”, tj. otoczony cudzysłowami.

TC menu Start. Uwaga numeracja musi być ciągła. Można albo dopisać coś na końcu sekcji, albo wstawić trochę pustych poleceń i potem je zamienić w pliku. Tutaj numeracja specjalnie od 001, żeby łatwiej było zamieniać.

W poniższych wyrażeniach było poprzednio in (%S). Teraz zamieniłem to na in ("%S"), ale testy dopiero trwają…

menu001=-__FileDate
menu002=For selection - synchronization of dates as in the 2nd panel
cmd002=cmd
param002=/k for %%G in ("%S") do py "%%FileDate%%\examples\copyFileDate.py" "%T%%~G" %%G
menu003=Date synchronization *.* (recurs.) as in the 2nd panel
cmd003=cmd
param003=/k py "%%FileDate%%\examples\copyAllDatesFromDir_recursive.py" "%T:~0,-1" "%P:~0,-1"
menu004=For selection - dates from names
cmd004=cmd
param004=/k for %%G in ("%S") do py "%%FileDate%%\examples\setDateFromName.py" %%G
menu005=Dates from names - *.* (recurs.)
cmd005=cmd
param005=/k py "%%FileDate%%\examples\setDatesFromNames_recursive.py" "%P:~0,-1"
menu006=For selection - dates from metadata
cmd006=cmd
param006=/k for %%G in ("%S") do py "%%FileDate%%\examples\setDateFromMetadata.py" %%G
menu007=Dates from metadata *.* (recurs.)
cmd007=cmd
param007=/k py "%%FileDate%%\examples\setDatesFromMetadata_recursive.py" "%P:~0,-1"
menu008=Date of folders on dates below it *.* (recurs.)
cmd008=cmd
param008=/k py "%%FileDate%%\examples\setFolderDates_recursive.py" "%P:~0,-1"
menu009=Date of folders on dates below it *.* (recurs.); remove empty
cmd009=cmd
param009=/k py "%%FileDate%%\examples\setFolderDates_recursive.py" "%P:~0,-1" -e
menu010=For selection - date from file in the 2nd panel
cmd010=cmd
param010=/k for %%G in ("%S") do py "%%FileDate%%\examples\copyFileDate.py" %T%M %%G
menu011=robocopy (rekurs.) - copy OLDER dates from the 2nd panel
cmd011=cmd
param011=/k robocopy /e /xn /timfix /copy:t /dcopy:t "%T." "%P."
menu012=--

.


  • Konwersja plików (i pakowanie)

Konwersja wideo do h264:

menu001=-__ffmpeg
menu002=ffmpeg: zaznaczenie --> x264
cmd002=cmd
param002=/k for %%G in ("%S") do ( ffmpeg.exe -i %%G -c:v libx264 -crf 23 -preset slow -map_metadata 0 %%G.mp4 )
menu003=ffmpeg: zaznaczenie --> x264 i zachowaj datę
cmd003=cmd
param003=/k for %%G in ("%S") do ( ffmpeg.exe -i %%G -c:v libx264 -crf 23 -preset slow -map_metadata 0 %%G.mp4 && py "%%FileDate%%\examples\copyFileDate.py" %%G %%G.mp4 )

Można też potem zbiorczo ustawić daty plików z metadanych (zob. wyżej).
W przypadku, gdy metadane pliku nie zawierają daty, to data pliku się nie zmieni.
Gdy -crf 20 - wyższa jakość (i większe pliki).
Gdy jesteśmy pewni, że strumień audio jest zgodny z kontenerem MP4 to można go kopiować: -c:a copy. W układzie jak teraz strumień audio jest konwertowany.
Na razie podczas konwersji w tych warunkach można uzyskać zwykle znacznie mniejszy plik wynikowy. Ale można też uzyskać większy (niestety). Może jeszcze dodawać pożądany bitrate, np. -b:v 5M?

Zmniejszanie plików JPG (z transferem metadanych EXIF i daty pliku):

ffmpeg nieźle zmniejsza rozmiar JPG. Aby przenieść metadane do nowego pliku trzeba chyba użyć ExifTool.

Przykład dla plików *.jpg w wybranym folderze, gdy wynik jest w folderze “mniejsze”

for %%F in (*.jpg) do (
  ffmpeg.exe -i "%%F" -q:v 10 "mniejsze/%%F"
  ExifTool.exe -overwrite_original -tagsfromfile "%%F" -exif "mniejsze/%%F"
  py "%%FileDate%%\examples\copyFileDate.py" "%%F" "mniejsze/%%F" )
)

Choć zdania na temat jakości konwersji JPG za pomocą FFMPEG są podzielione. Zob. też Hurtowe zmniejszanie dużych obrazów *.jpg z użyciem IrfanCiew.

Instalacja ExifTool jest trochę nietypowa:

  1. Po wypakowaniu “exiftool-13.29…zip” z https://exiftool.org/

  2. kopiuj “ExifTool(-k).exe” oraz folder “exiftool_files" do miejsca, które występuje w ścieżce w PATH.

  3. Skopiuj “ExifTool(-k).exe” na “ExifTool.exe”

Tu rozbudowany skrypt mp4.cmd do przetwarzania wszystkich plików wideo w folderze: …
@echo off
chcp 65001 >nul
:: Przetwarza przez FFPEG filmy folderze podanym jako parametr na x264 .MP4
:: Sprawdza, czy plik przetworzony jest mniejszy niż 3/4 źródłowego.
:: Jeśli tak to podmienia go. Plik przetworzony ma maskę: *.???.mp4
:: Pliki większe (źródłowe albo przetworzone) są na koniec w folderze "_big$".
:: Pomija już opracowane foldery, w których jest ".\_big$"
:: i nie przetwarza wewnątrz "_big$" ani "_tmp$"
echo:
echo ---"%~dp1"---
set "_dN=%~nx1"
echo --------"%_dN%"
if "%_dN%" EQU "_big$" ( goto :eof )
if "%_dN%" EQU "_tmp$" ( goto :eof )
pushd %1
if exist .\_big$ ( goto :end )
echo konwersja w:  ++++"%cd%"
set "crf=23"
mkdir _tmp$
mkdir _big$
for %%G in (*.*) do ( call :subroutine "%%~G" "_tmp$\%%~G.mp4" )
rd _tmp$
GOTO :end
:: W rozmiarze są wycinane 3 cyfry od końca, żeby zadziało set/a dla plików większych od 2GB.
:subroutine
  set "_s1_=%~z1"
  set "_s1=%_s1_:~0,-3%"
  echo %1 (%_s1% k) --^> %2
  echo:

  ffmpeg.exe -i %1 -v quiet -stats -c:v libx264 -crf %crf% -preset slow -map_metadata 0 %2
  if errorlevel 1 ( EXIT /B )
:: To jeśli chcemy, żeby data była jak źródłowego
    py "%FileDate%\examples\copyFileDate.py" %1 %2
    set "_s2_=%~z2"
    set "_s2=%_s2_:~0,-3%"
    echo %_s1% #kB# %_s2%
    set /a "_s34=%_s1%*3/4"
    echo %_s34% ?^>=? %_s2%
    if %_s34% GEQ %_s2% (
      echo move %1 _big$
      move %1 _big$
      move %2 .
    ) else (
      echo move %2 _big$
      move %2 _big$
    )
  EXIT /B

:end
popd
Tu nakładka mp4_r.cmd która wywołuje powyższy skrypt rekurencyjnie we wszystkich podfolderach: …
@echo off
chcp 65001 >nul
powercfg /change standby-timeout-ac 0
pushd %cd%
FOR /D /R %%G in (*.*) DO (
  call f:\Tools\bin\mp4.cmd "%%G"
)
popd
:: gdy są do przetworzenia filmy także w głównym folderze:
call f:\Tools\bin\mp4.cmd "%cd%"
powercfg /change standby-timeout-ac 20
echo:
echo =================== KONIEC ===================
timeout /t 10

.


.

menu001=-__pandoc
menu002=plik -> (pl).docx
cmd002=cmd
param002=/k pandoc %N -o %N.docx --verbose -V lang=pl
menu003=plik -> (+MD.img).md
cmd003=cmd
param003=/k pandoc %N -o %N.md --verbose -t gfm --extract-media=./MD.img/ --lua-filter %%AppData%%/pandoc/img_style_width.lua
menu004=plik - > 1_...MD
cmd004=cmd
param004=/k pandoc %N -o 1_%N.md --verbose -t gfm --lua-filter %%AppData%%/pandoc/img_style_width.lua
menu005=plik -> HTML
cmd005=cmd
param005=/k pandoc -i %N -o %N.html --standalone -H %%appdata%%/pandoc/markdown-v.head.html -M lang=pl
menu006=plik -> 1_...HTML
cmd006=cmd
param006=/k pandoc -i %N -o 1_%N.html --embed-resources -H %%appdata%%/pandoc/markdown-v.head.html -M lang=pl
menu007=--

Wypakuj plik markdown-v.head.html.zip do foldera %appdata%\pandoc\
Jest to styl skopiowany z wtyczki “Markdown Viewer” dla Edge, który będzie wklejany do nagłówka HTML.

Uwaga: w paczkach md-it.cmd.zip i markdown-v.head.html.zip przed 2025-02-20 był błąd wielkości czcionki dla h3 - było 1.4px, a powinno być 1.4em.

W tym pliku ZIP zawarty jest też img_style_width.lua

%AppData%/pandoc/img_style_width.lua - zob. https://github.com/jgm/pandoc/issues/9032 :

-- pandoc --lua-filter for markdown size attributes as {style="width:... instead of {width="...
-- written by novice pandoc user - don't rely too much on it
if FORMAT:match 'markdown' then
  function Image(el)
    el.attributes.style = (el.attributes.style or '') .. 
      ' width:' ..   (el.attributes.width or 'auto') .. 
      '; height:' .. (el.attributes.height or 'auto') .. ';'
    el.attributes.width = nil
    el.attributes.height = nil
    return el
  end
end

.


.

Można używać tej biblioteki do uzyskania skrajnie prostego HTML z DOCX.

Z paczki mammothH.zip wypakuj do foldera %appdata%\mmth\ plik

mammothH.py
Opcjonalny plik testowy mm_test.docx można pominąć
import os
import shutil
import argparse
import mammoth # pip install mammoth

def cli_args():
  parser = argparse.ArgumentParser(
    usage='python mammothH.py FILE.DOCX',
    description=f'''DOCX -> HTML (mammoth + HTML head)''',)
  parser.add_argument('input_file')
  parser.add_argument('-o', '--output',
                 help='or default FILE.docx_.HTML')
  parser.add_argument('-i', '--img-dir', default='',
                 help='directory for image files or (default) images are included inline in HTML')
  parser.add_argument('-l', '--lang', default='pl-PL', help='e.g.: "pl-PL" (default)')
  parser.add_argument('-s', '--td_style', nargs='+',  default=(':nth-child(1)','color: DarkMagenta;', ':nth-child(3n+4)','color: Blue;'),
                 help='td_sel1, style1, ... e.g.: --td_style ":nth-child(1)" "color: DarkMagenta;" ":nth-child(3n+4)" "color: Blue;"' )
  return parser.parse_args()

def main ():
  args=cli_args() ; print(f'{args=}') #$# py 3.8+
  out_suffix='._.html' #to add if not --output
  output_file = args.output or f'{args.input_file}{out_suffix}' ; print(f'{output_file=}') #$#
  if not args.img_dir:
    convert_image = None
  else:
    if not os.path.exists(args.img_dir):
      os.makedirs(args.img_dir) ; print(f'os.makedirs {args.img_dir}') #$#
    convert_image = mammoth.images.img_element(ImageWriter(args.img_dir))
  tdSel_style = list(zip(args.td_style[::2], args.td_style[1::2])) if args.td_style else [] \
    ; print(f'{tdSel_style=}') #$#
  
  messages = docx_to_html(args.input_file, output_file, args.lang, convert_image, tdSel_style)
  print(f'{messages=}\n.')

def docx_to_html(input_file, output_file, lang='', convert_image=None, tdSel_style=[]):
  with open(input_file, "rb") as docx_file:
    
    result = mammoth.convert_to_html(docx_file, convert_image=convert_image)
    
    html = (f'''<!DOCTYPE html><html><head><meta charset="utf-8"/>
<style>
 body {{ font-family: "Segoe UI","Noto Sans",Helvetica,Arial,sans-serif; }}
 {' '.join([f'td{selector}, th{selector} {{{style}}}' for (selector,style) in tdSel_style])}
 table {{border-collapse: collapse; }}
 th, td {{border: 1px solid grey; font-size: 0.85em; padding:2px;}}
 td p {{margin: 0px;}}
</style>
<title>{output_file}</title>
</head><body{f' lang="{lang}"' if lang else ''}> 
{result.value}
</body></html>
''') 

    with open(output_file, "w", encoding="utf-8") as f: 
      f.write(html)
  return result.messages

class ImageWriter(object):
# Python___\Lib\site-packages\mammoth\cli.py
  def __init__(self, output_dir):
    self._output_dir = output_dir
    self._image_number = 1
  def __call__(self, element):
    extension = element.content_type.partition("/")[2]
    image_filename = f"{self._image_number}.{extension}"
    img_path = os.path.join(self._output_dir, image_filename)
    with open(img_path, "wb") as image_dest:
      with element.open() as image_source:
        shutil.copyfileobj(image_source, image_dest)
    self._image_number += 1
    return {"src": img_path}

if __name__ == "__main__":
  main ()
Wiersz cmd: python mammothH.py FILE.DOCX
DOCX -> HTML (mammoth + HTML head)
usage: python mammothH.py FILE.DOCX

options:
  -h, --help    show this help message and exit
  -o OUTPUT, --output OUTPUT
                or default FILE.docx_.HTML
  -i IMG_DIR, --img-dir IMG_DIR
                directory for image files or (default) images are included inline in HTML
  -l LANG, --lang LANG  e.g.: "pl-PL" (default)
  -s TD_STYLE [TD_STYLE ...], --td_style TD_STYLE [TD_STYLE ...]
     e.g.: --td_style ":nth-child(1)" "color: DarkMagenta;" ":nth-child(3n+4)" "color: Blue;"

.

menu001=-__mammoth docx->html
menu002=docx -> html
cmd002=cmd
param002=/k py %%AppData%%/mmth/mammothH.py %N
menu003=docx -> html (+d.img)
cmd003=cmd
param003=/k py %%AppData%%/mmth/mammothH.py %N --img-dir d.img
menu004=--

.


.

menu001=-ExifDate
menu002=ExifDate z daty pliku (zaznaczenie)
cmd002=exiftool.exe
param002=-k -P "-DateTimeOriginal<FileModifyDate" -if "$exif:DateTimeOriginal" %S
menu003="ExifDate (TWORZONE!) z daty pliku (zaznaczenie) "
cmd003=exiftool.exe
param003=-k -P "-DateTimeOriginal<FileModifyDate" %S
menu004=ExifDate do daty pliku (zaznaczenie)
cmd004=exiftool.exe
param004=-k -P "-exif:DateTimeOriginal>FileModifyDate" -if "$exif:DateTimeOriginal" %S
menu005=--

.


.

  • mklink
menu001=echo mklink /d (1 folder w drugim oknie)
cmd001=cmd
param001=/k echo "::copy&AdmRun:: cd %P && mklink /d %M %T%M ::"